super();
testInstanceForIdField();
}
+ /**
+ * Override Object.hashCode with base value for castor generated object hashcodes.
+ */
+ public int hashCode() {
+ return 17;
+ }
java.lang.reflect.Field ___id_field=null; // set to ease pain of reflection
/**
* set the isRegisterable flag based on the presence of a 'private String _id' field in
}
return null;
}
-
+ /**
+ * calls the castor-generated hashCode() method
+ * @return
+ */
+ protected int __callHash() {
+ try {
+ Method fd = this.getClass().getMethod("hashCode", (Class[]) null);
+ Object hashvalue = fd.invoke((Object) this, (Object[]) null);
+ if (log.isDebugEnabled())
+ log.debug(this.getClass().getName()+" called hashCode()!");
+ if (hashvalue!=null && hashvalue instanceof Integer) {
+ return ((Integer) hashvalue).intValue();
+ }
+ } catch (InvocationTargetException e) {
+ log.error("SourceGeneration of "
+ + this.getClass().toString()
+ + "\n has resulted in an inaccessible 'hashCode' method!\nHave you set org.exolab.castor.builder.equalsmethod=true in castorbuilder.properties ?.", e);
+ }
+ catch (IllegalAccessException e) {
+ log.error("SourceGeneration of "
+ + this.getClass().toString()
+ + "\n has resulted in an inaccessible 'hashCode' method!\nHave you set org.exolab.castor.builder.equalsmethod=true in castorbuilder.properties ?.", e);
+ } catch (SecurityException e) {
+ log.error("Security access violation for "+this.getClass().toString(),e);
+ } catch (NoSuchMethodException e) {
+ log.warn(this.getClass().toString()+" was erroneously extending from a Vorba Vobject class (Implementation error? no hashCode() method)" +
+ "\nHave you set org.exolab.castor.builder.equalsmethod=true in castorbuilder.properties ?.", e);
+ }
+ return 0;
+ }
/**
* calculate a hash for the Vobject with all housekeeping fields at standard
* values. (isRegisterable is an immutable attribute property)
* @return true if new hash different to last hash (or first time its been computed)
*/
synchronized protected boolean doHash() {
+ boolean stored = __stored_in_document;
+ __stored_in_document=false;
+ boolean updated = __updated_since_last_read;
+ __updated_since_last_read=false;
+ boolean added_since=__added_since_last_read;
+ __added_since_last_read=false;
long __old_hash = __last_hash;
__last_hash = 0;
+ // leave registerable - doesn't change
+ boolean visited = __visited;
+ __visited=false;
Vobject _V_parent=V_parent;
V_parent=null;
VorbaId thisid = vorbaId;
+ vorbaId = null;
IVorbaIdFactory factory = __vorba;
- boolean stored = __stored_in_document;
- boolean updated = __updated_since_last_read;
- boolean visited = __visited;
+ __vorba = null;
java.lang.reflect.Field idfield = ___id_field;
___id_field=null;
- __updated_since_last_read=false;
- __stored_in_document=false;
- boolean added_since=__added_since_last_read;
- __added_since_last_read=false;
long l_hash = __l_hash;
__l_hash = 0;
- vorbaId = null;
- __vorba = null;
- __visited=false;
// compute hash
- __last_hash = this.hashCode();
+ __last_hash = __callHash();
// reset houseskeeping variables
___id_field=idfield;
vorbaId = thisid;
*/
protected void set__stored_in_document(boolean __stored_in_document) {
this.__stored_in_document = __stored_in_document;
+ if(__stored_in_document && log.isDebugEnabled())
+ log.debug("Retrieved document object: "+this.getVorbaId());
}
/**
*/
protected void set__added_since_last_read(boolean __added_since_last_read) {
this.__added_since_last_read = __added_since_last_read;
+
+ if(__added_since_last_read && log.isDebugEnabled())
+ log.debug("New object in document: "+this.getVorbaId());
}
/**
*
* @return Returns the __last_hash.
*/
- public int get__last_hash() {
+ public long get__last_hash() {
return __last_hash;
}
XMLClassDescriptorImpl descimpl = null;
try {
// castor descriptor resolver magic
- descriptor = this.getClass().getClassLoader().loadClass(this.getClass().getName()+"Descriptor");
+ StringBuffer desname = new StringBuffer(this.getClass().getName());
+ desname.insert(desname.lastIndexOf("."), ".descriptors");
+ desname.append("Descriptor");
+ descriptor = this.getClass().getClassLoader().loadClass(desname.toString());
descimpl = (XMLClassDescriptorImpl) descriptor.getConstructor((Class[])null).newInstance((Object[])null);
} catch (Exception e) {
log.fatal("Source Generation Error!: Couldn't resolve descriptor for "
*\r
*/\r
public class Vobjhash {\r
- long hashvalue;\r
+ private static org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(Vobjhash.class); \r
+ long hashvalue;\r
/**\r
* creates a record of the hash value for a vamsas document object\r
* @param tobemarshalled\r
*/\r
public Vobjhash(Vobject tobemarshalled) {\r
- hashvalue = tobemarshalled.__getLHash();\r
+ tobemarshalled.doHash();\r
+ hashvalue = tobemarshalled.get__last_hash();\r
+ if (log.isDebugEnabled())\r
+ log.debug(tobemarshalled.getVorbaId()+":"+hashvalue);\r
}\r
/**\r
* compares the old hash value with the unmarshalled object's most recently computed hash value and updates internal record.\r
*/\r
public boolean isUpdated(Vobject unmarshalled) {\r
long oldhash = hashvalue;\r
- hashvalue=unmarshalled.__getLHash();\r
+ unmarshalled.doHash();\r
+ hashvalue=unmarshalled.get__last_hash();\r
+ if (log.isDebugEnabled() && oldhash!=hashvalue)\r
+ log.debug(" has changed."+unmarshalled.getVorbaId());\r
return oldhash!=hashvalue;\r
}\r
}\r
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
-import uk.ac.vamsas.client.utils.ChecksummedReader;
import uk.ac.vamsas.objects.core.VamsasDocument;
/**
* Implements the Vamsas Vobject ID machinery for translating
private final Hashtable oldobjhashes;
private final Hashtable objrefs;
private final Vector updatedobjs; // not yet used elswhere ?
- private final ChecksummedReader inStream;
- public VorbaXmlBinder(IVorbaIdFactory vorbafactory, Vector obj, Hashtable objrefs, Hashtable oldobjhashes, Vector updatedobjs) {
- this(vorbafactory, obj, objrefs, oldobjhashes, updatedobjs, null);
-
- }
-
- public VorbaXmlBinder(IVorbaIdFactory vorbafactory2, Vector unrefedObj, Hashtable objrefs2, Hashtable oldobjhashes, Vector updatedObj, ChecksummedReader ckedInstream) {
- this.inStream = ckedInstream;
+ public VorbaXmlBinder(IVorbaIdFactory vorbafactory2, Vector unrefedObj, Hashtable objrefs2, Hashtable oldobjhashes, Vector updatedObj) {
this.vorbafactory = vorbafactory2;
this.obj = unrefedObj;
this.objrefs = objrefs2;
public void initialized(Object object) {
if (object instanceof Vobject) {
Vobject nobj = (Vobject) object;
- if (nobj.isRegisterable() && nobj.___id_field!=null && inStream!=null)
- nobj.__setInitHash(inStream.getChecksum()); // record start tag position
}
}
nobj.set__stored_in_document(true);
try {
if (nobj.isRegisterable() && nobj.___id_field!=null) {
- if (inStream!=null)
- nobj.__setFinalHash(inStream.getChecksum()); // compute LHash as difference between end and start tag positions
VorbaId nobj_id=null;
// look for the id field (should be an NCName string)
nobj.__vorba = vorbafactory;
// TODO: add to list of objects without a valid vorbaId
obj.add(nobj);
}
- nobj.doHash(); // TODO: DECIDE IF WE NEED TO DO THIS STILL: THIS DOESNT WORK! updates detected by comparing with last hash when marshalling
-
+ nobj.doHash(); // updates detected by comparing with last hash when marshalling
// check to see if new object was present in old object hash
if (nobj_id!=null) {
if (oldobjhashes.containsKey(nobj_id)) {
if (oldhash.isUpdated(nobj)) {
// mark the object as updated in this document read.
nobj.set__updated_since_last_read(true);
- oldobjhashes.put(nobj_id, new Vobjhash(nobj));
updatedobjs.addElement(nobj);
}
} else {
final VorbaIdFactory vorbafactory = factory;
final Vector unrefedObj = new Vector();
final Vector updatedObj = new Vector();
- ChecksummedReader ckedInstream = new ChecksummedReader(instream);
- unmarshaller.setUnmarshalListener(new VorbaXmlBinder(vorbafactory, unrefedObj, objrefs, oobjhashes,updatedObj, ckedInstream));
+ unmarshaller.setUnmarshalListener(new VorbaXmlBinder(vorbafactory, unrefedObj, objrefs, oobjhashes,updatedObj));
// Call the unmarshaller.
try {
while (instream.ready()) {
// TODO: mark objects in oobjhash prior to unmarshalling, to detect when objects have been lost through an update.
//tohere
- Object obj = unmarshaller.unmarshal(ckedInstream);
+ Object obj = unmarshaller.unmarshal(instream);
boolean sync=ensure_references(unrefedObj, objrefs);
if (!(obj instanceof Vobject))
return null;
return false;
}
Entry[] pe = p.getEntry();
- for (int i=0; i<pe.length; i++)
- outstr.println(pe[i].getDate()+"\t'"+pe[i].getUser()+"'\t"+pe[i].getApp()+"\t'"+pe[i].getAction()+"'");
+ for (int i=0; i<pe.length; i++) {
+ outstr.print(pe[i].getDate()+"\t'"+pe[i].getUser()+"'\t"+pe[i].getApp()+"\t'"+pe[i].getAction()+"' ");
+ outputVobjectState(pe[i], outstr);
+ }
return true;
}
public static boolean appDataEntryReport(AppData appD, VamsasArchiveReader archive, boolean cascade, PrintStream outstr) {
+((r.getId()!=null) ? r.getId():"<none>")
+") contains "+(ds=r.getDataSetCount())+" DataSets, "
+ (tr=r.getTreeCount())+" Global trees\n");
+ outputVobjectState(r, outstr);
if (cascade) {
for (int j=0; j<ds; j++) {
outstr.println("Dataset "+j);
}
return false;
}
+ public static void outputVobjectState(Vobject v, PrintStream outstr) {
+ outstr.print(" (Object is: ");
+ boolean comma=false;
+ if (v.is__stored_in_document()) {
+ outstr.print(" stored");
+ comma=true;
+ }
+ if (v.isNewInDocument()) {
+ if (comma)
+ outstr.print(",");
+ comma=true;
+ outstr.print(" new in document");
+ }
+ if (v.isUpdated()) {
+ if (comma)
+ outstr.print(",");
+ comma=true;
+ outstr.print(" updated since last read");
+ }
+ outstr.println(")");
+ }
public static boolean datasetReport(DataSet ds, boolean cascade, PrintStream outstr) {
if (cascade)
reportProvenance(ds.getProvenance(), outstr);
+ outputVobjectState(ds, outstr);
outstr.println("Dataset contains : "+ds.getSequenceCount()
+" sequences, "+ds.getAlignmentCount()+" alignments and "+ds.getTreeCount()+" trees.");
if (cascade)
if (al!=null && al.length>0) {
for (int i=0; i<al.length; i++) {
outstr.println("Alignment "+i+(al[i].isRegistered() ? " ("+al[i].getVorbaId()+")" : " (unregistered)"));
+ outputVobjectState(al[i], outstr);
if (cascade)
reportProvenance(al[i].getProvenance(), outstr);
outstr.println("Involves "+al[i].getAlignmentSequenceCount()+" sequences, has "
return val;
}
public static boolean treeReport(Tree t, boolean cascade, PrintStream outstr) {
- outstr.println("Tree: '"+t.getTitle()+"'");
+ outstr.print("Tree: '"+t.getTitle()+"' ");
+ outputVobjectState(t, outstr);
return !cascade || reportProvenance(t.getProvenance(), outstr);
}