Divide the MSB source codes into two repos
[msb/apigateway.git] / apiroute / apiroute-service / src / main / java / org / onap / msb / apiroute / wrapper / consulextend / expose / WatchTask.java
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchTask.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/wrapper/consulextend/expose/WatchTask.java
new file mode 100644 (file)
index 0000000..2ada19d
--- /dev/null
@@ -0,0 +1,87 @@
+package org.onap.msb.apiroute.wrapper.consulextend.expose;
+
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.onap.msb.apiroute.wrapper.consulextend.cache.ConsulCache;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.orbitz.consul.model.ConsulResponse;
+
+public abstract class WatchTask<T> {
+       private final CopyOnWriteArrayList<Filter<T>> filters = new CopyOnWriteArrayList<Filter<T>>();
+       private final CopyOnWriteArrayList<Handler<T>> handlers = new CopyOnWriteArrayList<Handler<T>>();
+       private final static Logger LOGGER = LoggerFactory
+                       .getLogger(WatchTask.class);
+       
+       //start
+       public abstract boolean startWatch();
+       
+       //stop
+       public abstract boolean stopWatch();
+       
+       // filters
+       public interface Filter<T> {
+               public boolean filter(final ConsulResponse<T> object);
+       }
+
+       public boolean addFilter(Filter<T> filter) {
+               boolean added = filters.add(filter);
+               return added;
+       }
+       
+       public void removeAllFilter() {
+               filters.clear();
+       }
+
+
+       public final CopyOnWriteArrayList<Filter<T>> getAllFilters(){
+               return filters;
+       }
+       
+       // handlers
+       public interface Handler<T> {
+               void handle(final ConsulResponse<T> object);
+       }
+
+       public boolean addHandler(Handler<T> handler) {
+               boolean added = handlers.add(handler);
+               return added;
+       }
+       
+       public void removeAllHandler() {
+               handlers.clear();
+       }
+       
+       // internal listener
+       protected class InternalListener implements ConsulCache.Listener<T> {
+               @Override
+               public void notify(ConsulResponse<T> newValues) {
+                       
+                       long startTime = System.currentTimeMillis();
+                       
+                       // filter
+                       for (Filter<T> f : filters) {
+                               // false,return
+                               if (!f.filter(newValues)) {
+                                       return;
+                               }
+                       }
+
+                       // handle
+                       for (Handler<T> h : handlers) {
+                               h.handle(newValues);
+                       }
+                       
+                       long endTime = System.currentTimeMillis();
+                       
+                       if(endTime-startTime > 10*1000)
+                       {
+                               LOGGER.info("WatchTask THEAD WORK TIMEOUT");
+                       }
+               }
+
+       }
+
+
+}