X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fuk%2Fac%2Fvamsas%2Fclient%2Fsimpleclient%2FVamsasSession.java;fp=src%2Fuk%2Fac%2Fvamsas%2Fclient%2Fsimpleclient%2FVamsasSession.java;h=c84989320f072370a4c39a4592c81759ed3df9e4;hb=4af676753de2489148d92c834398ec88079bcf24;hp=1c77d66cf0d993c20da8f03a0c7966b4e03f72fe;hpb=5aa299970faf5a4469c080efa5944960342e1f09;p=vamsas.git diff --git a/src/uk/ac/vamsas/client/simpleclient/VamsasSession.java b/src/uk/ac/vamsas/client/simpleclient/VamsasSession.java index 1c77d66..c849893 100644 --- a/src/uk/ac/vamsas/client/simpleclient/VamsasSession.java +++ b/src/uk/ac/vamsas/client/simpleclient/VamsasSession.java @@ -1,18 +1,19 @@ package uk.ac.vamsas.client.simpleclient; -import java.io.BufferedWriter; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.io.PrintWriter; import java.io.RandomAccessFile; import java.io.Writer; +import java.util.Enumeration; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.log4j.Appender; import org.apache.log4j.Logger; import org.apache.log4j.FileAppender; +import org.apache.log4j.PatternLayout; import uk.ac.vamsas.client.ClientHandle; import uk.ac.vamsas.client.IClient; @@ -119,22 +120,22 @@ public class VamsasSession { * @throws IOException */ private void initLog() throws IOException { + // TODO: fix session event logging // LATER: make dedicated appender format for session log. - Appender app = slog.getAppender("SESSION_LOG"); - // slog.addAppender(new FileAppender(app.getLayout(), new File(sessionDir, SESSION_LOG).getAbsolutePath())); - - //Appender app = slog.getAppender("SESSION_LOG"); - if (app == null) log.info("No appender 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()); + + }*/ - if (slog!= null && app != null) - { - if (app instanceof FileAppender) - { - File sessionLogFile = new File(this.sessionDir, ((FileAppender)app).getFile()); - slog.addAppender(new FileAppender(app.getLayout(), sessionLogFile.getAbsolutePath())); - } - // slog.removeAppender("SESSION_LOG"); - } + if (slog!= null ) { + File sessionLogFile = new File(this.sessionDir, SESSION_LOG); + slog.addAppender(new FileAppender(new PatternLayout("%-4r [%t] %-5p %c %x - %m%n"), sessionLogFile.getAbsolutePath(), true)); + } else { + log.info("No appender for SessionLog"); + } } /** @@ -162,22 +163,17 @@ public class VamsasSession { if (sessionDir1.exists()) { if (!sessionDir1.isDirectory() || !sessionDir1.canWrite() || !sessionDir1.canRead()) throw new IOException("Cannot access '"+sessionDir1+"' as a read/writable Directory."); - this.sessionDir = sessionDir1;//createSessionFiles, need sessionDir attribute set - if (!checkSessionFiles(sessionDir1)) - { - createSessionFiles(); - } - // session files exist in the directory - - initSessionObjects(); - slog.debug("Initialising additional VamsasSession instance"); - log.debug("Attached to VamsasSession in "+sessionDir1); + if (!checkSessionFiles(sessionDir1)) + 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); - this.sessionDir = sessionDir1; createSessionFiles(); initSessionObjects(); slog.debug("Session directory created."); @@ -205,19 +201,21 @@ public class VamsasSession { 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.createNewFile()) + 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.createNewFile()) + if (!v_doc.exists() && v_doc.createNewFile()) log.debug("Created new Vamsas Session Document File "+v_doc); } /** * construct SessionFile objects and watchers for each */ private void initSessionObjects() throws IOException { + createSessionFiles(); if (clist!=null || vamArchive!=null) throw new IOException("initSessionObjects called for initialised VamsasSession object."); clist = new ClientsFile(new File(sessionDir,CLIENT_LIST)); vamArchive = new VamsasFile(new File(sessionDir,VAMSAS_OBJ)); + storedocfile=new ClientsFile(new File(sessionDir, CLOSEANDSAVE_FILE)); initLog(); } /** @@ -227,26 +225,21 @@ public class VamsasSession { public FileWatcher getClientWatcher() { return new FileWatcher(clist.sessionFile); } - FileWatcher session_doc_watcher=null; /** * make a new watcher object for the vamsas Document * @return new ClientFile watcher instance */ public FileWatcher getDocWatcher() { - if (session_doc_watcher==null) - return session_doc_watcher = new FileWatcher(vamArchive.sessionFile); return new FileWatcher(vamArchive.sessionFile); } FileWatcher store_doc_file=null; + public ClientsFile storedocfile=null; /** * make a new watcher object for the messages file - * (thread safe - keeps a reference to the first watcher) * @return new watcher instance */ public FileWatcher getStoreWatcher() { - if (store_doc_file==null) - return store_doc_file = new FileWatcher(new File(CLOSEANDSAVE_FILE)); - return new FileWatcher(new File(CLOSEANDSAVE_FILE)); + return new FileWatcher(new File(sessionDir,CLOSEANDSAVE_FILE)); } /** @@ -257,6 +250,7 @@ public class VamsasSession { * @return */ public void addStoreDocumentRequest(ClientHandle client, UserHandle user) throws IOException { + // TODO: replace this with clientsFile mechanism SessionFile sfw = new SessionFile(new File(sessionDir, CLOSEANDSAVE_FILE)); while (!sfw.lockFile()) log.debug("Trying to get lock for "+CLOSEANDSAVE_FILE); @@ -293,7 +287,7 @@ public class VamsasSession { if (extlock==null && !vamArchive.lockFile()) while (!vamArchive.lockFile()) log.info("Trying to get lock for "+vamArchive.sessionFile); - // TODO: LATER: decide if session archive provenance should be written in vamsasDocument file for this export. + // TODO: LATER: decide if a provenance entry should be written in the exported document recording the export from the session newdoc.updateFrom(extlock, 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). vamArchive.unLock(); @@ -308,15 +302,29 @@ public class VamsasSession { * @throws IOException if locks fail or vamsas document read fails. */ protected VamsasArchive getVamsasDocument() throws IOException { - // TODO: check we haven't already done this once - if (!vamArchive.lockFile()) + // TODO: check we haven't already done this once - probably should be done by caller + // patiently wait for a lock on the document. (from ArchiveClient.getUpdateable()) + long tries=5000; + while (vamArchive.getLock()==null && --tries>0) { +// Thread.sleep(1); + log.debug("Trying to get a document lock for the "+tries+"'th time."); + } + if (tries==0) throw new IOException("Failed to get lock for vamsas archive."); - + VamsasArchive va = new VamsasArchive(vamArchive.sessionFile, false, true, vamArchive); - + return va; } /** + * Unlocks the vamsas archive session document after it has been closed. + * @throws IOException + */ + protected void unlockVamsasDocument() throws IOException { + if (vamArchive!=null) + vamArchive.unLock(); + } + /** * 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 @@ -339,9 +347,14 @@ public class VamsasSession { protected void addClient(IClient client) { if (client == null) - this.slog.error("Try to add a null client to the session "); - else - this.clist.addClient(client.getClientHandle(), getClientWatcher().getChangedState()); + slog.error("Try to add a null client to the session "); + else { + log.debug("Adding client "+client.getClientHandle().getClientUrn()); + getClientWatcherElement().haltWatch(); + clist.addClient(client.getClientHandle()); + getClientWatcherElement().enableWatch(); + log.debug("Added."); + } } /** @@ -357,20 +370,30 @@ public class VamsasSession { { if (client == null) { - //System.out.println("Try to remove a null client."); - this.slog.error("Try to remove a null client."); + log.error("Null client passed to removeClient"); return; } - this.clist.removeClient(client.getClientHandle(), getClientWatcher().getChangedState()); + SessionFileWatcherElement cwe=getClientWatcherElement(); + if (cwe!=null && cwe.isWatchEnabled()) { + cwe.haltWatch(); + } else { + cwe=null; + } + clist.removeClient(client.getClientHandle(),null); if (this.clist.retrieveClientList() == null|| this.clist.retrieveClientList().length<1) {//assume it is the last client has been removed shutting down session - System.out.println("last client removed: removing session"); + slog.info("last client removed: removing session"); + log.debug("last client removed: removing session"); this.getSessionManager().removeSession(client.getSessionHandle()); } else { - this.slog.debug("Still "+this.clist.retrieveClientList().length +" active clients"); - System.out.println("Still "+(this.clist.retrieveClientList()==null?"null":this.clist.retrieveClientList().length+"") +" active clients"); + int active=clist.retrieveClientList().length; + log.debug("Still "+active+" active clients"); + slog.info("Still "+active+" active clients"); + } + if (cwe!=null) { + cwe.enableWatch(); } } /** @@ -385,6 +408,19 @@ protected SimpleSessionManager getSessionManager() { protected void setSessionManager(SimpleSessionManager sessionManager) { this.sessionManager = sessionManager; } +public ClientsFile getStoreDocFile() { + if (storedocfile==null) { + + } + return storedocfile; +} +SessionFileWatcherElement clistWatchElement=null; +public SessionFileWatcherElement getClientWatcherElement() { + if (clistWatchElement==null) { + clistWatchElement=new SessionFileWatcherElement(clist,null); + } + return clistWatchElement; +} }