if (clientfile==null) {
log.debug("Initializing clientfile Watcher");
clientfile = session.getClientWatcherElement();
- clientfile.setHandler(new WatcherCallBack() {
+ // handler is set in the Vamsas session
+/* clientfile.setHandler(new WatcherCallBack() {
public boolean handleWatchEvent(WatcherElement watcher, Lock lock) {
- // TODO Auto-generated method stub
return clientListChanged(watcher, lock);
}
- });
+ });*/
watchThread.addElement(clientfile);
}
final EventGeneratorThread evgen=this;
*/
log.debug("Watchers inited.");
}
- void _raise(String handlerEvent, String property, Object oldval, Object newval) {
+ /**
+ * Call registered handlers for a vamsas session event
+ * @param handlerEvent a named event
+ * @param property property name to pass to handler
+ * @param oldval old value of property to pass
+ * @param newval new value of property to pass
+ * @return true if event generation did not raise any exceptions.
+ */
+ boolean _raise(String handlerEvent, String property, Object oldval, Object newval) {
PropertyChangeSupport h = (PropertyChangeSupport) handlers.get(handlerEvent);
if (h!=null) {
log.debug("Triggering:"+handlerEvent);
- h.firePropertyChange(property, oldval, newval);
+ try {
+ h.firePropertyChange(property, oldval, newval);
+ } catch (Exception e) {
+ log.warn("Client Exception during handling of "+handlerEvent, e);
+ return false;
+ }
+ catch (Error e)
+ {
+ log.error("Serious! Client Error during handling of "+handlerEvent, e);
+ return false;
+ }
log.debug("Finished :"+handlerEvent);
} else
log.debug("No handlers for raised "+handlerEvent);
+ return true;
}
protected boolean storeDocRequest(Lock lock) {
if (log.isDebugEnabled())
boolean continueWatching=true;
if (!block_document_updates) {
session.vamArchive.fileLock=doclock;
+ if (client.pickmanager!=null)
+ client.pickmanager.setPassThru(false);
+ if (log.isDebugEnabled()) {
+ log.debug("Initiating a documentChanged event. Document is "+(client.cdocument==null ? "closed" : "open"));
+ }
// TODO: decide if individual object update handlers are called as well as overall event handler
- _raise(Events.DOCUMENT_UPDATE, client.getSessionUrn(), null, client);
+ if (!_raise(Events.DOCUMENT_UPDATE, client.getSessionUrn(), null, client))
+ {
+ log.info("Recovering from errors or exceptions generated by client application");
+ if (client.cdocument!=null)
+ {
+ try {
+ client.tidyAwaySessionDocumentState();
+ }
+ catch (Exception e)
+ {
+ log.warn("Exception generated by vamsas library - when tidying away session document:",e);
+ }
+ catch (Error e)
+ {
+ log.error("LIBRARY Implementation error - when tidying away session document:",e);
+ }
+ }
+
+ }
+ if (client.pickmanager!=null)
+ client.pickmanager.setPassThru(true);
if (log.isDebugEnabled()) {
log.debug("Finished handling a documentChanged event. Document is "+(client.cdocument==null ? "closed" : "open"));
}
+ if (client.cdocument!=null)
+ {
+ log.warn("Implementation Error ? ClientDocument instance has not been closed or updated by handler!");
+ }
/*try {
client._session.getVamsasDocument().closeArchive();
} catch (Exception e) {log.warn("Unexpected exception when closing document after update.",e);};
}
boolean ownsf = false;
/**
+ * Moved to SimpleClientSessionManager
* scans all watchers and fires changeEvents if necessary
* @return number of events generated.
*/
* others).
public static final String CLIENT_FINALIZATION = "uk.ac.vamsas.client.events.clientFinalizationEvent";
*/ // again - as the test.
+ watchlock.release();
}
return true;
}
public void interruptWatching() {
if (watchThread!=null && watchThread.isAlive())
+ {
+ // TODO: find a way of interrupting watcher in a way that prevents file IO being interrupted
watchThread.interrupt();
+ }
}
/**