001    
002    package org.objectweb.jac.core.dist;
003    
004    import java.lang.reflect.Field;
005    import java.util.Hashtable;
006    
007    import org.objectweb.jac.core.rtti.ClassRepository;
008    
009    public class ObjectState {
010    
011       public static Field[] getFields(Object object) {
012          
013          Hashtable fields = ClassRepository.getDirectFieldAccess(object.getClass());
014          Object[] res = fields.values().toArray();
015          Field[] ares = new Field[res.length];
016          System.arraycopy ( res, 0, ares, 0, ares.length );
017          return ares;
018    
019       }         
020    
021       public static Field getField(Object object,String name) {
022    
023          Hashtable fields = ClassRepository.getDirectFieldAccess(object.getClass());
024          return (Field) fields.get(name);
025    
026       }
027    
028       public static Object getFieldValue (Object substance,String fieldName) {      
029          Hashtable ht = ClassRepository.getDirectFieldAccess(substance.getClass());
030          Field field = (Field) ht.get(fieldName);
031          if ( field == null ) return null;
032          Object ret = null;
033          try {
034             ret = field.get(substance);
035          } catch ( Exception e ) {}
036          return ret;
037       }
038    
039       public static Object[] getState (Object substance) {
040    
041          Hashtable fields = ClassRepository.getDirectFieldAccess(substance.getClass());
042          Object[] tmp = fields.keySet().toArray();
043          String[] names = new String[tmp.length];
044          System.arraycopy( tmp, 0, names, 0, tmp.length );
045          Object[] values = new Object[tmp.length];
046          for ( int i = 0; i < names.length; i ++ ) {
047             Field f = (Field) fields.get ( names[i] );
048             try {
049                values[i] = f.get(substance);
050             } catch ( Exception e ) {}
051          }
052    
053          return new Object[] { names, values };
054       }
055    
056       public static Object[] getState (Object substance,String[] fieldNames) {
057    
058          Hashtable tmpfields = ClassRepository.getDirectFieldAccess(substance.getClass());
059          Hashtable fields = new Hashtable();
060          for ( int i = 0; i < fieldNames.length; i ++ ) {
061             Field f = (Field) tmpfields.get( fieldNames[i] );
062             if ( f != null ) {
063                fields.put( fieldNames[i], f );
064             }
065          }
066          Object[] tmp = fields.keySet().toArray();
067          String[] names = new String[tmp.length];
068          System.arraycopy( tmp, 0, names, 0, tmp.length );
069          Object[] values = new Object[tmp.length];
070          for ( int i = 0; i < names.length; i ++ ) {
071             Field f = (Field) fields.get ( names[i] );
072             try {
073                values[i] = f.get(substance);
074             } catch ( Exception e ) {}
075          }
076    
077          return new Object[] { names, values };
078       }
079    
080       public static void setState (Object substance, Object[] state ) {
081    
082          Hashtable fields = ClassRepository.getDirectFieldAccess(substance.getClass());
083          String[] names = (String[])state[0];
084          Object[] values = (Object[])state[1];
085          for ( int i = 0; i < names.length; i ++ ) {
086             Field f = (Field) fields.get ( names[i] );
087             try {
088                f.set(substance,values[i]);
089             } catch ( Exception e ) {}
090          }
091       }
092    
093       public static void setFieldValue (Object substance, String fieldName, Object value) {
094          Hashtable ht = ClassRepository.getDirectFieldAccess(substance.getClass());
095          Field field = (Field) ht.get( fieldName );
096          if ( field == null ) return;
097          try {
098             field.set(substance, value);
099          } catch ( Exception e ) {}
100       }
101    
102    }