diff options
Diffstat (limited to 'bkucommon/src/main')
3 files changed, 219 insertions, 145 deletions
diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/binding/BindingProcessorManager.java b/bkucommon/src/main/java/at/gv/egiz/bku/binding/BindingProcessorManager.java index aaf81e51..9cad95a4 100644 --- a/bkucommon/src/main/java/at/gv/egiz/bku/binding/BindingProcessorManager.java +++ b/bkucommon/src/main/java/at/gv/egiz/bku/binding/BindingProcessorManager.java @@ -14,92 +14,94 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package at.gv.egiz.bku.binding;
-
+package at.gv.egiz.bku.binding; + import java.net.MalformedURLException; -import java.util.Locale;
-import java.util.Set;
-
-import at.gv.egiz.bku.slcommands.SLCommandInvoker;
-import at.gv.egiz.stal.STALFactory;
-
-/**
- * Central player that handles the protocol binding.
- *
- * @author wbauer
- *
- */
-public interface BindingProcessorManager {
-
- /**
- * FactoryMethod creating a new BindingProcessor object.
- * The created binding processor must be passed to the process method to execute.
- *
- * @param urlString
- * the source url
- * @param aSessionId
- * optional an external sessionId (e.g. http session) could be
- * provided. This parameter may be null.
- * @param locale the locale used for user interaction, may be null
- */
- public BindingProcessor createBindingProcessor(String urlString,
- String aSessionId, Locale locale) throws MalformedURLException;
-
- /**
- * FactoryMethod creating a new BindingProcessor object.
- * The created binding processor must be passed to the process method to execute.
- *
- * @param protcol
- * the source url
- * @param aSessionId
- * optional an external sessionId (e.g. http session) could be
- * provided. This parameter may be null.
- */
- public BindingProcessor createBindingProcessor(String urlString,
- String aSessionId) throws MalformedURLException;
-
-
- /**
- * Gets the binding processor with a certain id. The binding processor must be passed to the
- * process method before it is managed and thus returned by this method.
- * @param aId must not be null
- * @return null if the binding processor was not "processed" before.
- */
- public BindingProcessor getBindingProcessor(Id aId);
-
- /**
- * Sets the STAL factory that is used for creating STAL objects that are used by BindingProcessor objects.
- * For each new BindingProcessor a new STAL object is created.
- * @param aStalFactory the factory to be used. Must not be null.
- */
- public void setSTALFactory(STALFactory aStalFactory);
-
- /**
- * Sets the invoker to be used.
- * @param invoker
- */
- public void setSLCommandInvoker(SLCommandInvoker invoker);
-
- /**
- * Schedules the provided binding processor for processing and immediately returns.
- *
- * @param aBindingProcessor
- */
- public void process(BindingProcessor aBindingProcessor);
-
- /**
- * Removes a formerly added (by calling the process method) binding processor.
- * @param bindingProcessor must not be null
- */
- public void removeBindingProcessor(Id sessionId);
-
- /**
- * A set of all managed binding processors.
- * @return
- */
- public Set<Id> getManagedIds();
-
+import java.util.Locale; +import java.util.Set; + +import at.gv.egiz.bku.slcommands.SLCommandInvoker; +import at.gv.egiz.stal.STALFactory; + +/** + * Central player that handles the protocol binding. + * + * @author wbauer + * + */ +public interface BindingProcessorManager { + + /** + * FactoryMethod creating a new BindingProcessor object. + * The created binding processor must be passed to the process method to execute. + * + * @param urlString + * the source url + * @param aSessionId + * optional an external sessionId (e.g. http session) could be + * provided. This parameter may be null. + * @param locale the locale used for user interaction, may be null + */ + public BindingProcessor createBindingProcessor(String urlString, + String aSessionId, Locale locale) throws MalformedURLException; + + /** + * FactoryMethod creating a new BindingProcessor object. + * The created binding processor must be passed to the process method to execute. + * + * @param protcol + * the source url + * @param aSessionId + * optional an external sessionId (e.g. http session) could be + * provided. This parameter may be null. + */ + public BindingProcessor createBindingProcessor(String urlString, + String aSessionId) throws MalformedURLException; + + + /** + * Gets the binding processor with a certain id. The binding processor must be passed to the + * process method before it is managed and thus returned by this method. + * @param aId must not be null + * @return null if the binding processor was not "processed" before. + */ + public BindingProcessor getBindingProcessor(Id aId); + + /** + * Sets the STAL factory that is used for creating STAL objects that are used by BindingProcessor objects. + * For each new BindingProcessor a new STAL object is created. + * @param aStalFactory the factory to be used. Must not be null. + */ + public void setSTALFactory(STALFactory aStalFactory); + + /** + * Sets the invoker to be used. + * @param invoker + */ + public void setSLCommandInvoker(SLCommandInvoker invoker); + + /** + * Creates a processing context, + * schedules the provided binding processor for processing and + * immediately returns the context. + * + * @param aBindingProcessor + */ + public ProcessingContext process(BindingProcessor aBindingProcessor); + + /** + * Removes a formerly added (by calling the process method) binding processor. + * @param bindingProcessor must not be null + */ + public void removeBindingProcessor(Id sessionId); + + /** + * A set of all managed binding processors. + * @return + */ + public Set<Id> getManagedIds(); + public void shutdown(); - public void shutdownNow();
+ public void shutdownNow(); }
\ No newline at end of file diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/binding/BindingProcessorManagerImpl.java b/bkucommon/src/main/java/at/gv/egiz/bku/binding/BindingProcessorManagerImpl.java index 11f5a160..cc1b7532 100644 --- a/bkucommon/src/main/java/at/gv/egiz/bku/binding/BindingProcessorManagerImpl.java +++ b/bkucommon/src/main/java/at/gv/egiz/bku/binding/BindingProcessorManagerImpl.java @@ -53,8 +53,9 @@ public class BindingProcessorManagerImpl implements BindingProcessorManager { private STALFactory stalFactory; private SLCommandInvoker commandInvokerClass; private ExecutorService executorService; - private Map<Id, MapEntityWrapper> bindingProcessorMap = Collections - .synchronizedMap(new HashMap<Id, MapEntityWrapper>()); + private Map<Id, ProcessingContext> contextMap = Collections.synchronizedMap(new HashMap<Id, ProcessingContext>()); +// private Map<Id, MapEntityWrapper> bindingProcessorMap = Collections +// .synchronizedMap(new HashMap<Id, MapEntityWrapper>()); /** * Container to hold a Future and Bindingprocessor object as map value. @@ -62,39 +63,39 @@ public class BindingProcessorManagerImpl implements BindingProcessorManager { * @author wbauer * @see BindingProcessorManagerImpl#bindingProcessorMap */ - static class MapEntityWrapper { - private Future<?> future; - private BindingProcessor bindingProcessor; - - public MapEntityWrapper(Future<?> future, BindingProcessor bindingProcessor) { - if ((bindingProcessor == null) || (future == null)) { - throw new NullPointerException("Argument must not be null"); - } - this.bindingProcessor = bindingProcessor; - this.future = future; - } - - public Future<?> getFuture() { - return future; - } - - public BindingProcessor getBindingProcessor() { - return bindingProcessor; - } - - public int hashCode() { - return bindingProcessor.getId().hashCode(); - } - - public boolean equals(Object other) { - if (other instanceof MapEntityWrapper) { - MapEntityWrapper o = (MapEntityWrapper) other; - return (o.bindingProcessor.getId().equals(bindingProcessor.getId())); - } else { - return false; - } - } - } +// static class MapEntityWrapper { +// private Future<?> future; +// private BindingProcessor bindingProcessor; +// +// public MapEntityWrapper(Future<?> future, BindingProcessor bindingProcessor) { +// if ((bindingProcessor == null) || (future == null)) { +// throw new NullPointerException("Argument must not be null"); +// } +// this.bindingProcessor = bindingProcessor; +// this.future = future; +// } +// +// public Future<?> getFuture() { +// return future; +// } +// +// public BindingProcessor getBindingProcessor() { +// return bindingProcessor; +// } +// +// public int hashCode() { +// return bindingProcessor.getId().hashCode(); +// } +// +// public boolean equals(Object other) { +// if (other instanceof MapEntityWrapper) { +// MapEntityWrapper o = (MapEntityWrapper) other; +// return (o.bindingProcessor.getId().equals(bindingProcessor.getId())); +// } else { +// return false; +// } +// } +// } /** * @@ -157,17 +158,24 @@ public class BindingProcessorManagerImpl implements BindingProcessorManager { public void shutdownNow() { log.info("Shutting down the BindingProcessorManager NOW!"); executorService.shutdownNow(); - log.debug("Number of binding prcessors currently managed: " - + bindingProcessorMap.size()); + log.debug("Number of binding contexts currently managed: " + + contextMap.size()); +// + bindingProcessorMap.size()); if (log.isDebugEnabled()) { - for (Iterator<MapEntityWrapper> it = bindingProcessorMap.values() - .iterator(); it.hasNext();) { - MapEntityWrapper entry = it.next(); - log.debug(entry.getBindingProcessor().getId() + ": isDone: " - + entry.getFuture().isDone()); - log.debug(entry.getBindingProcessor().getId() + ": isCanceled: " - + entry.getFuture().isCancelled()); + for (ProcessingContext ctx : contextMap.values()) { + Id bpId = ctx.getBindingProcessor().getId(); + Future future = ctx.getFuture(); + log.debug(bpId + " cancelled: " + future.isCancelled()); + log.debug(bpId + " done: " + future.isDone()); } +// for (Iterator<MapEntityWrapper> it = bindingProcessorMap.values() +// .iterator(); it.hasNext();) { +// MapEntityWrapper entry = it.next(); +// log.debug(entry.getBindingProcessor().getId() + ": isDone: " +// + entry.getFuture().isDone()); +// log.debug(entry.getBindingProcessor().getId() + ": isCanceled: " +// + entry.getFuture().isCancelled()); +// } } } @@ -216,17 +224,22 @@ public class BindingProcessorManagerImpl implements BindingProcessorManager { * @return the bindingprocessor object for this id or null if no * bindingprocessor was found. */ + @Override public BindingProcessor getBindingProcessor(Id aId) { - if (bindingProcessorMap.get(aId) != null) { - return bindingProcessorMap.get(aId).getBindingProcessor(); +// if (bindingProcessorMap.get(aId) != null) { +// return bindingProcessorMap.get(aId).getBindingProcessor(); + ProcessingContext ctx = contextMap.get(aId); + if (ctx != null) { + return ctx.getBindingProcessor(); } else { return null; } } - /**
- *
+ /** + * */ + @Override public void setSTALFactory(STALFactory aStalFactory) { if (aStalFactory == null) { throw new NullPointerException("Cannot set STALFactory to null"); @@ -236,12 +249,17 @@ public class BindingProcessorManagerImpl implements BindingProcessorManager { /** * Causes the BindingProcessorManager to manage the provided BindingProcessor + * Creates a processing context, + * schedules the provided binding processor for processing and + * immediately returns the context. * * @param aBindingProcessor * must not be null */ - public void process(BindingProcessor aBindingProcessor) { - if (bindingProcessorMap.containsKey(aBindingProcessor.getId())) { + @Override + public ProcessingContext process(BindingProcessor aBindingProcessor) { + if (contextMap.containsKey(aBindingProcessor.getId())) { +// if (bindingProcessorMap.containsKey(aBindingProcessor.getId())) { log.fatal("Clashing ids, cannot process bindingprocessor with id:" + aBindingProcessor.getId()); throw new SLRuntimeException( @@ -250,8 +268,11 @@ public class BindingProcessorManagerImpl implements BindingProcessorManager { } log.debug("processing bindingprocessor: " + aBindingProcessor.getId()); Future<?> f = executorService.submit(aBindingProcessor); - bindingProcessorMap.put(aBindingProcessor.getId(), new MapEntityWrapper(f, - aBindingProcessor)); + ProcessingContext ctx = new ProcessingContext(aBindingProcessor, f); + contextMap.put(aBindingProcessor.getId(), ctx); +// bindingProcessorMap.put(aBindingProcessor.getId(), new MapEntityWrapper(f, +// aBindingProcessor)); + return ctx; } @Override @@ -262,26 +283,38 @@ public class BindingProcessorManagerImpl implements BindingProcessorManager { @Override public void removeBindingProcessor(Id sessionId) { log.debug("Removing binding processor: " + sessionId); - MapEntityWrapper wrapper = bindingProcessorMap.get(sessionId); - if (wrapper == null) { + ProcessingContext ctx = contextMap.get(sessionId); + if (ctx == null) { return; } - Future<?> f = wrapper.getFuture(); + Future f = ctx.getFuture(); + +// MapEntityWrapper wrapper = bindingProcessorMap.get(sessionId); +// if (wrapper == null) { +// return; +// } +// Future<?> f = wrapper.getFuture(); if (!f.isDone()) { f.cancel(true); } - bindingProcessorMap.remove(sessionId); + contextMap.remove(sessionId); +// bindingProcessorMap.remove(sessionId); } @Override public Set<Id> getManagedIds() { Set<Id> result = new HashSet<Id>(); - synchronized (bindingProcessorMap) { - for (Iterator<Id> it = bindingProcessorMap.keySet().iterator(); it - .hasNext();) { - result.add(it.next()); + synchronized (contextMap) { + for (Id id : contextMap.keySet()) { + result.add(id); } } +// synchronized (bindingProcessorMap) { +// for (Iterator<Id> it = bindingProcessorMap.keySet().iterator(); it +// .hasNext();) { +// result.add(it.next()); +// } +// } return result; } }
\ No newline at end of file diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/binding/ProcessingContext.java b/bkucommon/src/main/java/at/gv/egiz/bku/binding/ProcessingContext.java new file mode 100644 index 00000000..ae7f01eb --- /dev/null +++ b/bkucommon/src/main/java/at/gv/egiz/bku/binding/ProcessingContext.java @@ -0,0 +1,39 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package at.gv.egiz.bku.binding; + +import java.util.Hashtable; +import java.util.Map; +import java.util.concurrent.Future; + +/** + * BindingContext? + * RequestBindingContext? + * + * @author clemens + */ +public class ProcessingContext { + + public static final String BINDING_PROCESSOR = "binding.processor"; + public static final String FUTURE = "future"; + + protected Map<String, Object> properties = new Hashtable<String, Object>(); + + public ProcessingContext(BindingProcessor bp, Future future) { + properties.put(BINDING_PROCESSOR, bp); + properties.put(FUTURE, future); + } + + + + public BindingProcessor getBindingProcessor() { + return (BindingProcessor) properties.get(BINDING_PROCESSOR); + } + + public Future getFuture() { + return (Future) properties.get(FUTURE); + } +} |