You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by gd...@apache.org on 2004/10/20 08:23:57 UTC

svn commit: rev 55133 - in webservices/axis/trunk/java/dev/scratch/gdaniels: . EngineToy EngineToy/src EngineToy/src/axis2 EngineToy/src/axis2/config EngineToy/src/axis2/description EngineToy/src/axis2/handlers EngineToy/src/axis2/meps EngineToy/src/axis2/om EngineToy/src/axis2/phases EngineToy/src/axis2/transport EngineToy/src/axis2/transport/http EngineToy/src/test

Author: gdaniels
Date: Tue Oct 19 23:23:56 2004
New Revision: 55133

Added:
   webservices/axis/trunk/java/dev/scratch/gdaniels/
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/AxisEngine.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Constants.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/ExecutionChain.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/ExecutionFrame.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Handler.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/HandlerDescriptor.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Message.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/MessageContext.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Phase.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Provider.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Responder.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/config/
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/config/ChainSupplier.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/config/HandlerSupplier.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/config/Registry.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/config/Supplier.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/description/
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/description/Service.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/handlers/
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/handlers/BasicHandler.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/handlers/Chain.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/handlers/NullHandler.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/meps/
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/om/
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/om/OMElement.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/phases/
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/phases/DispatchPhase.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/transport/
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/transport/Transport.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/transport/http/
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/transport/http/HTTPConstants.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/transport/http/HTTPListener.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/transport/http/HTTPResponder.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/test/
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/test/AsyncTester.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/test/SampleHandler.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/test/ServiceDispatcher.java
   webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/test/Tester.java
Log:
Add some very basic sample code demoing some engine concepts.  In particular:

* Phased handler chains
* Responders
* Basic flow
* The ability to pause/restart MessageContexts

Run test.Tester to try it out.  Cleanup and more comprehensive tests on the way.

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/AxisEngine.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/AxisEngine.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,71 @@
+package axis2;
+
+import axis2.config.Registry;
+import axis2.config.Supplier;
+import axis2.config.HandlerSupplier;
+import axis2.handlers.NullHandler;
+import axis2.phases.DispatchPhase;
+import axis2.transport.Transport;
+
+import java.util.List;
+
+/**
+ * Toy AxisEngine
+ */
+public class AxisEngine {
+    static final NullHandler nullHandler = new NullHandler();
+
+    Registry registry;
+
+    public void init() {
+    }
+
+    public void setRegistry(Registry registry) {
+        this.registry = registry;
+    }
+
+    public void send(MessageContext context) throws Exception {
+        
+    }
+
+    public boolean receive(MessageContext context) throws Exception {
+        // An ExecutionChain is the set of Handlers which will be invoked
+        // for THIS particular interaction/MessageContext.  This is a
+        // particular mechanism for acheiving stateful pause/restart, and
+        // not necessarily the best one.
+        ExecutionChain chain = new ExecutionChain();
+
+        String transportName = context.getTransport();
+
+        // Receiving is always a matter of running the transport handlers first
+        Transport transport = registry.getTransport(transportName);
+        if (transport != null) {
+            List receiveHandlers = transport.getReceiveHandlers();
+            if (receiveHandlers != null && !receiveHandlers.isEmpty()) {
+                chain.addPhase("transport", new Phase());
+                chain.addHandlers(receiveHandlers);
+            }
+        }
+
+        chain.addPhase(Constants.GLOBAL_RECEIVE, new Phase());
+        chain.addPhase("dispatch", new DispatchPhase());
+        chain.addPhase("service", new Phase());
+
+        Supplier supplier = registry.getSupplier(Constants.GLOBAL_RECEIVE);
+        supplier.deployToExecutionChainPhase(chain, Constants.GLOBAL_RECEIVE);
+
+        supplier = registry.getSupplier("dispatch");
+        supplier.deployToExecutionChainPhase(chain, "dispatch");
+
+        Provider provider = new Provider();
+        supplier = new HandlerSupplier(provider);
+        supplier.deployToExecutionChainPhase(chain, "service"); 
+
+        context.setChain(chain);
+
+        // Set the chain back to the beginning.
+        chain.reset();
+
+        return context.start();
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Constants.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Constants.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,9 @@
+package axis2;
+
+/**
+ * Constants
+ */
+public interface Constants {
+    static final String GLOBAL_RECEIVE = "global.receive";
+    static final String GLOBAL_SEND = "global.send";
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/ExecutionChain.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/ExecutionChain.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,95 @@
+package axis2;
+
+import java.util.*;
+
+/**
+ * ExecutionChain
+ */
+public class ExecutionChain {
+    List phases;
+    Map phasesByName;
+    Phase currentPhase;
+    int phaseIndex = 0;
+    int handlerIndex = 0;
+
+    public ExecutionChain() {
+        phases = new LinkedList();
+        phasesByName = new HashMap();
+    }
+
+    public void addHandler(Handler handler) {
+        if (currentPhase == null) {
+            // Make a new anonymous Phase?
+        }
+        currentPhase.addHandler(handler);
+    }
+
+    public void addPhase(String name, Phase phase) {
+        phases.add(phase);
+        currentPhase = phase;
+        phasesByName.put(name, phase);
+    }
+
+    public void addHandlerToPhase(String phaseName, Handler handler) throws Exception {
+        Phase phase = (Phase)phasesByName.get(phaseName);
+        if (phase == null) {
+            throw new Exception("No such phase!");
+        }
+        phase.addHandler(handler);
+    }
+
+    public void reset() {
+        currentPhase = (Phase)phases.get(0);
+    }
+
+    public boolean invoke(MessageContext context) throws Exception {
+        int ret = 0;
+        while (true) {
+            ret = currentPhase.step(context, handlerIndex);
+            if (ret == -1) {
+                return false; // paused
+            }
+
+            if (ret == 0) {
+                // done with this phase.
+                handlerIndex = 0;
+                phaseIndex++;
+                if (phases.size() == phaseIndex)
+                    return true;  // finished
+                currentPhase = (Phase)phases.get(phaseIndex);
+                continue;
+            }
+
+            handlerIndex = ret;
+        }
+    }
+
+    /**
+     * Convenience method to add all Handlers in a list
+     * @param handlers
+     */
+    public void addHandlers(List handlers) {
+        for (Iterator i = handlers.iterator(); i.hasNext();) {
+            Handler handler = (Handler) i.next();
+            addHandler(handler);
+        }
+    }
+
+    /**
+     * Convenience method to add Handlers to a given Phase from a List
+     *
+     * @param phaseName
+     * @param handlers
+     * @throws Exception
+     */
+    public void addHandlersToPhase(String phaseName, List handlers) throws Exception {
+        Phase phase = (Phase)phasesByName.get(phaseName);
+        if (phase == null) {
+            throw new Exception("No such phase '" + phaseName + "'");
+        }
+        for (Iterator i = handlers.iterator(); i.hasNext();) {
+            Handler handler = (Handler) i.next();
+            phase.addHandler(handler);
+        }
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/ExecutionFrame.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/ExecutionFrame.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,37 @@
+package axis2;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Glen
+ * Date: Oct 19, 2004
+ * Time: 1:11:51 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class ExecutionFrame {
+    Handler hander;
+    Object context;
+
+    public ExecutionFrame(Handler hander, Object context) {
+        this.hander = hander;
+        this.context = context;
+    }
+
+    public ExecutionFrame() {
+    }
+
+    public Handler getHander() {
+        return hander;
+    }
+
+    public void setHander(Handler hander) {
+        this.hander = hander;
+    }
+
+    public Object getContext() {
+        return context;
+    }
+
+    public void setContext(Object context) {
+        this.context = context;
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Handler.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Handler.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,21 @@
+package axis2;
+
+/**
+ * The Handler interface.
+ */
+public interface Handler {
+    /**
+     *
+     * @param context
+     * @return
+     * @throws Exception
+     */
+    boolean invoke(MessageContext context) throws Exception;
+
+    void setOption(String name, Object value);
+    Object getOption(String name);
+
+    String getName();
+
+    void setName(String name);
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/HandlerDescriptor.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/HandlerDescriptor.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,27 @@
+package axis2;
+
+import java.util.Map;
+
+/**
+ * HandlerDescriptor
+ */
+public class HandlerDescriptor {
+    String handlerName;
+    Map options;
+
+    public String getHandlerName() {
+        return handlerName;
+    }
+
+    public void setHandlerName(String handlerName) {
+        this.handlerName = handlerName;
+    }
+
+    public Map getOptions() {
+        return options;
+    }
+
+    public void setOptions(Map options) {
+        this.options = options;
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Message.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Message.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,23 @@
+package axis2;
+
+import axis2.om.OMElement;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Glen
+ * Date: Aug 29, 2004
+ * Time: 10:12:18 AM
+ * To change this template use File | Settings | File Templates.
+ */
+public class Message {
+    MessageContext context;
+    OMElement root;
+
+    public OMElement getContent() {
+        return root;
+    }
+
+    public void setContent(OMElement root) {
+        this.root = root;
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/MessageContext.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/MessageContext.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,102 @@
+
+package axis2 ;
+
+import axis2.description.Service;
+import axis2.handlers.Chain;
+
+import java.util.HashMap;
+import java.util.Stack;
+import java.util.EmptyStackException;
+
+public class MessageContext {
+    /** The transport name */
+    String transport;
+
+    Responder responder;
+    AxisEngine engine;
+    Message message;
+    Service service;
+
+    /** The currently executing  */
+    ExecutionChain chain;
+
+    Phase currentPhase;
+    Handler next;
+
+    HashMap properties = new HashMap();
+
+    public boolean start() throws Exception {
+        return chain.invoke(this);
+    }
+    public boolean resume() throws Exception {
+        return chain.invoke(this);
+    }
+
+    public void setChain(ExecutionChain c) {
+        chain = c;
+    }
+
+    public AxisEngine getAxisEngine() {
+        return engine;
+    }
+
+    public void setAxisEngine(AxisEngine engine) {
+        this.engine = engine;
+    }
+
+    public Responder getResponder() {
+        return responder;
+    }
+
+    public void setResponder(Responder responder) {
+        this.responder = responder;
+    }
+
+    public Message getMessage() {
+        return message;
+    }
+
+    public void setMessage(Message message) {
+        this.message = message;
+    }
+
+    public void setProperty(String name, Object value) {
+        properties.put(name, value);
+    }
+
+    public Object getProperty(String name) {
+        return properties.get(name);
+    }
+
+    public boolean isPropertyTrue(String name) {
+        Object val = properties.get(name);
+        if (val == null) return false;
+        if (val instanceof Boolean) return ((Boolean)val).booleanValue();
+        if (val instanceof String) return ((String)val).equalsIgnoreCase("true");
+        return false;
+    }
+
+    public Phase getCurrentPhase() {
+        return currentPhase;
+    }
+
+    public void setCurrentPhase(Phase currentPhase) {
+        this.currentPhase = currentPhase;
+    }
+
+    public Service getService() {
+        return service;
+    }
+
+    public void setService(Service service) {
+        this.service = service;
+    }
+
+    public String getTransport() {
+        return transport;
+    }
+
+    public void setTransport(String transport) {
+        this.transport = transport;
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Phase.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Phase.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,56 @@
+package axis2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A Phase is a special kind of Handler which contains other Handlers
+ * and has an explicit step where it checks pre- and post-conditions.
+ * Subclasses implement checkPreconditions and checkPostconditions in
+ * order to do this work, and throw an appropriate Exception if the
+ * MessageContext does not indicate a valid state for the phase.
+ */
+public class Phase {
+    protected List handlers = new ArrayList();
+
+    public void checkPreconditions(MessageContext context) throws Exception {
+    }
+
+    public void checkPostconditions(MessageContext context) throws Exception {
+    }
+
+    public int step(MessageContext context, int start) throws Exception {
+        if (start == 0) {
+            checkPreconditions(context);
+            context.setCurrentPhase(this);
+        }
+
+        if (start == handlers.size()) {
+            checkPostconditions(context);
+            return 0; // finished
+        }
+
+        Handler handler = (Handler)handlers.get(start);
+        if (handler.invoke(context)) {
+            // Success, move on
+            start++;
+            return start;
+        }
+
+        return -1; // pause
+    }
+
+    public List getHandlers() {
+        return handlers;
+    }
+
+    public void setHandlers(List handlers) {
+        if (handlers == null)
+            throw new NullPointerException();
+        this.handlers = handlers;
+    }
+
+    public void addHandler(Handler handler) {
+        handlers.add(handler);
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Provider.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Provider.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,27 @@
+package axis2;
+
+import axis2.handlers.BasicHandler;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Glen
+ * Date: Aug 22, 2004
+ * Time: 10:11:48 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class Provider extends BasicHandler {
+    public boolean invoke(MessageContext msgContext) throws Exception {
+        // Make sure there's a responder, if we're expecting to generate a response
+        Responder resp = msgContext.getResponder();
+        if (resp == null) {
+            throw new Exception("No responder in MessageContext!");
+        }
+
+        // call java class
+
+        // make response message
+        
+        resp.invoke(msgContext);
+        return true;
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Responder.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/Responder.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,13 @@
+package axis2;
+
+import axis2.handlers.BasicHandler;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Glen
+ * Date: Aug 22, 2004
+ * Time: 10:07:26 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public interface Responder extends Handler {
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/config/ChainSupplier.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/config/ChainSupplier.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,24 @@
+package axis2.config;
+
+import axis2.ExecutionChain;
+import axis2.handlers.Chain;
+
+/**
+ * ChainSupplier
+ */
+public class ChainSupplier implements Supplier {
+    Chain chain;
+
+    public ChainSupplier(Chain chain) {
+        this.chain = chain;
+    }
+
+    public void deployToExecutionChain(ExecutionChain chain) {
+        chain.addHandlers(this.chain.getHandlers());
+    }
+
+    public void deployToExecutionChainPhase(ExecutionChain chain, String phase)
+            throws Exception {
+        chain.addHandlersToPhase(phase, this.chain.getHandlers());
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/config/HandlerSupplier.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/config/HandlerSupplier.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,23 @@
+package axis2.config;
+
+import axis2.ExecutionChain;
+import axis2.Handler;
+
+/**
+ * HandlerSupplier
+ */
+public class HandlerSupplier implements Supplier {
+    Handler handler;
+
+    public HandlerSupplier(Handler handler) {
+        this.handler = handler;
+    }
+
+    public void deployToExecutionChain(ExecutionChain chain) {
+        chain.addHandler(handler);
+    }
+
+    public void deployToExecutionChainPhase(ExecutionChain chain, String phase) throws Exception {
+        chain.addHandlerToPhase(phase, handler);
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/config/Registry.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/config/Registry.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,30 @@
+package axis2.config;
+
+import axis2.transport.Transport;
+import axis2.Handler;
+
+import java.util.HashMap;
+
+/**
+ * A completely cheesy registry
+ */
+public class Registry {
+    HashMap transports = new HashMap();
+    HashMap suppliers = new HashMap();
+
+    public Transport getTransport(String name) {
+        return (Transport)transports.get(name);
+    }
+
+    public void deployTransport(String name, Transport transport) {
+        transports.put(name, transport);
+    }
+
+    public Supplier getSupplier(String name) {
+        return (Supplier)suppliers.get(name);
+    }
+
+    public void deployHandler(String name, Supplier handler) {
+        suppliers.put(name, handler);
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/config/Supplier.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/config/Supplier.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,12 @@
+package axis2.config;
+
+import axis2.ExecutionChain;
+
+/**
+ * Supplier
+ */
+public interface Supplier {
+    void deployToExecutionChain(ExecutionChain chain);
+    void deployToExecutionChainPhase(ExecutionChain chain, String phase)
+            throws Exception;
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/description/Service.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/description/Service.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,19 @@
+package axis2.description;
+
+import axis2.Handler;
+import axis2.MessageContext;
+import axis2.handlers.BasicHandler;
+
+/**
+ * Service represents a web service
+ */
+public class Service extends BasicHandler {
+    /**
+     * @param context
+     * @return
+     * @throws Exception
+     */
+    public boolean invoke(MessageContext context) throws Exception {
+        return true;
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/handlers/BasicHandler.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/handlers/BasicHandler.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,30 @@
+package axis2.handlers;
+
+import axis2.Handler;
+import axis2.MessageContext;
+
+import java.util.HashMap;
+
+/**
+ * BasicHandler, which has boilerplate implementaion.
+ */
+public abstract class BasicHandler implements Handler {
+    protected HashMap options = new HashMap();
+    protected String name;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setOption(String name, Object value) {
+        options.put(name, value);
+    }
+
+    public Object getOption(String name) {
+        return options.get(name);
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/handlers/Chain.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/handlers/Chain.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,22 @@
+package axis2.handlers;
+
+import axis2.Handler;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ */
+public class Chain {
+    protected String name;
+    protected List handlers = new ArrayList();
+
+    public void addHandler(Handler h) {
+        handlers.add(h);
+    }
+
+    public List getHandlers() {
+        return handlers;
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/handlers/NullHandler.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/handlers/NullHandler.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,16 @@
+package axis2.handlers;
+
+import axis2.MessageContext;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Glen
+ * Date: Sep 5, 2004
+ * Time: 6:01:19 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class NullHandler extends BasicHandler {
+    public boolean invoke(MessageContext context) throws Exception {
+        return true; // keep going, do nothing
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/om/OMElement.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/om/OMElement.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,19 @@
+package axis2.om;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Glen
+ * Date: Aug 29, 2004
+ * Time: 10:12:40 AM
+ * To change this template use File | Settings | File Templates.
+ */
+public class OMElement {
+    Object value;
+
+    public Object getObjectValue() {
+        return value;
+    }
+    public void setObjectValue(Object value) {
+        this.value = value;
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/phases/DispatchPhase.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/phases/DispatchPhase.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,23 @@
+package axis2.phases;
+
+import axis2.Phase;
+import axis2.MessageContext;
+import axis2.Handler;
+import axis2.description.Service;
+
+/**
+ * The Dispatch Phase implementation
+ */
+public class DispatchPhase extends Phase {
+    public void checkPreconditions(MessageContext context) throws Exception {
+        System.out.println("Checking preconditions for DispatchPhase...");
+    }
+
+    public void checkPostconditions(MessageContext context) throws Exception {
+        System.out.println("Checking postconditions for DispatchPhase...");
+        Service service = context.getService();
+        if (service == null)
+            throw new Exception("No service by end of Dispatch phase!");
+        System.out.println("Service is '" + service.getName() + "'");
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/transport/Transport.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/transport/Transport.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,30 @@
+package axis2.transport;
+
+import axis2.Handler;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A Transport contains sender side and receiver side
+ */
+public class Transport {
+    List sendHandlers = new ArrayList();
+    List receiveHandlers = new ArrayList();
+
+    public List getSendHandlers() {
+        return sendHandlers;
+    }
+
+    public void addSendHandler(Handler handler) {
+        sendHandlers.add(handler);
+    }
+
+    public List getReceiveHandlers() {
+        return receiveHandlers;
+    }
+
+    public void addReceiveHandler(Handler handler) {
+        receiveHandlers.add(handler);
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/transport/http/HTTPConstants.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/transport/http/HTTPConstants.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,12 @@
+package axis2.transport.http;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Glen
+ * Date: Aug 29, 2004
+ * Time: 10:58:21 AM
+ * To change this template use File | Settings | File Templates.
+ */
+public interface HTTPConstants {
+    static final String RESPONSE_SENT = "http.response-sent";
+}
\ No newline at end of file

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/transport/http/HTTPListener.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/transport/http/HTTPListener.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,57 @@
+package axis2.transport.http;
+
+import axis2.AxisEngine;
+import axis2.Message;
+import axis2.MessageContext;
+import axis2.Responder;
+import axis2.om.OMElement;
+import test.ServiceDispatcher;
+
+/**
+ * A sample HTTP listener class
+ */
+public class HTTPListener implements HTTPConstants {
+    AxisEngine engine;
+
+    public void test(String msg) {
+        MessageContext context = new MessageContext();
+        context.setTransport("http");
+        
+        Message message = new Message();
+        OMElement om = new OMElement();
+        om.setObjectValue(msg);
+        message.setContent(om);
+        context.setMessage(message);
+
+        // Tell the dispatcher what service name to use...
+        context.setProperty(ServiceDispatcher.SERVICE_NAME, "AxisTestService");
+
+        // Drop an appropriate responder in the MessageContext
+        Responder responder = new HTTPResponder();
+        context.setResponder(responder);
+
+        boolean ret = false;
+        try {
+            ret = engine.receive(context);
+        } catch (Exception e) {
+            // Handle exception
+            e.printStackTrace();
+        }
+
+        if (ret == false) {
+            System.out.println("MessageContext was paused - I can't deal with that!");
+            return;
+        }
+
+        // If there was already a response, do nothing.  If not (as would be the case
+        // for one-way messages or messages whose responses were routed elsewhere),
+        // return a 202.
+        if (!context.isPropertyTrue(RESPONSE_SENT)) {
+            System.out.println("HTTPListener Sending 202");
+        }
+    }
+
+    public void setEngine(AxisEngine engine) {
+        this.engine = engine;
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/transport/http/HTTPResponder.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/axis2/transport/http/HTTPResponder.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,21 @@
+package axis2.transport.http;
+
+import axis2.MessageContext;
+import axis2.Responder;
+import axis2.handlers.BasicHandler;
+
+/**
+ * HTTPResponder
+ */
+public class HTTPResponder extends BasicHandler implements Responder, HTTPConstants {
+    public boolean invoke(MessageContext context) throws Exception {
+        // The message context currently contains the response message,
+        // so what we need to do here is send it as the servlet response.
+        context.setProperty(RESPONSE_SENT, Boolean.TRUE);
+
+        // put the right transport stuff on the end of the chain
+
+        System.out.println("HTTPResponder : Writing response... (no 202 should appear)");
+        return true;
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/test/AsyncTester.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/test/AsyncTester.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,16 @@
+package test;
+
+/**
+ * Demo async behavior
+ */
+public class AsyncTester {
+    public static void main(String[] args) {
+        // This will be a demo of asynchronous server processing.
+
+        // Receive a message on one thread
+
+        // Pause processing so a worker thread can do the actual callout to a service method
+
+        // Worker thread sends response
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/test/SampleHandler.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/test/SampleHandler.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,37 @@
+package test;
+
+import axis2.Handler;
+import axis2.MessageContext;
+import axis2.handlers.BasicHandler;
+
+/**
+ * SampleHandler
+ */
+public class SampleHandler extends BasicHandler {
+    public static final String PAUSE = "SampleHandler.pause";
+
+    /**
+     * @param context
+     * @return
+     * @throws Exception
+     */
+    public boolean invoke(MessageContext context) throws Exception {
+        System.out.println(name + ": invoke()");
+        // If we're in the midst of running (i.e. this is the second
+        // time we've been called), remove the marker from the MC
+        // and continue.
+        if (context.getProperty(PAUSE) != null) {
+            context.setProperty(PAUSE, null);
+            return true;
+        }
+
+        // Check our pause option.  If it's not there
+        // or false, just return success.
+        Boolean ret = (Boolean)getOption(PAUSE);
+        if (ret == null || ret.booleanValue() == false)
+            return true;
+
+        context.setProperty(PAUSE, Boolean.TRUE);
+        return false;
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/test/ServiceDispatcher.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/test/ServiceDispatcher.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,25 @@
+package test;
+
+import axis2.handlers.BasicHandler;
+import axis2.MessageContext;
+import axis2.description.Service;
+
+/**
+ * ServiceDispatcher
+ */
+public class ServiceDispatcher extends BasicHandler {
+    public static final String SERVICE_NAME = "serviceName";
+
+    /**
+     * @param context
+     * @return
+     * @throws Exception
+     */
+    public boolean invoke(MessageContext context) throws Exception {
+        System.out.println(name + ": invoke()");
+        Service service = new Service();
+        service.setName((String)context.getProperty(SERVICE_NAME));
+        context.setService(service);
+        return true;
+    }
+}

Added: webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/test/Tester.java
==============================================================================
--- (empty file)
+++ webservices/axis/trunk/java/dev/scratch/gdaniels/EngineToy/src/test/Tester.java	Tue Oct 19 23:23:56 2004
@@ -0,0 +1,57 @@
+package test;
+
+import axis2.transport.http.HTTPListener;
+import axis2.transport.Transport;
+import axis2.AxisEngine;
+import axis2.Handler;
+import axis2.Constants;
+import axis2.handlers.Chain;
+import axis2.config.Registry;
+import axis2.config.ChainSupplier;
+import axis2.config.HandlerSupplier;
+
+/**
+ * Simple test simulating an HTTP request
+ */
+public class Tester {
+    public static void main(String[] args) {
+        HTTPListener listener = new HTTPListener();
+
+        AxisEngine engine = new AxisEngine();
+        Registry registry = new Registry();
+        engine.setRegistry(registry);
+
+        Transport httpTransport = new Transport();
+        Handler h = new SampleHandler();
+        h.setName("HTTP Transport Handler");
+        httpTransport.addReceiveHandler(h);
+        registry.deployTransport("http", httpTransport);
+
+        // Create a few handlers for the global Phase
+        h = new SampleHandler();
+        Chain chain = new Chain();
+        h.setName("Handler 1");
+        chain.addHandler(h);
+
+        h = new SampleHandler();
+        h.setName("Handler 2");
+        // Uncomment this to play with pausing the MC
+        // h.setOption(SampleHandler.PAUSE, Boolean.TRUE);
+        chain.addHandler(h);
+
+        h = new SampleHandler();
+        h.setName("Handler 3");
+        chain.addHandler(h);
+
+        registry.deployHandler(Constants.GLOBAL_RECEIVE, new ChainSupplier(chain));
+
+        // Create a dispatcher which goes into the dispatch Phase
+        h = new ServiceDispatcher();
+        h.setName("Dispatcher");
+        registry.deployHandler("dispatch", new HandlerSupplier(h));
+
+        listener.setEngine(engine);
+
+        listener.test("hey there");
+    }
+}