00001
00005 package edu.mit.csail.sdg.squander.serializer.special;
00006
00007 import java.util.HashSet;
00008 import java.util.LinkedList;
00009 import java.util.List;
00010 import java.util.Set;
00011
00012 import edu.mit.csail.sdg.squander.absstate.FieldValue;
00013 import edu.mit.csail.sdg.squander.absstate.ObjTuple;
00014 import edu.mit.csail.sdg.squander.absstate.ObjTupleSet;
00015 import edu.mit.csail.sdg.squander.spec.ClassSpec;
00016 import edu.mit.csail.sdg.squander.spec.JField;
00017 import edu.mit.csail.sdg.squander.spec.JavaScene;
00018
00024 public class SetSer implements IObjSer {
00025
00026 public static final String DATA = "elts";
00027 public static final String LENGTH = "length";
00028
00029 @Override
00030 public boolean accepts(Class<?> clz) {
00031 return Set.class.isAssignableFrom(clz);
00032 }
00033
00034 @SuppressWarnings("unchecked")
00035 @Override
00036 public Set newInstance(Class<?> cls) {
00037 return new HashSet();
00038 }
00039
00040 @SuppressWarnings("unchecked")
00041 @Override
00042 public List<FieldValue> absFunc(JavaScene javaScene, Object obj) {
00043 ClassSpec cls = javaScene.classSpecForObj(obj);
00044 List<FieldValue> result = new LinkedList<FieldValue>();
00045 Set set = (Set) obj;
00046
00047 JField dataField = cls.findField(DATA);
00048 if (dataField != null) {
00049 FieldValue fvElems = new FieldValue(dataField, 2);
00050 for (Object elem : set) {
00051 fvElems.addTuple(new ObjTuple(obj, elem));
00052 }
00053 result.add(fvElems);
00054 }
00055
00056 JField lenField = cls.findField(LENGTH);
00057 if (lenField != null) {
00058 FieldValue fvLen = new FieldValue(lenField, 2);
00059 fvLen.addTuple(new ObjTuple(obj, set.size()));
00060 result.add(fvLen);
00061 }
00062 return result;
00063 }
00064
00065 @Override
00066 public Object concrFunc(Object obj, FieldValue fieldValue) {
00067 String fldName = fieldValue.jfield().name();
00068 if (DATA.equals(fldName))
00069 return restoreElems(obj, fieldValue);
00070 else if (LENGTH.equals(fldName))
00071 return restoreLength(obj, fieldValue);
00072 else
00073 throw new RuntimeException("Unknown field name for Java Set: " + fldName);
00074 }
00075
00076 @SuppressWarnings("unchecked")
00077 private Object restoreElems(Object obj, FieldValue fieldValue) {
00078 ObjTupleSet value = fieldValue.tupleSet();
00079 assert value.arity() == 2;
00080 Set set = (Set) obj;
00081 set.clear();
00082 for (ObjTuple ot : value)
00083 set.add(ot.get(1));
00084 return set;
00085 }
00086
00087 private Object restoreLength(Object obj, FieldValue fldVal) {
00088 return obj;
00089 }
00090 }