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 }