import uk.ac.vamsas.client.UserHandle;
/**
- * Does all the IO operations for a SimpleClient instance accessing
- * a SimpleClient vamsas session.
+ * Does all the IO operations for a SimpleClient instance accessing a
+ * SimpleClient vamsas session.
*
- * Basically, it defines the various standard names for the files
- * in the session directory (that maps to the sessionUrn),
- * provides constructors for the file handlers and watchers of
- * those file entities, and some higher level methods
+ * Basically, it defines the various standard names for the files in the session
+ * directory (that maps to the sessionUrn), provides constructors for the file
+ * handlers and watchers of those file entities, and some higher level methods
* to check and change the state flags for the session.
*
- * TODO: move the stuff below to the SimpleClientFactory documentation.
- * much may not be valid now :
- * Vamsas client is intialised with a path to create live session directories.
- * This path may contain a vamsas.properties file
- * that sets additional parameters (otherwise client
- * just uses the one on the classpath).
+ * TODO: move the stuff below to the SimpleClientFactory documentation. much may
+ * not be valid now : Vamsas client is intialised with a path to create live
+ * session directories. This path may contain a vamsas.properties file that sets
+ * additional parameters (otherwise client just uses the one on the classpath).
*
- * A vamsas session consists of :
- * SessionDir - translates to urn of a live session.
- * Contains: Vamsas Document (as a jar), Session client list file,
- * both of which may be locked, and additional
- * temporary versions of these files when write
- * operations are taking place.
+ * A vamsas session consists of : SessionDir - translates to urn of a live
+ * session. Contains: Vamsas Document (as a jar), Session client list file, both
+ * of which may be locked, and additional temporary versions of these files when
+ * write operations are taking place.
*
- * Zip file entries
- * - vamsasdocument.xml : core info
- * one or more:
- * - <applicationname>.version.sessionnumber.raw (string given in vamsasdocument.xml applicationData entry)
- *
- * Lockfile
- * - filename given in the vamsasdocument.xml. Should be checked for validity by any client and rewritten if necessary.
- * The lockfile can point to the jar itself.
- * Mode of operation.
- * Initially - documentHandler either:
- * - creates a zip for a new session for the client
- * - connect to an existing session zip
- * 1. reads session urn file
- * 2. waits for lock
- * 3. examines session - decide whether to create new application data slice or connect to one stored in session.
- * 4. writes info into session file
- * 5. releases lock and generates local client events.
- * 6. Creates Watcher thread to generate events.
+ * Zip file entries - vamsasdocument.xml : core info one or more: -
+ * <applicationname>.version.sessionnumber.raw (string given in
+ * vamsasdocument.xml applicationData entry)
*
- * During the session
- * - Update watcher checks for file change -
+ * Lockfile - filename given in the vamsasdocument.xml. Should be checked for
+ * validity by any client and rewritten if necessary. The lockfile can point to
+ * the jar itself. Mode of operation. Initially - documentHandler either: -
+ * creates a zip for a new session for the client - connect to an existing
+ * session zip 1. reads session urn file 2. waits for lock 3. examines session -
+ * decide whether to create new application data slice or connect to one stored
+ * in session. 4. writes info into session file 5. releases lock and generates
+ * local client events. 6. Creates Watcher thread to generate events.
+ *
+ * During the session - Update watcher checks for file change -
+ *
+ * Procedures for file based session message exchange - session document
+ * modification flag
*
- * Procedures for file based session message exchange
- * - session document modification flag
- *
*/
public class VamsasSession {
/**
- * indicator file for informing other processes that
- * they should finalise their vamsas datasets for
- * storing into a vamsas archive.
+ * indicator file for informing other processes that they should finalise
+ * their vamsas datasets for storing into a vamsas archive.
*/
public static final String CLOSEANDSAVE_FILE = "stored.log";
/**
- * session file storing the last_stored_stat data
+ * session file storing the last_stored_stat data
*/
public static final String MODIFIEDDOC_FILE = "modified";
private SimpleSessionManager sessionManager = null;
/**
- * Count of cycles before considering the current client as the last one of the session (if no other client registered as active )
+ * Count of cycles before considering the current client as the last one of
+ * the session (if no other client registered as active )
*/
private final int watchCycleCountBeforeLastClient = 1220;
/**
- * time between checking
+ * time between checking
*/
public int WATCH_SLEEP = 30;
/**
* called to indicate session document has been modified.
- *
+ *
*/
protected void setUnsavedFlag() {
SessionFlagFile laststored = new SessionFlagFile(new File(sessionDir,
/**
*
- * @return true if session document has been modified since last offline storage event
+ * @return true if session document has been modified since last offline
+ * storage event
*/
protected boolean getUnsavedFlag() {
SessionFlagFile laststored = new SessionFlagFile(new File(sessionDir,
private static Log log = LogFactory.getLog(VamsasSession.class);
protected Logger slog = Logger.getLogger("uk.ac.vamsas.client.SessionLog");
+
/**
* the appender that writes to the log file inside the session's directory.
*/
- private FileAppender slogAppender=null;
+ private FileAppender slogAppender = null;
+
/**
* setup the sessionLog using Log4j.
+ *
* @throws IOException
*/
private void initLog() throws IOException {
// TODO: fix session event logging
// LATER: make dedicated appender format for session log.
- /*Appender app = slog.getAppender("log4j.appender.SESSIONLOG");
- // slog.addAppender(new FileAppender(app.getLayout(), new File(sessionDir, SESSION_LOG).getAbsolutePath()));
- // slog.addAppender(new FileAppender(app.getLayout(), new File(sessionDir, SESSION_LOG).getAbsolutePath()));
- for (Enumeration e = slog.getAllAppenders() ; e.hasMoreElements() ;) {
- System.out.println(e.nextElement());
-
- }*/
+ /*
+ * Appender app = slog.getAppender("log4j.appender.SESSIONLOG"); //
+ * slog.addAppender(new FileAppender(app.getLayout(), new File(sessionDir,
+ * SESSION_LOG).getAbsolutePath())); // slog.addAppender(new
+ * FileAppender(app.getLayout(), new File(sessionDir,
+ * SESSION_LOG).getAbsolutePath())); for (Enumeration e =
+ * slog.getAllAppenders() ; e.hasMoreElements() ;) {
+ * System.out.println(e.nextElement());
+ * }
+ */
if (slog != null) {
File sessionLogFile = new File(this.sessionDir, SESSION_LOG);
log.info("No appender for SessionLog");
}
}
+
private void closeSessionLog() {
- if (slog!=null)
- {
- if (slogAppender!=null)
- {
+ if (slog != null) {
+ if (slogAppender != null) {
slog.removeAppender(slogAppender);
slogAppender.close();
slogAppender = null;
/**
* sets up the vamsas session files and watchers in sessionDir1
+ *
* @param sessionDir1
*/
protected VamsasSession(File sessionDir1) throws IOException {
this(sessionDir1, null);
}
+
/**
* sets up the vamsas session files and watchers in sessionDir1
- * @param sessionDir1
- * @param extVamDoc null or an existing archive to initialise the session with
- * @throws any IOExceptions from creating session directory and files.
- * @throws error if both extVamDoc and sessionDir1 already exist (cannot import new data into session in this way)
+ *
+ * @param sessionDir1
+ * @param extVamDoc
+ * null or an existing archive to initialise the session with
+ * @throws any
+ * IOExceptions from creating session directory and files.
+ * @throws error
+ * if both extVamDoc and sessionDir1 already exist (cannot import
+ * new data into session in this way)
*/
protected VamsasSession(File sessionDir1, File extVamDoc) throws IOException {
if (sessionDir1 == null)
throw new Error("Null directory for VamsasSession.");
- if (sessionDir1.exists()) {
- if (extVamDoc!=null && extVamDoc.exists())
- throw new Error("Client Initialisation Error: Cannot join an existing session directory with an existing vamsas document to import.");
- if (!sessionDir1.isDirectory() || !sessionDir1.canWrite()
- || !sessionDir1.canRead())
- throw new IOException("Cannot access '" + sessionDir1
- + "' as a read/writable Directory.");
- if (!checkSessionFiles(sessionDir1))
+ if (!sessionDir1.exists() && !sessionDir1.mkdir()) {
+ throw new IOException("Failed to make VamsasSession directory in "
+ + sessionDir1);
+ }
+ if (!sessionDir1.isDirectory() || !sessionDir1.canWrite()
+ || !sessionDir1.canRead()) {
+ throw new IOException("Cannot access '" + sessionDir1
+ + "' as a read/writable Directory.");
+ }
+ boolean existingSession=checkSessionFiles(sessionDir1);
+ if (existingSession)
+ {
+ if (extVamDoc!=null) {
+ throw new Error(
+ "Client Initialisation Error: Cannot join an existing session directory with an existing vamsas document to import.");
+ } else {
log
- .warn("checkSessionFiles() returned false. Possible client implementation error");
- this.sessionDir = sessionDir1;
- initSessionObjects();
- slog.debug("Initialising additional VamsasSession instance");
- log.debug("Attached to VamsasSession in " + sessionDir1);
- //}
- } else {
- // start from scratch
- if (!sessionDir1.mkdir())
- throw new IOException("Failed to make VamsasSession directory in "
- + sessionDir1);
- createSessionFiles(extVamDoc);
- initSessionObjects();
- slog.debug("Session directory created.");
- log.debug("Initialised VamsasSession in " + sessionDir1);
+ .debug("Joining an existing session.");
+ }
+ }
+ this.sessionDir = sessionDir1;
+ initSessionObjects();
+ if (existingSession)
+ { slog.debug("Initialising additional VamsasSession instance");
+ } else
+ {
+ slog.debug("Founding client has joined VamsasSession instance");
}
+
+ log.debug("Attached to VamsasSession in " + sessionDir1);
+ if (extVamDoc!=null)
+ {
+ setVamsasDocument(extVamDoc);
+ }
+ slog.debug("Session directory created.");
+ log.debug("Initialised VamsasSession in " + sessionDir1);
}
/**
* tests presence of existing sessionfiles files in dir
+ *
* @param dir
* @return
*/
/**
* create new empty files in dir
- *
- */
- private void createSessionFiles() throws IOException {
- createSessionFiles(null);
- }
- /**
*
- * @param extVamDoc null or an existing vamsas document to initialise session with
- * @throws IOException
*/
- private void createSessionFiles(File extVamDoc) throws IOException {
+ private void createSessionFiles() throws IOException {
if (sessionDir == null)
throw new IOException(
"Invalid call to createSessionFiles() with null sessionDir");
File c_file = new File(sessionDir, CLIENT_LIST);
File v_doc = new File(sessionDir, VAMSAS_OBJ);
if (!c_file.exists() && c_file.createNewFile())
- log.debug("Created new ClientFile " + c_file); // don't care if this works or not
- if (!v_doc.exists())
- {
- if (extVamDoc==null)
- {
- if (v_doc.createNewFile())
- {
- log.debug("Created new Vamsas Session Document File " + v_doc);
- } else {
- log.warn("Didn't create Vamsas Session Document file in "+v_doc);
- }
- } else {
- log.debug("Creating new session document from "+extVamDoc);
- try {
- SessionFile sesdoc = new SessionFile(new File(sessionDir, VAMSAS_OBJ));
- SessionFile extdoc = new SessionFile(extVamDoc);
- sesdoc.updateFrom(null, extdoc);
- } catch (Exception e)
- {
- v_doc.delete();
- v_doc.createNewFile();
- log.warn("Problem initialising new session ("+v_doc+") from existing vamsas document ("+extVamDoc+")",e);
- throw new IOException("Couldn't initialise session from existing vamsas document");
- }
- log.debug("Session document initialised from "+extVamDoc);
- }
+ log.debug("Created new ClientFile " + c_file); // don't care if this
+ // works or not
+ if (!v_doc.exists()) {
+ if (v_doc.createNewFile()) {
+ log.debug("Created new Vamsas Session Document File " + v_doc);
+ } else {
+ log.warn("Didn't create Vamsas Session Document file in " + v_doc);
}
+ }
}
/**
/**
* make a new watcher object for the clientFile
+ *
* @return new ClientFile watcher instance
*/
public FileWatcher getClientWatcher() {
/**
* make a new watcher object for the vamsas Document
+ *
* @return new ClientFile watcher instance
*/
public FileWatcher getDocWatcher() {
/**
* make a new watcher object for the messages file
+ *
* @return new watcher instance
*/
public FileWatcher getStoreWatcher() {
}
/**
- * write to the StoreWatcher file to indicate that a storeDocumentRequest has been made.
- * The local client's storeWatcher FileWatcher object is updated so the initial change is not registered.
+ * write to the StoreWatcher file to indicate that a storeDocumentRequest has
+ * been made. The local client's storeWatcher FileWatcher object is updated so
+ * the initial change is not registered.
+ *
* @param client
* @param user
* @return
log.debug("Trying to get lock for " + CLOSEANDSAVE_FILE);
RandomAccessFile sfwfile = sfw.fileLock.getRaFile();
sfwfile.setLength(0); // wipe out any old info.
- // TODO: rationalise what gets written to this file (ie do we want other clients to read the id of the requestor?)
+ // TODO: rationalise what gets written to this file (ie do we want other
+ // clients to read the id of the requestor?)
sfwfile.writeUTF(client.getClientUrn() + ":" + user.getFullName() + "@"
+ user.getOrganization());
sfw.unlockFile();
}
/**
- * create a new session with an existing vamsas Document - by copying it into the session.
+ * create a new session with an existing vamsas Document - by copying it into
+ * the session.
+ *
* @param archive
*/
public void setVamsasDocument(File archive) throws IOException {
log.debug("Transferring vamsas data from " + archive + " to session:"
+ vamArchive.sessionFile);
SessionFile xtantdoc = new SessionFile(archive);
+ while (!vamArchive.lockFile())
+ log.info("Trying to get lock for " + vamArchive.sessionFile);
vamArchive.updateFrom(null, xtantdoc);
- // LATER: decide if session archive provenance should be updated to reflect access.
- // TODO: soon! do a proper import objects from external file
+ xtantdoc.unlockFile();
+ unlockVamsasDocument();
+ // TODO: session archive provenance should be updated to reflect import from external source
log.debug("Transfer complete.");
}
/**
- * write session as a new vamsas Document (this will overwrite any existing file without warning)
- * TODO: test
- * TODO: verify that lock should be released for vamsas document.
+ * write session as a new vamsas Document (this will overwrite any existing
+ * file without warning) TODO: test TODO: verify that lock should be released
+ * for vamsas document.
+ *
* @param destarchive
*/
protected void writeVamsasDocument(File destarchive, Lock extlock)
if (extlock == null && !vamArchive.lockFile())
while (!vamArchive.lockFile())
log.info("Trying to get lock for " + vamArchive.sessionFile);
- // TODO: LATER: decide if a provenance entry should be written in the exported document recording the export from the session
+ // TODO: LATER: decide if a provenance entry should be written in the
+ // exported document recording the export from the session
newdoc.updateFrom(null, vamArchive);
- // LATER: LATER: fix use of updateFrom for file systems where locks cannot be made (because they don't have a lockManager, ie NFS/Unix, etc).
+ // LATER: LATER: fix use of updateFrom for file systems where locks cannot
+ // be made (because they don't have a lockManager, ie NFS/Unix, etc).
vamArchive.unLock();
newdoc.unlockFile();
log.debug("Transfer complete.");
VamsasArchive _va = null;
/**
- * Creates a VamsasArchive Vobject for accessing and updating document
- * Note: this will lock the Vamsas Document for exclusive access to the client.
+ * Creates a VamsasArchive Vobject for accessing and updating document Note:
+ * this will lock the Vamsas Document for exclusive access to the client.
+ *
* @return session vamsas document
- * @throws IOException if locks fail or vamsas document read fails.
+ * @throws IOException
+ * if locks fail or vamsas document read fails.
*/
protected VamsasArchive getVamsasDocument() throws IOException {
- // check we haven't already done this once - probably should be done by caller
+ // check we haven't already done this once - probably should be done by
+ // caller
if (_va != null)
return _va;
- // patiently wait for a lock on the document. (from ArchiveClient.getUpdateable())
+ // patiently wait for a lock on the document. (from
+ // ArchiveClient.getUpdateable())
long tries = 5000;
while (vamArchive.getLock() == null && --tries > 0) {
- // Thread.sleep(1);
+ // Thread.sleep(1);
log.debug("Trying to get a document lock for the " + tries + "'th time.");
}
if (tries == 0)
/**
* Unlocks the vamsas archive session document after it has been closed.
+ *
* @throws IOException
*/
protected void unlockVamsasDocument() throws IOException {
}
/**
- * create a uniquely named uk.ac.vamsas.client.simpleclient.ClientsFile.addClient(ClientHandle)ile in the session Directory
+ * create a uniquely named
+ * uk.ac.vamsas.client.simpleclient.ClientsFile.addClient(ClientHandle)ile in
+ * the session Directory
+ *
* @see java.io.File.createTempFile
- * @param pref Prefix for name
- * @param suff Suffix for name
+ * @param pref
+ * Prefix for name
+ * @param suff
+ * Suffix for name
* @return SessionFile object configured for the new file (of length zero)
* @throws IOException
*/
* add a IClient to the session
*
* add the client to the client list file
- * @param client client to add to the session
+ *
+ * @param client
+ * client to add to the session
*/
protected void addClient(SimpleClient client) {
if (client == null)
} catch (IOException e) {
log.debug("Error during active client file creation.");
}
- //tracks modification to the client list and readds client to the list
+ // tracks modification to the client list and readds client to the list
getClientWatcherElement().setHandler(new AddClientWatchCallBack(client));
getClientWatcherElement().enableWatch();
private SimpleClient client;
/**
- *Inits the handler with the client to check in the list
- * @param client client to monitor in the client list
+ * Inits the handler with the client to check in the list
+ *
+ * @param client
+ * client to monitor in the client list
*/
protected AddClientWatchCallBack(SimpleClient client) {
this.client = client;
}
/**
- * If the client list is modified, checks if the current is still in the list. otherwise, readds ti.
- * @return true to enable watcher, or false to disable it in future WatcherThread cycles.
+ * If the client list is modified, checks if the current is still in the
+ * list. otherwise, readds ti.
+ *
+ * @return true to enable watcher, or false to disable it in future
+ * WatcherThread cycles.
*/
public boolean handleWatchEvent(WatcherElement watcher, Lock lock) {
boolean isWatchEnable = watcher.isWatchEnabled();
- if (lock == null)//no update on the list
+ if (lock == null)// no update on the list
return isWatchEnable;
log.debug("change on the client list ");
if (client != null) {
- //checks if the client is not already in the lists
- ClientHandle[] cl = clist.retrieveClientList(lock);//clist.retrieveClientList();
+ // checks if the client is not already in the lists
+ ClientHandle[] cl = clist.retrieveClientList(lock);// clist.retrieveClientList();
boolean found = false;
if (cl != null) {
for (int chi = cl.length - 1; !found && chi > -1; chi--) {
}
/**
- *
- * removes a client from the current session
- * removes the client from the session client list
- * if the client is the last one from the session (ClientList), the current session is removed
- * from active session list.
- *
- * The active should add them self to the client list. To insure to close the session,when the current client is the lact active client,
- * clears the list of clients and when two cycles to insure there is no more active client, that otherwise would have readd themself to the list
- *
- * @param client client to remove
+ *
+ * removes a client from the current session removes the client from the
+ * session client list if the client is the last one from the session
+ * (ClientList), the current session is removed from active session list.
+ *
+ * The active should add them self to the client list. To insure to close the
+ * session,when the current client is the lact active client, clears the list
+ * of clients and when two cycles to insure there is no more active client,
+ * that otherwise would have readd themself to the list
+ *
+ * @param client
+ * client to remove
*/
- protected void removeClient(SimpleClient client)//IClient client)
+ protected void removeClient(SimpleClient client)// IClient client)
{
if (client == null) {
log.error("Null client passed to removeClient");
return;
}
- //ClientSessionFileWatcherElement cwe=getClientWatcherElement();
- //if (cwe!=null && cwe.isWatchEnabled()) {
- // cwe.haltWatch();
- //};
- //set handler to check is the the last active client of the session
- //Wait for several watchers cycle to see if the current client was the last client active in the session.
- //if yes, close the session
-
- // getClientWatcherElement().setHandler(new RemoveClientWatchCallBack (client));
+ // ClientSessionFileWatcherElement cwe=getClientWatcherElement();
+ // if (cwe!=null && cwe.isWatchEnabled()) {
+ // cwe.haltWatch();
+ // };
+ // set handler to check is the the last active client of the session
+ // Wait for several watchers cycle to see if the current client was the last
+ // client active in the session.
+ // if yes, close the session
+
+ // getClientWatcherElement().setHandler(new RemoveClientWatchCallBack
+ // (client));
// getClientWatcherElement().setTimeoutBeforeLastCycle(this.watchCycleCountBeforeLastClient);
log.info("remove client from list");
- if (clistWatchElement!=null)
- {
+ if (clistWatchElement != null) {
clistWatchElement.haltWatch();
clistWatchElement.watched.unlockFile();
}
- //clist.clearList();
- //clist.unlockFile();
+ // clist.clearList();
+ // clist.unlockFile();
log.info("list cleared");
- //if (cwe!=null) {
+ // if (cwe!=null) {
// cwe.enableWatch();
log.debug("Stopping EventGenerator..");
client.evgen._raise(Events.SESSION_SHUTDOWN, null, client
.getSessionHandle(), null);
}
- //cwe.haltWatch();
+ // cwe.haltWatch();
client.evgen.stopWatching();
try {
log.debug("Attempting to release active client locks");
.debug("current client lockfile is '" + client.getClientlockFile()
+ "'");
boolean noOtherActiveClient = true;
- //create, if need, subdirectory to contain client files
+ // create, if need, subdirectory to contain client files
File clientlockFileDir = new File(this.sessionDir, clientFileDirectory);
if (!clientlockFileDir.exists()) {
log
try {
- //no check every file in the directory and try to get lock on it.
+ // no check every file in the directory and try to get lock on it.
File[] clientFiles = clientlockFileDir.listFiles();
- if (clientFiles == null || clientFiles.length == 0) {//there is not file on the directory. the current client should be the last one.
+ if (clientFiles == null || clientFiles.length == 0) {// there is not file
+ // on the directory.
+ // the current
+ // client should be
+ // the last one.
return true;
}
// Use the file channel to create a lock on the file.
// This method blocks until it can retrieve the lock.
- // java.nio.channels.FileLock activeClientFilelock = channel.lock();
+ // java.nio.channels.FileLock activeClientFilelock = channel.lock();
// Try acquiring the lock without blocking. This method returns
// null or throws an exception if the file is already locked.
java.nio.channels.FileLock activeClientFilelock = channel
.tryLock();
- //the lock has been acquired.
- //the file was not lock and so the corresponding application seems to have die
+ // the lock has been acquired.
+ // the file was not lock and so the corresponding application
+ // seems to have die
if (activeClientFilelock != null) {
log
.debug("lock obtained : file must be from a crashed application");
channel.close();
log.debug("channel closed");
- //delete file
+ // delete file
clientFile.delete();
log.debug("crashed application file deleted");
}
} catch (OverlappingFileLockException e) {
// File is already locked in this thread or virtual machine
- //that the expected behaviour
+ // that the expected behaviour
log.debug("lock not accessible ", e);
}
} catch (Exception e) {
private boolean manualCheckOfClientCount = false;
/**
- *Inits the handler with the client to check in the list
- * @param client client to monitor in the client list
+ * Inits the handler with the client to check in the list
+ *
+ * @param client
+ * client to monitor in the client list
*/
protected RemoveClientWatchCallBack(SimpleClient client) {
this.client = client;
}
/**
- * If the client list is modified, checks if the current is still in the list. otherwise, readds ti.
- * @return true to enable watcher, or false to disable it in future WatcherThread cycles.
+ * If the client list is modified, checks if the current is still in the
+ * list. otherwise, readds ti.
+ *
+ * @return true to enable watcher, or false to disable it in future
+ * WatcherThread cycles.
*/
public boolean handleWatchEvent(WatcherElement watcher, Lock lock) {
// if lock is null, no client has been added since last, clear.
- //the client is then the last client
+ // the client is then the last client
if (client != null) {
if (lock == null) {
- //checks if the client is not already in the lists
- // ClientHandle[] cl = clist.retrieveClientList();//lock);//clist.retrieveClientList();
+ // checks if the client is not already in the lists
+ // ClientHandle[] cl =
+ // clist.retrieveClientList();//lock);//clist.retrieveClientList();
boolean islastClient = true;
if (manualCheckOfClientCount) {
log.debug("manual checking of count of client");
- //checks if the client is not already in the lists
- ClientHandle[] cl = clist.retrieveClientList();//lock);//clist.retrieveClientList();
+ // checks if the client is not already in the lists
+ ClientHandle[] cl = clist.retrieveClientList();// lock);//clist.retrieveClientList();
if (cl == null || cl.length < 1)
- // {//no client has registered as active
+ // {//no client has registered as active
{
islastClient = true;
log.debug("list is empty");
islastClient = false;
log.debug("list is not empty");
}
- // if(cl == null || cl.length<1 )
- // {//no client has registered as active
+ // if(cl == null || cl.length<1 )
+ // {//no client has registered as active
if (islastClient) {
- //the client is the last one, so close current session
+ // the client is the last one, so close current session
log.info("last client removed: closing session");
closeSession(client);
}
} else {
log.debug("not the last client found ");
- // ask to the client to cpoy application data into the document
- // client.evgen._raise(Events.DOCUMENT_FINALIZEAPPDATA, null, client,null);
+ // ask to the client to cpoy application data into the document
+ // client.evgen._raise(Events.DOCUMENT_FINALIZEAPPDATA, null,
+ // client,null);
- // / }
+ // / }
}
log.debug("Stopping EventGenerator..");
- // TODO: ensure ClientsFile lock is really released!! clist.unlockFile();
+ // TODO: ensure ClientsFile lock is really released!!
+ // clist.unlockFile();
client.evgen.stopWatching();
}
- watcher.setHandler(null);//Do not check if the client is the last client. watcher will shutdown anyway
- // watcher.haltWatch();
+ watcher.setHandler(null);// Do not check if the client is the last
+ // client. watcher will shutdown anyway
+ // watcher.haltWatch();
// watcher.
return false;
}
}
/**
- * closes the current session,
- * and send an event to the last client to close the document
- * @param client the last client of the client
+ * closes the current session, and send an event to the last client to close
+ * the document
+ *
+ * @param client
+ * the last client of the client
*/
private void closeSession(SimpleClient client) {
- // close document
+ // close document
client.evgen._raise(Events.DOCUMENT_REQUESTTOCLOSE, null, client, null);
log.debug("close document request done");
closeSession(client.getSessionHandle());
/**
* CLoses the current session
- * @param sessionHandle sessionHandle of the session to remove
+ *
+ * @param sessionHandle
+ * sessionHandle of the session to remove
*/
private void closeSession(SessionHandle sessionHandle) {
getSessionManager().removeSession(sessionHandle);
}
/**
- * @param sessionManager the sessionManager to set
+ * @param sessionManager
+ * the sessionManager to set
*/
protected void setSessionManager(SimpleSessionManager sessionManager) {
this.sessionManager = sessionManager;
/**
* get or create a watcher on clist.
+ *
* @return the contents of clistWatchElement or initialise it
*/
public ClientSessionFileWatcherElement getClientWatcherElement() {
}
return clistWatchElement;
}
- /**
- * writes a vector of vorba Ids to the session.
- * @param modObjects
- public void setModObjectList(Vector modObjects) {
- log.debug("Writing "+modObjects.size()+" ids to ModObjectList");
- // TODO Auto-generated method stub
- }
- **
- * get current list of modified objects.
- * @return null or Vector of objects
- *
- public Vector getModObjectList() {
- log.debug("Reading modObjectList");
- return null;
- }
- */
}