00001
00002 package gridlabd;
00003
00004 import java.util.Hashtable;
00005 import java.util.Enumeration;
00006
00012 public class GClass{
00013 private String classname;
00014 private int synctype;
00015 private long classaddr;
00016 private long modaddr;
00017 private boolean inUse;
00018 private long size;
00019 private Hashtable<String, GProperty> proptable;
00020 private Hashtable<Long, GObject> objtable;
00021
00022
00023 private GClass(String cname, long caddr, long maddr, int sync){
00024 classname = new String(cname);
00025 classaddr = caddr;
00026 modaddr = maddr;
00027 synctype = sync;
00028 proptable = new Hashtable<String, GProperty>();
00029 objtable = new Hashtable<Long, GObject>();
00030 }
00040 public static GClass BuildClass(String classname, GModule mod, int sync){
00041 long classaddr = GridlabD.register_class(mod.GetAddr(), classname, sync);
00042 if(classaddr == 0){
00043 GridlabD.error("register_class("+mod.GetAddr()+", "+classname+", "+sync+") failed");
00044 return null;
00045 }
00046 GClass gc = new GClass(classname, classaddr, mod.GetAddr(), sync);
00047 mod.AddClass(gc);
00048 return gc;
00049 }
00054 public void PutObj(GObject obj){
00055 if(!objtable.containsKey(obj.GetAddr())){
00056 objtable.put(new Long(obj.GetAddr()), obj);
00057 }
00058 }
00059
00060 public String GetClassname(){return new String(classname);}
00061 public long GetClassAddr(){return classaddr;}
00062 public long GetModuleAddr(){return modaddr;}
00063 public int GetSyncType(){return synctype;}
00064 public boolean isInUse(){return inUse;}
00065 public long GetSize(){return size;}
00066 public boolean hasProperty(String pname){
00067 return proptable.containsKey(pname);
00068 }
00074 public GProperty findProperty(String pname){
00075 return proptable.get(pname);
00076 }
00083 public boolean hasObject(Long addr){
00084 return objtable.containsKey(addr);
00085 }
00086 public Object getObject(Long addr){
00087 return objtable.get(addr);
00088 }
00097 public GProperty AddProperty(String pname, String ptype){
00098 if(inUse){
00099 GridlabD.error("Class "+classname+" is in use, ignoring AddProperty attempt");
00100 return null;
00101 }
00102 GridlabD.verbose(classname+".AddProperty("+pname+", "+ptype+")");
00103 long offset = 0;
00104 for(Enumeration<GProperty> e = proptable.elements(); e.hasMoreElements();){
00105 Long ov = e.nextElement().GetSize();
00106 offset += ov.longValue();
00107 }
00108 GridlabD.verbose("\toffset = "+offset);
00109 if(proptable.containsKey(pname)){
00110 GridlabD.error("Property \""+pname+"\" already exists");
00111 return null;
00112 }
00113 long psize = GridlabD.publish_variable(modaddr, classaddr, pname, ptype, offset);
00114 if(0 == psize){
00115 GridlabD.error("Unable to GridlabD.publish_variable("+modaddr+", "+classaddr+", "+pname+", "+ptype+", "+offset+")");
00116 }
00117 GProperty p = GProperty.Build(pname, ptype, offset, psize);
00118 if(p == null){
00119 GridlabD.error("Unable to GProperty.Build("+pname+", "+ptype+", "+offset+", "+psize+")");
00120 return null;
00121 }
00122 proptable.put(pname, p);
00123 size = offset + psize;
00124 return p;
00125 }
00126
00127
00128
00129 private native int _GetID(long oaddr);
00130 private native long _GetOClass(long oaddr);
00131 private native long _GetNext(long oaddr);
00132 private native String _GetName(long oaddr);
00133 private native long _GetParent(long oaddr);
00134 private native void _SetParent(long oaddr, long addr);
00135 private native int _GetRank(long oaddr);
00136 private native long _GetClock(long oaddr);
00137 private native double _GetLatitude(long oaddr);
00138 private native double _GetLongitude(long oaddr);
00139 private native long _GetInSvc(long oaddr);
00140 private native long _GetOutSvc(long oaddr);
00141 private native long _GetFlags(long oaddr);
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171 }