fedotows

Untitled

May 15th, 2012
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package core.util;
  2.  
  3. import java.io.UnsupportedEncodingException;
  4. import java.util.concurrent.Executors;
  5. import java.util.concurrent.ScheduledExecutorService;
  6. import java.util.concurrent.ScheduledFuture;
  7. import java.util.concurrent.ThreadFactory;
  8. import java.util.concurrent.TimeUnit;
  9.  
  10. import org.slf4j.Logger;
  11. import org.slf4j.LoggerFactory;
  12.  
  13. import core.nonblocking.NonBlockingRequestHandler;
  14. import engine.webspider.WebSpider;
  15.  
  16. /**
  17.  * Class schedules logout request. The submitted logout request can be
  18.  * rescheduled if required.
  19.  *
  20.  * @author dimitrijs
  21.  */
  22. public class SupplierSessionCleaner {
  23.     private static final int TIMEOUT = (int) TimeUnit.MINUTES.toSeconds(3);
  24.     private static final Logger logger = LoggerFactory
  25.             .getLogger(SupplierSessionCleaner.class);
  26.     private static final ScheduledExecutorService executor = Executors
  27.             .newSingleThreadScheduledExecutor(new ThreadFactory() {
  28.                 @Override
  29.                 public Thread newThread(Runnable r) {
  30.                     Thread result = new Thread(r, SupplierSessionCleaner.class.getName());
  31.                     result.setDaemon(false);
  32.                     result.setPriority(Thread.NORM_PRIORITY - 1);
  33.                     return result;
  34.                 }
  35.             });
  36.     private int modCount = 0;
  37.     private final WebSpider spider = new LogoutWebSpider();
  38.     private final String name;
  39.     private ScheduledFuture<?> future;
  40.     private boolean closed = false;
  41.  
  42.     /**
  43.      * registers the logoutRequest to be run after closeAfter minutes.
  44.      *
  45.      * @param name spider's name
  46.      * @param logoutDelay how long (in minutes) to wait before to run logout request
  47.      */
  48.     public SupplierSessionCleaner(String name, long logoutDelay) {
  49.         this.name = name + "Logout";
  50.     }
  51.    
  52.     /**
  53.      * Reschedules logout request for later time.
  54.      * If it is a first call this method does initial schedule.
  55.      * So should be called after webspider is initialized.
  56.      *
  57.      * @param logoutDelay delay (in minutes) logout request
  58.      * @throws IllegalStateException if logout request already sent
  59.      */
  60.     public synchronized void reschedule(long logoutDelay) {
  61.         if (closed) {
  62.             throw new IllegalStateException("already closed [" + name + "]");
  63.         }
  64.         if (future != null) {
  65.             future.cancel(false);
  66.         }
  67.         modCount++;
  68.         LogoutWorker worker = new LogoutWorker(modCount);
  69.         future = executor.schedule(worker, logoutDelay, TimeUnit.MINUTES);
  70.         logger.debug("logout request rescheduled [{}]. delay {} min", name, logoutDelay);
  71.     }
  72.  
  73.     /**
  74.      * Forces to execute logout request
  75.      */
  76.     public synchronized void logout() {
  77.         if (future == null) {
  78.             logger.debug("already logged out [{}]", name);
  79.             return;
  80.         }
  81.         future.cancel(false);
  82.         future = null;
  83.         closed = true;
  84.         logger.debug("submitting logout request [{}]", name);
  85.         try {
  86.             spider.run();
  87.         } catch (Throwable ex) {
  88.             logger.warn("logout request submission error [" + name + "]", ex);
  89.         }
  90.     }
  91.  
  92.     private synchronized void tryLogout(int expectedModCount) {
  93.         if (expectedModCount == modCount) {
  94.             logger.debug("scheduled logging out [{}]", name);
  95.             logout();
  96.         } else {
  97.             logger.debug("scheduled logging out is cancelled due to previous reschedule [{}]", name);
  98.         }
  99.     }
  100.  
  101.    
  102.     /*  ========================================================
  103.      *  DELEGATED METHODS OF WEBSPIDER.
  104.      *  TODO: ADD MORE, IF REQUIRED
  105.      *  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  106.      */
  107.    
  108.     public final void addHttpGetField(String field, long value) {
  109.         spider.addHttpGetField(field, value);
  110.     }
  111.  
  112.     public final void addHttpGetField(String field, Object value) {
  113.         spider.addHttpGetField(field, value);
  114.     }
  115.  
  116.     public final void addHttpHeader(String header, String value) {
  117.         spider.addHttpHeader(header, value);
  118.     }
  119.  
  120.     public final void addHttpPostField(String field, long value) throws UnsupportedEncodingException {
  121.         spider.addHttpPostField(field, value);
  122.     }
  123.  
  124.     public final void addHttpPostField(String field, String value) throws UnsupportedEncodingException {
  125.         spider.addHttpPostField(field, value);
  126.     }
  127.  
  128.     public final void newHttpGetRequest(String url) {
  129.         spider.newHttpGetRequest(url);
  130.     }
  131.  
  132.     public final void newHttpPostRequest(String url) {
  133.         spider.newHttpPostRequest(url);
  134.     }
  135.  
  136.     public void setHttpCharset(String charset) {
  137.         spider.setHttpCharset(charset);
  138.     }
  139.  
  140.     public final void setHttpCookie(String key, String value) {
  141.         spider.setHttpCookie(key, value);
  142.     }
  143.  
  144.     public final void setHttpHeader(String header, String value) {
  145.         spider.setHttpHeader(header, value);
  146.     }
  147.  
  148.     public final void setHttpMethodGet() {
  149.         spider.setHttpMethodGet();
  150.     }
  151.  
  152.     public final void setHttpMethodPost() {
  153.         spider.setHttpMethodPost();
  154.     }
  155.  
  156.     // -----------------------------------------------------------------------------------
  157.  
  158.     private class LogoutWebSpider extends WebSpider implements NonBlockingRequestHandler {
  159.  
  160.         @Override
  161.         public String getSpiderName() {
  162.             return name;
  163.         }
  164.  
  165.         @Override
  166.         public void runTask() throws Throwable {
  167.             init();
  168.         }
  169.  
  170.         private void cleanup() {
  171.             try {
  172.                 close();
  173.                 // TODO: maybe need more cleanup?
  174.             } catch (Throwable t) {
  175.                 if (logger.isWarnEnabled()) {
  176.                     logger.warn("logout spider cleanup error [" + name + "]", t);
  177.                 }
  178.             }
  179.         }
  180.        
  181.         @Override
  182.         public void downloadingComplete() {
  183.             logger.debug("logout request successful [{}]", name);
  184.             cleanup();
  185.         }
  186.  
  187.         @Override
  188.         public void downloadingFailed(Exception ex) {
  189.             if (logger.isWarnEnabled()) {
  190.                 logger.warn("logout request unsuccessful [" + name + "]", ex);
  191.             }
  192.             cleanup();
  193.         }
  194.  
  195.         @Override
  196.         public void init() {
  197.             try {
  198.                 // TODO: more init? (proxies etc)
  199.                 download(TIMEOUT);
  200.             } catch (Throwable t) {
  201.                 logger.error("Logging out error [" + name + "]", t);
  202.             }
  203.         }
  204.  
  205.     }
  206.  
  207.     // -----------------------------------------------------------------------------------
  208.  
  209.     private class LogoutWorker implements Runnable {
  210.         private final int expectedModCount;
  211.        
  212.         LogoutWorker(int expectedModCount) {
  213.             this.expectedModCount = expectedModCount;
  214.         }
  215.        
  216.         @Override
  217.         public void run() {
  218.             SupplierSessionCleaner.this.tryLogout(expectedModCount);
  219.         }
  220.     }
  221. }
Advertisement
Add Comment
Please, Sign In to add comment