[jboss-svn-commits] JBL Code SVN: r34830 - in labs/jbosstm/trunk/XTS/WS-C/dev: src10/com/arjuna and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Aug 23 09:12:14 EDT 2010
Author: adinn
Date: 2010-08-23 09:12:14 -0400 (Mon, 23 Aug 2010)
New Revision: 34830
Added:
labs/jbosstm/trunk/XTS/WS-C/dev/src10/com/arjuna/services/
labs/jbosstm/trunk/XTS/WS-C/dev/src10/com/arjuna/services/framework/
labs/jbosstm/trunk/XTS/WS-C/dev/src10/com/arjuna/services/framework/startup/
labs/jbosstm/trunk/XTS/WS-C/dev/src10/com/arjuna/services/framework/startup/Sequencer.java
Removed:
labs/jbosstm/trunk/XTS/WS-C/dev/src/com/arjuna/services/framework/startup/
Log:
relocated code which is now 1.0 only to 1.0 source tree
Copied: labs/jbosstm/trunk/XTS/WS-C/dev/src10/com/arjuna/services/framework/startup/Sequencer.java (from rev 34619, labs/jbosstm/trunk/XTS/WS-C/dev/src/com/arjuna/services/framework/startup/Sequencer.java)
===================================================================
--- labs/jbosstm/trunk/XTS/WS-C/dev/src10/com/arjuna/services/framework/startup/Sequencer.java (rev 0)
+++ labs/jbosstm/trunk/XTS/WS-C/dev/src10/com/arjuna/services/framework/startup/Sequencer.java 2010-08-23 13:12:14 UTC (rev 34830)
@@ -0,0 +1,276 @@
+package com.arjuna.services.framework.startup;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * A manager which allows initializaton callabcks for a suite of related web apps to be registered and subsequently
+ * run in a fixed order, irrespective of the order in which the application server initializes the web apps.
+ *
+ * Sequencer maintains two lists of independently managed callbacks, one for the WSCOOR 1.0 web app suite and one
+ * for the WSCOOR 1.1 web app suite. When registering a callback listeners or servlets for a given web app supply a
+ * sequence id and a web app id to identify i) the required sequence and ii) the entry in the sequence at which the
+ * callback should be stored. If a web app registers multiple callbacks they are stored in the sequence entry as a
+ * list in registration order. Once a web app has registered all its callbacks it closes the relevant entry. When
+ * all entries in a sequence have been closed the entries are traversed in order and the callbacks in each entry are
+ * triggered, thus ensuring that callbacks for web apps with lower sequence indices complete before callbacks with
+ * higher indices are called.
+ *
+ * This version also includes a global latch which can be used to ensure that no callbacks are not processed until a
+ * client lifts the latch. If the latch has already been lifted when the final element of a sequencer is closed the
+ * callbacks are run straight away. If the latch is closed then the sequencer is installed in a deferred list. When
+ * the latch is lifted the deferred list is scanned and callbacks are run for each sequencer found in the list.
+ *
+ * User: adinn
+ * Date: Nov 30, 2007
+ * Time: 4:05:13 PM
+ */
+public class Sequencer {
+ // public API
+
+ /*
+ * indices for the independent startup sequences which we manage
+ */
+
+ /**
+ * index of startup sequence used for serialization of WSCOOR 1.0 initialization callbacks
+ */
+ public static final int SEQUENCE_WSCOOR10 = 0;
+
+ /**
+ * index of startup sequence used for serialization of WSCOOR 1.1 initialization callbacks
+ */
+ public static final int SEQUENCE_WSCOOR11 = SEQUENCE_WSCOOR10 + 1;
+
+ /**
+ * count of independent startup sequences.
+ */
+ public static final int SEQUENCE_MAX = SEQUENCE_WSCOOR11 + 1;
+
+ /*
+ * indices for sequence of web apps we need to ensure start in the correct order
+ */
+
+ /**
+ * index of WS-C web app which initialises first in 1.0
+ */
+ public static final int WEBAPP_WSC10 = 0;
+
+ /**
+ * index of WS-T web app which initialises second in 1.0
+ */
+ public static final int WEBAPP_WST10 = WEBAPP_WSC10 + 1;
+
+ /**
+ * index of WSCF web app which intiialises third in 1.0
+ */
+ public static final int WEBAPP_WSCF10 = WEBAPP_WST10 + 1;
+
+ /**
+ * index of WSTX web app which initialises last in 1.0
+ */
+ public static final int WEBAPP_WSTX10 = WEBAPP_WSCF10 + 1;
+
+ /**
+ * there are four startup apps in the 1.0 sequence
+ */
+ public static final int WEBAPP_MAX10 = WEBAPP_WSTX10 + 1;
+
+ /**
+ * index of WS-C web app which initialises first in 1.1
+ */
+ public static final int WEBAPP_WSC11 = 0;
+
+ /**
+ * index of WS-T web app which initialises second in 1.1
+ */
+ public static final int WEBAPP_WST11 = WEBAPP_WSC11 + 1;
+
+ /**
+ * index of WSCF web app which intiialises third in 1.1
+ */
+ public static final int WEBAPP_WSCF11 = WEBAPP_WST11 + 1;
+
+ /**
+ * index of WSTX web app which intiialises fourth in 1.1
+ */
+ public static final int WEBAPP_WSTX11 = WEBAPP_WSCF11 + 1;
+
+ /**
+ * there are three startup apps in the 1.1 sequence
+ */
+ public static final int WEBAPP_MAX11 = WEBAPP_WSTX11 + 1;
+
+ /**
+ * notify end of callback registration for a web app associated with a given sequence
+ * @param webapp
+ */
+
+ public static final void close(int sequence, int webapp)
+ {
+ SEQUENCERS[sequence].close(webapp);
+ }
+
+ /**
+ * a callback class specialised by client web apps to execute startup code
+ */
+ public static abstract class Callback
+ {
+ /**
+ * construct a callback associated with a web app in a given startup sequence and automatically register it
+ * for subsequent execution
+ * @param sequence the sequence in which the web app is contained either WSCOOR_1_0 or WSCOOR_1_1
+ * @param webapp the web app with which this callback is associated
+ */
+ public Callback(int sequence, int webapp)
+ {
+ register(this, sequence, webapp);
+ }
+
+ /**
+ * a callback method which is invoked invoked per callback in registration order per web app in web app
+ * order per sequence as soon as all callback lists in the sequence have been closed
+ */
+ public abstract void run();
+ }
+
+ /**
+ * undo the latch which initially delays running of any callback sequences. this is provided
+ * to enable the Service start routine to configure any necessary parameters before the
+ * listener callbacks are run.
+ */
+ public static void unlatch()
+ {
+ synchronized (Sequencer.class) {
+ latched = false;
+ }
+
+ Iterator<Sequencer> iterator = deferred.iterator();
+
+ while (iterator.hasNext()) {
+ Sequencer sequencer = iterator.next();
+ sequencer.runCallbacks();
+ }
+ }
+
+ // private implementation
+
+ /**
+ * a global latch used to defer running of callbacks until the XTS service is ready to
+ * let them run
+ */
+ private static boolean latched = true;
+
+ /**
+ * a global list of all startup sequences
+ */
+ private static final Sequencer[] SEQUENCERS =
+ {
+ new Sequencer(WEBAPP_MAX10),
+ new Sequencer(WEBAPP_MAX11)
+ };
+
+
+ /**
+ * a list of sequencers for which invocation of callbacks has been deferred pending lifting of the sequencer latch
+ */
+
+ private static List<Sequencer> deferred = new ArrayList<Sequencer>();
+
+ /**
+ * method called by the Callback constructor to append a startup callback to the list for a web
+ * app in the appropriate startup sequence
+ * @param callback a callback to add to the list for the web app
+ * @param sequence the sequence in which the web app is contained either WSCOOR_1_0 or WSCOOR_1_1
+ * @param webapp the web app with which this callback is associated
+ */
+
+ private static final void register(Callback callback, int sequence, int webapp)
+ {
+ SEQUENCERS[sequence].register(callback, webapp);
+ }
+
+ /**
+ * each sequence contians an array of lists to hold callbacks registered per web app
+ */
+ private List<Callback>[] callbacks;
+
+ /**
+ * each sequence contains an array of flags per web app initially false and set to true when a web app has
+ * registered all its callbacks and called close
+ */
+ private boolean[] closed;
+
+ /**
+ * counter incremented each time a callback list is closed. callback processing is triggered when this reaches the
+ * sequence size count
+ */
+ private int closedCount;
+
+ /**
+ * count which sizes the callbacks list and closed array.
+ */
+ private int sequenceSize;
+
+ /**
+ * insert a callback into the list for a given web app associated with this sequence
+ * @param callback the callback to be registerd
+ * @param webapp the web app with which the callback is associated
+ */
+ private final void register(Callback callback, int webapp)
+ {
+ callbacks[webapp].add(callback);
+ }
+
+ /**
+ * close the callback list associated with a given web app in this sequence and, if this is the last unclosed
+ * list, trigger execution of all callbacks in sequence order
+ * @param webapp the web app whose callback list is to be closed
+ */
+ private final void close(int webapp)
+ {
+ closed[webapp] = true;
+ closedCount++;
+ if (closedCount == sequenceSize) {
+ runCallbacks();
+ }
+ }
+
+ private void runCallbacks()
+ {
+ // if the latch is lifted then run the callbacks otherwise defer them for the
+ // thread which raises the latch to run
+
+ synchronized(Sequencer.class) {
+ if (latched) {
+ deferred.add(this);
+ return;
+ }
+ }
+
+ for (int i = 0; i < sequenceSize; i++) {
+ Iterator<Callback> iter = callbacks[i].iterator();
+ while (iter.hasNext()) {
+ Callback cb = iter.next();
+ cb.run();
+ }
+ }
+ }
+
+ /**
+ * construct a Sequencer to manage registration and execution of callbacks associated with an ordered sequence
+ * of web apps
+ * @param sequenceSize count of the number of web apps for which callbacks are to be registered
+ */
+ private Sequencer(int sequenceSize)
+ {
+ this.sequenceSize = sequenceSize;
+ callbacks = new ArrayList[sequenceSize];
+ for (int i = 0; i < sequenceSize; i++) {
+ callbacks[i] = new ArrayList<Callback>();
+ }
+ closed = new boolean[sequenceSize];
+ closedCount = 0;
+ }
+}
More information about the jboss-svn-commits
mailing list