Author: xor
Date: 2008-11-24 13:37:51 +0000 (Mon, 24 Nov 2008)
New Revision: 23839

Added:
   trunk/freenet/src/freenet/support/TransferThread.java
Log:
Create abstract base class for (plugin) threads which run fetches & inserts and 
have to keep track of them.

Added: trunk/freenet/src/freenet/support/TransferThread.java
===================================================================
--- trunk/freenet/src/freenet/support/TransferThread.java                       
        (rev 0)
+++ trunk/freenet/src/freenet/support/TransferThread.java       2008-11-24 
13:37:51 UTC (rev 23839)
@@ -0,0 +1,132 @@
+package freenet.support;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import freenet.client.FetchException;
+import freenet.client.FetchResult;
+import freenet.client.InsertException;
+import freenet.client.async.BaseClientPutter;
+import freenet.client.async.ClientGetter;
+import freenet.keys.FreenetURI;
+
+public abstract class TransferThread implements Runnable {
+       
+       private final Executor mExecutor;
+       
+       private Thread mThread;
+       
+       private volatile boolean isRunning = false;
+       
+       private final Collection<ClientGetter> mFetches = getFetchStorage();
+       private final Collection<BaseClientPutter> mInserts = 
getInsertStorage();
+       
+       public TransferThread(Executor myExecutor, String myName) {
+               mExecutor = myExecutor;
+               mExecutor.execute(this, myName);
+       }
+
+       public void run() {
+               isRunning = true;
+               mThread = Thread.currentThread();
+               
+               try {
+                       Thread.sleep(getStartupDelay());
+               } catch (InterruptedException e) {
+                       mThread.interrupt();
+               }
+               
+               while(isRunning) {
+                       Thread.interrupted();
+                       
+                       try {
+                               iterate();
+                               Thread.sleep(getSleepTime());
+                       }
+                       catch(InterruptedException e) {
+                               mThread.interrupt();
+                       }
+               }
+               
+               abortAllTransfers();
+       }
+       
+       protected void abortAllTransfers() {
+               Logger.debug(this, "Trying to stop all requests & inserts");
+               
+               synchronized(mFetches) {
+                       Iterator<ClientGetter> r = mFetches.iterator();
+                       int rcounter = 0;
+                       while (r.hasNext()) { r.next().cancel(); r.remove(); 
++rcounter; }
+                       Logger.debug(this, "Stopped " + rcounter + " current 
requests");
+               }
+
+               synchronized(mInserts) {
+                       Iterator<BaseClientPutter> i = mInserts.iterator();
+                       int icounter = 0;
+                       while (i.hasNext()) { i.next().cancel(); i.remove(); 
++icounter; }
+                       Logger.debug(this, "Stopped " + icounter + " current 
inserts");
+               }
+       }
+       
+       protected void removeFetch(ClientGetter g) {
+               synchronized(mFetches) {
+                       //g.cancel(); /* FIXME: is this necessary ? */
+                       mFetches.remove(g);
+               }
+               Logger.debug(this, "Removed request for " + g.getURI());
+       }
+       
+       protected void removeInsert(BaseClientPutter p) {
+               synchronized(mInserts) {
+                       //p.cancel(); /* FIXME: is this necessary ? */
+                       mInserts.remove(p);
+               }
+               Logger.debug(this, "Removed insert for " + p.getURI());
+       }
+       
+       public void terminate() {
+               isRunning = false;
+               mThread.interrupt();
+               try {
+                       mThread.join();
+               }
+               catch(InterruptedException e)
+               {
+                       Thread.currentThread().interrupt();
+               }
+       }
+       
+       
+       public abstract Collection<ClientGetter> getFetchStorage();
+       
+       public abstract Collection<BaseClientPutter> getInsertStorage();
+       
+       public abstract long getStartupDelay();
+
+       public abstract long getSleepTime();
+       
+       public abstract void iterate();
+
+       
+       /* Fetches */
+       
+       public abstract void onSuccess(FetchResult result, ClientGetter state);
+
+       public abstract void onFailure(FetchException e, ClientGetter state);
+
+       /* Inserts */
+       
+       public abstract void onSuccess(BaseClientPutter state);
+
+       public abstract void onFailure(InsertException e, BaseClientPutter 
state);
+
+       public abstract void onFetchable(BaseClientPutter state);
+
+       public abstract void onGeneratedURI(FreenetURI uri, BaseClientPutter 
state);
+
+       /** Called when freenet.async thinks that the request should be 
serialized to
+        * disk, if it is a persistent request. */
+       public abstract void onMajorProgress();
+
+}
\ No newline at end of file

_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to