You are viewing a plain text version of this content. The canonical link for it is here.
Posted to muse-dev@ws.apache.org by wi...@apache.org on 2005/08/12 22:52:33 UTC

svn commit: r232389 [6/11] - in /webservices/muse/trunk/src/examples/client: ./ src/java/ src/java/org/ src/java/org/apache/ src/java/org/apache/ws/ src/java/org/apache/ws/client/ src/java/org/apache/ws/client/async/ src/java/org/apache/ws/client/model...

Added: webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/model/WsdmClientTestCase.java
URL: http://svn.apache.org/viewcvs/webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/model/WsdmClientTestCase.java?rev=232389&view=auto
==============================================================================
--- webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/model/WsdmClientTestCase.java (added)
+++ webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/model/WsdmClientTestCase.java Fri Aug 12 13:51:57 2005
@@ -0,0 +1,88 @@
+/*=============================================================================*
+ *  Confidential Copyright (c) 2004 Hewlett-Packard Development Company, L.P.  *
+ *=============================================================================*/
+package org.apache.ws.client.model;
+
+import java.lang.reflect.InvocationTargetException;
+import java.net.URL;
+
+import org.xmlsoap.schemas.ws.x2003.x03.addressing.EndpointReferenceType;
+
+import junit.framework.Assert;
+
+import org.apache.ws.client.model.impl.WsdmClientImpl;
+import org.apache.ws.resource.discovery.RegistrationManagerFactory;
+import org.apache.ws.test.AbstractOneAxisTestCase;
+
+/**
+ * @author wire
+ */
+public class WsdmClientTestCase extends AbstractOneAxisTestCase {
+    private static final int        CALL_TIMEOUT               = 300000;
+    private URL m_testEndpoint;
+	private WsdmClient m_wsdmClient;
+    
+	/*
+	 * @see TestCase#setUp()
+	 */
+	protected void setUp() throws Exception {
+		super.setUp();
+		m_testEndpoint=new URL(getAxisBaseUrl().toExternalForm());
+		WsdmClientFactory.clearGeneratedClassCache();
+		m_wsdmClient=WsdmClientFactory.create(WsdmClientFactory.AXIS_CLIENT_TYPE,m_testEndpoint.getHost()+":"+m_testEndpoint.getPort(),"axis");
+	    RegistrationManagerFactory.discoverResources(  );
+}
+
+	/*
+	 * @see TestCase#tearDown()
+	 */
+	protected void tearDown() throws Exception {
+		super.tearDown();
+	    RegistrationManagerFactory.shutdown(  );
+	}
+	
+	
+	/**
+	 * Objective: Test the ping method which returns a count in millis of
+	 * how long it takes for a simple call to be made to a server. Can be used
+	 * to display status or judge health of the system remotly.
+	 * @throws Exception
+	 */public void testPing() throws Exception{
+		long time=m_wsdmClient.ping();
+		Assert.assertTrue(time>0);
+	}
+	
+	/**
+	 * Objective: Use this client to get a set of Wsdm Resources. Verify 
+	 * they are returned and check their names.
+	 * @throws SecurityException
+	 * @throws IllegalArgumentException
+	 * @throws NoSuchMethodException
+	 * @throws IllegalAccessException
+	 * @throws InvocationTargetException
+	 * @throws Exception
+	 */
+	 public void testGetResources() throws SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, Exception{
+		WsdmResource[] resources=m_wsdmClient.getResources();
+		Assert.assertEquals(2,resources.length);
+		Assert.assertEquals("registry",resources[1].getName());
+		Assert.assertEquals("disk",resources[0].getName());
+	}
+	 
+	/**
+	 * Objective: Test the format of a returned Client Name.
+	 *
+	 */
+	 public void testGetName(){
+	     Assert.assertNotNull(m_wsdmClient.getName());
+	     Assert.assertTrue(m_wsdmClient.getName().startsWith("Server - 127.0.0.1"));
+	}
+	 
+	public void testFindInstance() throws Exception{
+	    WsdmClientImpl impl = (WsdmClientImpl)m_wsdmClient;
+	     EndpointReferenceType erp = impl.getErpFor("disk","1234");	     
+	     WsdmInstance instance=impl.findInstance(erp);
+	     Assert.assertNotNull(instance);
+	}
+	 
+}

Added: webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/model/WsdmInstanceTestCase.java
URL: http://svn.apache.org/viewcvs/webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/model/WsdmInstanceTestCase.java?rev=232389&view=auto
==============================================================================
--- webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/model/WsdmInstanceTestCase.java (added)
+++ webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/model/WsdmInstanceTestCase.java Fri Aug 12 13:51:57 2005
@@ -0,0 +1,109 @@
+/*=============================================================================*
+ *  Confidential Copyright (c) 2004 Hewlett-Packard Development Company, L.P.  *
+ *=============================================================================*
+ * Created on Sep 14, 2004
+ *
+ * $RCSfile: WsdmInstanceTestCase.java,v $ $Revision: 1.1 $
+ * $Author: scamp $ $Date: 2004/11/12 21:08:49 $
+ * Branch or Tag : $Name:  $
+ *
+ * ______________Recent Changes_______________________________
+ *
+ */
+package org.apache.ws.client.model;
+
+import java.lang.reflect.InvocationTargetException;
+import java.net.URL;
+import java.util.Hashtable;
+
+import javax.xml.namespace.QName;
+
+import junit.framework.Assert;
+
+import org.apache.ws.resource.discovery.RegistrationManagerFactory;
+import org.apache.ws.test.AbstractMultipleAxisTestCase;
+import org.apache.xmlbeans.XmlCursor;
+import org.apache.xmlbeans.XmlObject;
+import org.xmlsoap.schemas.ws.x2003.x03.addressing.impl.EndpointReferenceTypeImpl;
+
+/**
+ * @author wire
+ *
+ */
+public class WsdmInstanceTestCase extends AbstractMultipleAxisTestCase {
+
+    private static final int        CALL_TIMEOUT               = 300000;
+    private URL m_testEndpoint;
+	private WsdmClient m_wsdmServer;
+	private WsdmResource m_resourceDisk;
+    private WsdmInstance m_instanceDisk1234;
+    private WsdmInstance m_resourceRegistrySingleton;
+    
+	/*
+	 * @see TestCase#setUp()
+	 */
+	protected void setUp() throws Exception {
+		super.setUp();
+		m_testEndpoint=new URL(getAxisBaseUrl().toExternalForm());
+		WsdmClientFactory.clearGeneratedClassCache();
+		m_wsdmServer=WsdmClientFactory.create(WsdmClientFactory.AXIS_CLIENT_TYPE,m_testEndpoint.getHost()+":"+m_testEndpoint.getPort(),"axis");
+	    RegistrationManagerFactory.discoverResources(  );
+	    m_resourceDisk=m_wsdmServer.getResources()[0];
+	    m_instanceDisk1234=m_resourceDisk.getInstances()[0];
+	    m_resourceRegistrySingleton=m_wsdmServer.getResources()[1].getInstances()[0];
+
+	}
+
+	/*
+	 * @see TestCase#tearDown()
+	 */
+	protected void tearDown() throws Exception {
+		super.tearDown();
+	    RegistrationManagerFactory.shutdown(  );
+	}
+
+	/**
+	 * Objective: get a list of properties and verify a value.
+	 * @throws Exception
+	 */
+	public void testGetPropertyNames() throws Exception{
+	    String[] propnames=m_instanceDisk1234.getPropertyNames();
+	    Assert.assertNotNull(propnames);
+	    Assert.assertEquals("{http://xyz.com/}TopicSpace[0]",propnames[0]);
+	}
+	
+	public void testGetPropertyNamesOfASingleton() throws Exception{
+	    String[] propnames=m_resourceRegistrySingleton.getPropertyNames();
+	    Assert.assertNotNull(propnames);
+	    Assert.assertEquals("{http://docs.oasis-open.org/wsdm/2004/04/muws-0.5/schema}Name[0]",propnames[0]);
+	}
+
+	public void testGetOperations() throws SecurityException, IllegalArgumentException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException{
+	    WsdmOperation[] ops = m_instanceDisk1234.getOperations();
+	    Assert.assertNotNull(ops);
+	    Assert.assertTrue(ops.length>0);
+	}
+	
+	public void testInvoke() throws Exception{
+	    WsdmOperation[] ops = m_instanceDisk1234.getOperations();
+	    WsdmOperation destroyOperation = ops[ops.length-1];
+	    Assert.assertNotNull(destroyOperation);
+	    Assert.assertEquals("Destroy",destroyOperation.getName());
+	    XmlObject[] responses = m_instanceDisk1234.invoke(destroyOperation,new Hashtable());
+	}
+	
+	public void testGetPropertyValueFromQName() throws Exception{
+	    QName propName=new QName("http://xyz.com/","Manufacturer");
+	    XmlObject[] ret=m_instanceDisk1234.getPropertyValue(propName);
+	    XmlCursor cursor = ret[0].newCursor();
+	    String manufacturerName=cursor.getTextValue();
+	    cursor.dispose();
+	    Assert.assertEquals("Hewlett-Packard Company",manufacturerName);
+	}
+	
+	public void testGetERP() throws Exception{
+	    XmlObject erp=m_instanceDisk1234.getEPR();
+	    Assert.assertTrue(erp instanceof EndpointReferenceTypeImpl);
+	}
+
+}

Added: webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/model/WsdmOperationTestCase.java
URL: http://svn.apache.org/viewcvs/webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/model/WsdmOperationTestCase.java?rev=232389&view=auto
==============================================================================
--- webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/model/WsdmOperationTestCase.java (added)
+++ webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/model/WsdmOperationTestCase.java Fri Aug 12 13:51:57 2005
@@ -0,0 +1,62 @@
+/*=============================================================================*
+ *  Confidential Copyright (c) 2004 Hewlett-Packard Development Company, L.P.  *
+ *=============================================================================*
+ * Created on Sep 11, 2004
+ *
+ * $RCSfile: WsdmOperationTestCase.java,v $ $Revision: 1.1 $
+ * $Author: scamp $ $Date: 2004/11/12 21:08:49 $
+ * Branch or Tag : $Name:  $
+ *
+ * ______________Recent Changes_______________________________
+ *
+ */
+package org.apache.ws.client.model;
+
+import org.apache.ws.client.model.impl.WsdmOperationImpl;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+/**
+ * @author wire
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class WsdmOperationTestCase extends TestCase {
+
+    private WsdmOperation m_operation;
+
+    /*
+     * @see TestCase#setUp()
+     */
+    protected void setUp() throws Exception {
+        super.setUp();
+        m_operation=new WsdmOperationImpl("testOperation",new String[]{"hostname[java.lang.String]","port[java.lang.Long]"});
+    }
+
+    /*
+     * @see TestCase#tearDown()
+     */
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    public void testGetName() {
+        Assert.assertEquals("testOperation",m_operation.getName());
+    }
+
+    public void testGetParameterNames() {
+        String[] names = m_operation.getParameterNames();
+        Assert.assertEquals(2,names.length);
+        Assert.assertEquals("hostname",names[1]);
+        Assert.assertEquals("port",names[0]);
+    }
+
+    public void testGetParameterType() {
+        String[] names = m_operation.getParameterNames();
+        Assert.assertEquals("java.lang.String",m_operation.getParameterType(names[1]));
+        Assert.assertEquals("java.lang.Long",m_operation.getParameterType(names[0]));
+    }
+
+}

Added: webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/model/WsdmResourceTestCase.java
URL: http://svn.apache.org/viewcvs/webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/model/WsdmResourceTestCase.java?rev=232389&view=auto
==============================================================================
--- webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/model/WsdmResourceTestCase.java (added)
+++ webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/model/WsdmResourceTestCase.java Fri Aug 12 13:51:57 2005
@@ -0,0 +1,77 @@
+/*=============================================================================*
+ *  Confidential Copyright (c) 2004 Hewlett-Packard Development Company, L.P.  *
+ *=============================================================================*
+ * Created on Sep 11, 2004
+ *
+ * $RCSfile: WsdmResourceTestCase.java,v $ $Revision: 1.1 $
+ * $Author: scamp $ $Date: 2004/11/12 21:08:49 $
+ * Branch or Tag : $Name:  $
+ *
+ * ______________Recent Changes_______________________________
+ *
+ */
+package org.apache.ws.client.model;
+
+import java.net.URL;
+
+import junit.framework.Assert;
+
+import org.apache.ws.resource.discovery.RegistrationManagerFactory;
+import org.apache.ws.test.AbstractOneAxisTestCase;
+
+/**
+ * @author wire
+ *
+ */
+public class WsdmResourceTestCase extends AbstractOneAxisTestCase {
+    private static final int        CALL_TIMEOUT               = 300000;
+    private URL m_testEndpoint;
+	private WsdmClient m_wsdmServer;
+	private WsdmResource m_resourceDisk;
+    private WsdmResource m_resourceRegistry;
+    
+	/*
+	 * @see TestCase#setUp()
+	 */
+	protected void setUp() throws Exception {
+		super.setUp();
+		m_testEndpoint=new URL(getAxisBaseUrl().toExternalForm());
+		WsdmClientFactory.clearGeneratedClassCache();
+		m_wsdmServer=WsdmClientFactory.create(WsdmClientFactory.AXIS_CLIENT_TYPE,m_testEndpoint.getHost()+":"+m_testEndpoint.getPort(),"axis");
+	    RegistrationManagerFactory.discoverResources(  );
+	    m_resourceDisk=m_wsdmServer.getResources()[0];
+	    m_resourceRegistry=m_wsdmServer.getResources()[1];
+	}
+
+	/*
+	 * @see TestCase#tearDown()
+	 */
+	protected void tearDown() throws Exception {
+		super.tearDown();
+	    RegistrationManagerFactory.shutdown(  );
+	}
+
+	
+	public void testGetName(){
+	    Assert.assertNotNull(m_resourceDisk.getName());
+	    Assert.assertEquals("disk",m_resourceDisk.getName());
+	    Assert.assertNotNull(m_resourceRegistry.getName());
+	    Assert.assertEquals("registry",m_resourceRegistry.getName());
+	}
+	
+	public void testGetInstances() throws Exception{
+	    WsdmInstance[] instancesDisk = m_resourceDisk.getInstances();
+	    Assert.assertNotNull(instancesDisk);
+	    Assert.assertEquals(4,instancesDisk.length);
+	    Assert.assertEquals("1234",instancesDisk[0].getName());
+	    Assert.assertEquals("8765",instancesDisk[1].getName());
+	    Assert.assertEquals("4321",instancesDisk[2].getName());
+	    Assert.assertEquals("5678",instancesDisk[3].getName());
+
+	    WsdmInstance[] instancesRegistrySingleton = m_resourceRegistry.getInstances();
+	    Assert.assertNotNull(instancesRegistrySingleton);
+	    Assert.assertEquals(1,instancesRegistrySingleton.length);
+	    Assert.assertEquals("Singleton",instancesRegistrySingleton[0].getName());
+	}
+	
+}

Added: webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/util/SubscriberTest.java
URL: http://svn.apache.org/viewcvs/webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/util/SubscriberTest.java?rev=232389&view=auto
==============================================================================
--- webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/util/SubscriberTest.java (added)
+++ webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/client/util/SubscriberTest.java Fri Aug 12 13:51:57 2005
@@ -0,0 +1,110 @@
+/*=============================================================================*
+ *  Confidential Copyright (c) 2004 Hewlett-Packard Development Company, L.P.  *
+ *=============================================================================*/
+package org.apache.ws.client.util;
+
+import junit.framework.TestCase;
+import org.apache.ws.client.model.WsdmInstance;
+import org.apache.ws.client.model.impl.WsdmInstanceImpl;
+import com.ibm.xmlns.stdwip.webServices.wsBaseNotification.TopicExpressionType;
+
+import java.net.URL;
+
+/**
+ * Tests the Subscriber utility.
+ */
+public class SubscriberTest
+   extends TestCase
+{
+   /** the subscriber object to test */
+   private Subscriber m_subscriber;
+
+   /** some dummy WSDM instances */
+   private WsdmInstance m_wsdm1 = new WsdmInstanceImpl( "one", null );
+   private WsdmInstance m_wsdm2 = new WsdmInstanceImpl( "two", null );
+
+   /** some dummy topic expressions */
+   private TopicExpressionType m_topic1;
+   private TopicExpressionType m_topic2;
+
+   /**
+    * Creates a new {@link SubscriberTest} object.
+    */
+   public SubscriberTest(  )
+   {
+      m_topic1    = TopicExpressionType.Factory.newInstance(  );
+      m_topic2    = TopicExpressionType.Factory.newInstance(  );
+
+      m_topic1.setDialect( "topic1dialect" );
+      m_topic2.setDialect( "topic2dialect" );
+   }
+
+   /**
+    * Tests getting existing subscriptions.
+    *
+    * @throws Exception
+    */
+   public void testGetSubscriptions(  )
+   throws Exception
+   {
+   	//TODO wire This feature is not done and this test is disabled
+   	
+//      assertEquals( 0, m_subscriber.getSubscriptions(  ).length );
+//
+//      m_subscriber.subscribe( m_wsdm1, m_topic1 );
+//      assertEquals( 1, m_subscriber.getSubscriptions(  ).length );
+//      assertEquals( 1, m_subscriber.getSubscriptions( m_wsdm1 ).length );
+//
+//      m_subscriber.subscribe( m_wsdm2, m_topic2 );
+//      assertEquals( 2, m_subscriber.getSubscriptions(  ).length );
+//      assertEquals( 1, m_subscriber.getSubscriptions( m_wsdm2 ).length );
+//
+//      m_subscriber.subscribe( m_wsdm1, m_topic2 );
+//      assertEquals( 3, m_subscriber.getSubscriptions(  ).length );
+//      assertEquals( 2, m_subscriber.getSubscriptions( m_wsdm1 ).length );
+//
+//      m_subscriber.subscribe( m_wsdm2, m_topic1 );
+//      assertEquals( 4, m_subscriber.getSubscriptions(  ).length );
+//      assertEquals( 2, m_subscriber.getSubscriptions( m_wsdm2 ).length );
+//
+//      assertNotNull( m_subscriber.getSubscription( m_wsdm1, m_topic1 ) );
+//      assertNotNull( m_subscriber.getSubscription( m_wsdm2, m_topic2 ) );
+//      assertNotNull( m_subscriber.getSubscription( m_wsdm1, m_topic2 ) );
+//      assertNotNull( m_subscriber.getSubscription( m_wsdm2, m_topic1 ) );
+//
+//      m_subscriber.unsubscribe( m_wsdm1, m_topic1 );
+//      assertNull( m_subscriber.getSubscription( m_wsdm1, m_topic1 ) );
+//      assertEquals( 3, m_subscriber.getSubscriptions(  ).length );
+//
+//      m_subscriber.unsubscribe( m_wsdm2 );
+//      assertNull( m_subscriber.getSubscription( m_wsdm2, m_topic1 ) );
+//      assertNull( m_subscriber.getSubscription( m_wsdm2, m_topic2 ) );
+//      assertEquals( 1, m_subscriber.getSubscriptions(  ).length );
+//
+//      m_subscriber.unsubscribe(  );
+//      assertNull( m_subscriber.getSubscription( m_wsdm1, m_topic1 ) );
+//      assertNull( m_subscriber.getSubscription( m_wsdm2, m_topic2 ) );
+//      assertNull( m_subscriber.getSubscription( m_wsdm1, m_topic2 ) );
+//      assertNull( m_subscriber.getSubscription( m_wsdm2, m_topic1 ) );
+//      assertEquals( 0, m_subscriber.getSubscriptions(  ).length );
+   }
+
+   /**
+    * @see junit.framework.TestCase#setUp()
+    */
+   protected void setUp(  )
+   throws Exception
+   {
+      m_subscriber = new Subscriber( new URL( "http://consumer" ) );
+   }
+
+   /**
+    * @see junit.framework.TestCase#tearDown()
+    */
+   protected void tearDown(  )
+   throws Exception
+   {
+      m_subscriber.unsubscribe(  );
+      m_subscriber = null;
+   }
+}
\ No newline at end of file

Added: webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/http/NotSoSimpleAxisServer.java
URL: http://svn.apache.org/viewcvs/webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/http/NotSoSimpleAxisServer.java?rev=232389&view=auto
==============================================================================
--- webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/http/NotSoSimpleAxisServer.java (added)
+++ webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/http/NotSoSimpleAxisServer.java Fri Aug 12 13:51:57 2005
@@ -0,0 +1,468 @@
+/*
+ * Copyright 2001-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ws.http;
+
+import org.apache.axis.EngineConfiguration;
+import org.apache.axis.collections.LRUMap;
+import org.apache.axis.components.logger.LogFactory;
+import org.apache.axis.components.threadpool.ThreadPool;
+import org.apache.axis.configuration.EngineConfigurationFactoryFinder;
+import org.apache.axis.management.ServiceAdmin;
+import org.apache.axis.server.AxisServer;
+import org.apache.axis.session.Session;
+import org.apache.axis.session.SimpleSession;
+import org.apache.axis.transport.http.SimpleAxisWorker;
+import org.apache.axis.transport.http.SimpleAxisServer;
+import org.apache.axis.utils.Messages;
+import org.apache.axis.utils.NetworkUtils;
+import org.apache.axis.utils.Options;
+import org.apache.commons.logging.Log;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.Map;
+
+/**
+ * This is a simple implementation of an HTTP server for processing SOAP requests via Apache's xml-axis.  This is not
+ * intended for production use.  Its intended uses are for demos, debugging, and performance profiling.
+ * <p/>
+ * Note this classes uses static objects to provide a thread pool, so you should not use multiple instances of this
+ * class in the same JVM/classloader unless you want bad things to happen at shutdown.
+ *
+ * TODO: delete any methods that can be safely inherited from superclass
+ *
+ * @author Ian Springer
+ */
+public class NotSoSimpleAxisServer extends SimpleAxisServer implements Runnable
+{
+
+    public static final File DEFAULT_DOC_ROOT_DIR = new File( "./src/wsdl" );
+    public static final int DEFAULT_MAX_THREADS = 200;
+    public static final int DEFAULT_MAX_SESSIONS = 100;
+
+    protected static final Log LOG = LogFactory.getLog( NotSoSimpleAxisServer.class.getName() );
+
+    // session state.
+    // This table maps session keys (random numbers) to SimpleAxisSession objects.
+    //
+    // There is a simple LRU based session cleanup mechanism, but if clients are not
+    // passing cookies, then a new session will be created for *every* request.
+    private Map m_sessions;
+    //Maximum capacity of the LRU Map used for session cleanup
+    private int m_maxSessions;
+
+    private File m_docRootDir;
+
+    /**
+     * get the thread pool
+     *
+     * @return
+     */
+    public static ThreadPool getPool()
+    {
+        return m_pool;
+    }
+
+    /*
+     * pool of threads
+     */
+    private static ThreadPool m_pool;
+
+    /*
+     * Are we doing threads?
+     */
+    private static boolean s_doThreads = true;
+
+    /*
+     * Are we doing sessions? Set this to false if you don't want any session overhead.
+     */
+    private static boolean s_doSessions = true;
+
+    /**
+     * Create a server with default options.
+     */
+    public NotSoSimpleAxisServer()
+    {
+        this( DEFAULT_DOC_ROOT_DIR );
+    }
+
+    /**
+     * Create a server with the specified docRoot.
+     */
+    public NotSoSimpleAxisServer( File docRootDir )
+    {
+        this( docRootDir, DEFAULT_MAX_THREADS );
+    }
+
+    /**
+     * Create a server with the specified docRoot and max threads.
+     */
+    public NotSoSimpleAxisServer( File docRootDir, int maxPoolSize )
+    {
+        this( docRootDir, maxPoolSize, DEFAULT_MAX_SESSIONS );
+    }
+
+    /**
+     * Create a server with the specified docRoot, max threads, and max sessions.
+     */
+    public NotSoSimpleAxisServer( File docRootDir, int maxPoolSize, int maxSessions )
+    {
+        m_docRootDir = docRootDir;
+        m_pool = new ThreadPool( maxPoolSize );
+        m_sessions = new LRUMap( maxSessions );
+    }
+
+    /**
+     * stop the server if not already told to.
+     *
+     * @throws Throwable
+     */
+    protected void finalize() throws Throwable
+    {
+        stop();
+        super.finalize();
+    }
+
+    /**
+     * get max session count
+     *
+     * @return
+     */
+    public int getMaxSessions()
+    {
+        return m_maxSessions;
+    }
+
+    /**
+     * Resize the session map
+     *
+     * @param maxSessions maximum sessions
+     */
+    public void setMaxSessions( int maxSessions )
+    {
+        this.m_maxSessions = maxSessions;
+        ( (LRUMap) m_sessions ).setMaximumSize( maxSessions );
+    }
+    //---------------------------------------------------
+
+    protected boolean isSessionUsed()
+    {
+        return s_doSessions;
+    }
+
+    /**
+     * turn threading on or off. This sets a static value
+     *
+     * @param value
+     */
+    public void setDoThreads( boolean value )
+    {
+        s_doThreads = value;
+    }
+
+    public boolean getDoThreads()
+    {
+        return s_doThreads;
+    }
+
+    public EngineConfiguration getMyConfig()
+    {
+        return m_myConfig;
+    }
+
+    public void setMyConfig( EngineConfiguration myConfig )
+    {
+        m_myConfig = myConfig;
+    }
+
+    /**
+     * demand create a session if there is not already one for the string
+     *
+     * @param cooky
+     *
+     * @return a session.
+     */
+    protected Session createSession( String cooky )
+    {
+
+        // is there a session already?
+        Session session = null;
+        if ( m_sessions.containsKey( cooky ) )
+        {
+            session = (Session) m_sessions.get( cooky );
+        }
+        else
+        {
+            // no session for this cooky, bummer
+            session = new SimpleSession();
+
+            // ADD CLEANUP LOGIC HERE if needed
+            m_sessions.put( cooky, session );
+        }
+        return session;
+    }
+
+    // What is our current session index?
+    // This is a monotonically increasing, non-thread-safe integer
+    // (thread safety not considered crucial here)
+    public static int sessionIndex = 0;
+
+    // Axis server (shared between instances)
+    private static AxisServer myAxisServer = null;
+
+    private EngineConfiguration m_myConfig = null;
+
+    /**
+     * demand create an axis server; return an existing one if one exists. The configuration for the axis server is
+     * derived from #myConfig if not null, the default config otherwise.
+     *
+     * @return
+     */
+    public synchronized AxisServer getAxisServer()
+    {
+        if ( myAxisServer == null )
+        {
+            if ( m_myConfig == null )
+            {
+                m_myConfig = EngineConfigurationFactoryFinder.newFactory().getServerEngineConfig();
+            }
+            myAxisServer = new AxisServer( m_myConfig );
+            ServiceAdmin.setEngine( myAxisServer, NetworkUtils.getLocalHostname() + "@" + m_serverSocket.getLocalPort() );
+        }
+        return myAxisServer;
+    }
+
+    /**
+     * are we stopped? latch to true if stop() is called
+     */
+    private boolean stopped = false;
+
+    /**
+     * Accept requests from a given TCP port and send them through the Axis engine for processing.
+     */
+    public void run()
+    {
+        LOG.info( Messages.getMessage( "start01", "SimpleAxisServer",
+                new Integer( getServerSocket().getLocalPort() ).toString(), getCurrentDirectory() ) );
+
+        // Accept and process requests from the socket
+        while ( !stopped )
+        {
+            Socket socket = null;
+            try
+            {
+                socket = m_serverSocket.accept();
+            }
+            catch ( java.io.InterruptedIOException iie )
+            {
+            }
+            catch ( Exception e )
+            {
+                LOG.debug( Messages.getMessage( "exception00" ), e );
+                break;
+            }
+            if ( socket != null )
+            {
+                SimpleAxisWorker worker = new NotSoSimpleAxisWorker( this, socket, m_docRootDir );
+                if ( s_doThreads )
+                {
+                    m_pool.addWorker( worker );
+                }
+                else
+                {
+                    worker.run();
+                }
+            }
+        }
+        LOG.info( Messages.getMessage( "quit00", "SimpleAxisServer" ) );
+    }
+
+    /**
+     * Gets the current directory
+     *
+     * @return current directory
+     */
+    private String getCurrentDirectory()
+    {
+        return System.getProperty( "user.dir" );
+    }
+
+    // per thread socket information
+    private ServerSocket m_serverSocket;
+
+    /**
+     * Obtain the serverSocket that that SimpleAxisServer is listening on.
+     */
+    public ServerSocket getServerSocket()
+    {
+        return m_serverSocket;
+    }
+
+    /**
+     * Set the serverSocket this server should listen on. (note : changing this will not affect a running server, but if
+     * you stop() and then start() the server, the new socket will be used).
+     */
+    public void setServerSocket( ServerSocket serverSocket )
+    {
+        m_serverSocket = serverSocket;
+    }
+
+    /**
+     * Start this server.
+     * <p/>
+     * Spawns a worker thread to listen for HTTP requests.
+     *
+     * @param daemon a boolean indicating if the thread should be a daemon.
+     */
+    public void start( boolean daemon ) throws Exception
+    {
+        stopped = false;
+        if ( s_doThreads )
+        {
+            Thread thread = new Thread( this );
+            thread.setDaemon( daemon );
+            thread.start();
+        }
+        else
+        {
+            run();
+        }
+    }
+
+    /**
+     * Start this server as a NON-daemon.
+     */
+    public void start() throws Exception
+    {
+        start( false );
+    }
+
+    /**
+     * Stop this server. Can be called safely if the system is already stopped, or if it was never started.
+     * <p/>
+     * This will interrupt any pending accept().
+     */
+    public void stop()
+    {
+        //recognise use before we are live
+        if ( stopped )
+        {
+            return;
+        }
+        /*
+         * Close the server socket cleanly, but avoid fresh accepts while
+         * the socket is closing.
+         */
+        stopped = true;
+
+        try
+        {
+            if ( m_serverSocket != null )
+            {
+                m_serverSocket.close();
+            }
+        }
+        catch ( IOException e )
+        {
+            LOG.info( Messages.getMessage( "exception00" ), e );
+        }
+        finally
+        {
+            m_serverSocket = null;
+        }
+
+        LOG.info( Messages.getMessage( "quit00", "SimpleAxisServer" ) );
+
+        //shut down the pool
+        m_pool.shutdown();
+    }
+
+    /**
+     * Server process.
+     */
+    public static void main( String args[] )
+    {
+
+        Options opts = null;
+        try
+        {
+            opts = new Options( args );
+        }
+        catch ( MalformedURLException e )
+        {
+            LOG.error( Messages.getMessage( "malformedURLException00" ), e );
+            return;
+        }
+
+        String maxPoolSize = opts.isValueSet( 't' );
+        if ( maxPoolSize == null )
+        {
+            maxPoolSize = ThreadPool.DEFAULT_MAX_THREADS + "";
+        }
+
+        String maxSessions = opts.isValueSet( 'm' );
+        if ( maxSessions == null )
+        {
+            maxSessions = DEFAULT_MAX_SESSIONS + "";
+        }
+
+        String[] nonOptionArgs = opts.getRemainingArgs();
+        NotSoSimpleAxisServer server = new NotSoSimpleAxisServer( new File( nonOptionArgs[0] ), Integer.parseInt( maxPoolSize ),
+                Integer.parseInt( maxSessions ) );
+
+        try
+        {
+            s_doThreads = ( opts.isFlagSet( 't' ) > 0 );
+
+            int port = opts.getPort();
+            ServerSocket ss = null;
+            // Try five times
+            final int retries = 5;
+            for ( int i = 0; i < retries; i++ )
+            {
+                try
+                {
+                    ss = new ServerSocket( port );
+                    break;
+                }
+                catch ( java.net.BindException be )
+                {
+                    LOG.debug( Messages.getMessage( "exception00" ), be );
+                    if ( i < ( retries - 1 ) )
+                    {
+                        // At 3 second intervals.
+                        Thread.sleep( 3000 );
+                    }
+                    else
+                    {
+                        throw new Exception( Messages.getMessage( "unableToStartServer00",
+                                Integer.toString( port ) ) );
+                    }
+                }
+            }
+            server.setServerSocket( ss );
+            server.start();
+        }
+        catch ( Exception e )
+        {
+            LOG.error( Messages.getMessage( "exception00" ), e );
+            return;
+        }
+    }
+}

Added: webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/http/NotSoSimpleAxisWorker.java
URL: http://svn.apache.org/viewcvs/webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/http/NotSoSimpleAxisWorker.java?rev=232389&view=auto
==============================================================================
--- webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/http/NotSoSimpleAxisWorker.java (added)
+++ webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/http/NotSoSimpleAxisWorker.java Fri Aug 12 13:51:57 2005
@@ -0,0 +1,956 @@
+/*=============================================================================*
+ *  Confidential Copyright (c) 2004 Hewlett-Packard Development Company, L.P.  *
+ *=============================================================================*/
+package org.apache.ws.http;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+import javax.xml.soap.MimeHeader;
+import javax.xml.soap.MimeHeaders;
+import javax.xml.soap.SOAPMessage;
+
+import org.apache.axis.AxisFault;
+import org.apache.axis.Constants;
+import org.apache.axis.Message;
+import org.apache.axis.MessageContext;
+import org.apache.axis.description.OperationDesc;
+import org.apache.axis.description.ServiceDesc;
+import org.apache.axis.encoding.Base64;
+import org.apache.axis.message.SOAPEnvelope;
+import org.apache.axis.message.SOAPFault;
+import org.apache.axis.server.AxisServer;
+import org.apache.axis.transport.http.HTTPConstants;
+import org.apache.axis.transport.http.NonBlockingBufferedInputStream;
+import org.apache.axis.transport.http.SimpleAxisServer;
+import org.apache.axis.transport.http.SimpleAxisWorker;
+import org.apache.axis.utils.Messages;
+import org.apache.axis.utils.XMLUtils;
+import org.apache.commons.io.IoUtils;
+import org.w3c.dom.Document;
+
+/**
+ * Web server that supports SOAP POST requests and arbitrary GET requests.
+ * 
+ * @author Ian P. Springer
+ */
+public class NotSoSimpleAxisWorker
+      extends SimpleAxisWorker
+{
+   private static final byte[] TO_LOWER = new byte[256];
+
+   static
+   {
+      for ( int i = 0; i < 256; i++ )
+      {
+         TO_LOWER[i] = (byte) i;
+      }
+
+      for ( int lc = 'a'; lc <= 'z'; lc++ )
+      {
+         TO_LOWER[( lc + 'A' ) - 'a'] = (byte) lc;
+      }
+   }
+
+   // buffer for IO
+   private static final int BUFSIZ = 4096;
+
+   // Axis specific constants
+   private static String TRANSPORT_NAME = "SimpleHTTP";
+
+   // header ender
+   private static final byte[] HEADER_ENDER = ": ".getBytes();
+
+   // HTTP status codes
+   private static byte[] OK = ( "200 " + Messages.getMessage( "ok00" ) ).getBytes();
+   private static byte[] NOCONTENT = ( "202 " + Messages.getMessage( "ok00" ) + "\n\n" ).getBytes();
+   private static byte[] UNAUTH = ( "401 " + Messages.getMessage( "unauth00" ) ).getBytes();
+   private static byte[] SENDER = "400".getBytes();
+   private static byte[] ISE = ( "500 " + Messages.getMessage( "internalError01" ) ).getBytes();
+
+   // HTTP prefix
+   private static byte[] HTTP = "HTTP/1.0 ".getBytes();
+
+   // Standard MIME headers for XML payload
+   private static byte[] XML_MIME_STUFF =
+         ( "\r\nContent-Type: text/xml; charset=utf-8\r\n" + "Content-Length: " ).getBytes();
+
+   // Standard MIME headers for HTML payload
+   private static byte[] HTML_MIME_STUFF =
+         ( "\r\nContent-Type: text/html; charset=utf-8\r\n" + "Content-Length: " ).getBytes();
+
+   // Mime/Content separator
+   private static byte[] SEPARATOR = "\r\n\r\n".getBytes();
+
+   // mime header for content length
+   private static final byte[] lenHeader = "content-length: ".getBytes();
+   private static final int lenLen = lenHeader.length;
+
+   // mime header for content type
+   private static final byte[] typeHeader =
+         ( HTTPConstants.HEADER_CONTENT_TYPE.toLowerCase() + ": " ).getBytes();
+   private static final int typeLen = typeHeader.length;
+
+   // mime header for content location
+   private static final byte[] locationHeader =
+         ( HTTPConstants.HEADER_CONTENT_LOCATION.toLowerCase() + ": " ).getBytes();
+   private static final int locationLen = locationHeader.length;
+
+   // mime header for soap action
+   private static final byte[] actionHeader = "soapaction: ".getBytes();
+   private static final int actionLen = actionHeader.length;
+
+   // mime header for cookie
+   private static final byte[] cookieHeader = "cookie: ".getBytes();
+   private static final int cookieLen = cookieHeader.length;
+
+   // mime header for cookie2
+   private static final byte[] cookie2Header = "cookie2: ".getBytes();
+   private static final int cookie2Len = cookie2Header.length;
+
+   // HTTP header for authentication
+   private static final byte[] authHeader = "authorization: ".getBytes();
+   private static final int authLen = authHeader.length;
+
+   // mime header for GET
+   private static final byte[] getHeader = "GET".getBytes();
+
+   // mime header for POST
+   private static final byte[] postHeader = "POST".getBytes();
+
+   // header ender
+   private static final byte[] headerEnder = ": ".getBytes();
+
+   // "Basic" auth string
+   private static final byte[] basicAuth = "basic ".getBytes();
+   private File m_docRootDir;
+   private NotSoSimpleAxisServer m_server;
+   private Socket m_socket;
+
+   /**
+    * Creates a new {@link NotSoSimpleAxisWorker} object.
+    *
+    * @param server     DOCUMENT_ME
+    * @param socket     DOCUMENT_ME
+    * @param docRootDir DOCUMENT_ME
+    */
+   public NotSoSimpleAxisWorker( NotSoSimpleAxisServer server,
+                                 Socket socket,
+                                 File docRootDir )
+   {
+      super( server, socket );
+      m_server = server;
+      m_socket = socket;
+      m_docRootDir = docRootDir;
+   }
+
+   /**
+    * The main workhorse method.
+    */
+   public void execute()
+   {
+      byte buf[] = new byte[BUFSIZ];
+      // create an Axis server
+      AxisServer engine = m_server.getAxisServer();
+
+      // create and initialize a message context
+      MessageContext msgContext = new MessageContext( engine );
+      Message requestMsg = null;
+
+      // Reusuable, buffered, content length controlled, InputStream
+      NonBlockingBufferedInputStream is =
+            new NonBlockingBufferedInputStream();
+
+      // buffers for the headers we care about
+      StringBuffer soapAction = new StringBuffer();
+      StringBuffer httpRequest = new StringBuffer();
+      StringBuffer fileName = new StringBuffer();
+      StringBuffer cookie = new StringBuffer();
+      StringBuffer cookie2 = new StringBuffer();
+      StringBuffer authInfo = new StringBuffer();
+      StringBuffer contentType = new StringBuffer();
+      StringBuffer contentLocation = new StringBuffer();
+
+      Message responseMsg = null;
+
+      // prepare request (do as much as possible while waiting for the
+      // next connection).  Note the next two statements are commented
+      // out.  Uncomment them if you experience any problems with not
+      // resetting state between requests:
+      //   msgContext = new MessageContext();
+      //   requestMsg = new Message("", "String");
+      //msgContext.setProperty("transport", "HTTPTransport");
+      msgContext.setTransportName( TRANSPORT_NAME );
+
+      responseMsg = null;
+
+      try
+      {
+         // assume the best
+         byte[] status = OK;
+
+         // assume we're not getting WSDL
+         boolean doWsdl = false;
+
+         // cookie for this session, if any
+         String cooky = null;
+
+         String methodName = null;
+
+         try
+         {
+            // wipe cookies if we're doing sessions
+            if ( m_server.isSessionUsed() )
+            {
+               cookie.delete( 0, cookie.length() );
+               cookie2.delete( 0, cookie2.length() );
+            }
+            authInfo.delete( 0, authInfo.length() );
+
+            // read headers
+            is.setInputStream( m_socket.getInputStream() );
+            // parse all headers into hashtable
+            MimeHeaders requestHeaders = new MimeHeaders();
+            int contentLength = parseHeaders( is, buf, contentType,
+                  contentLocation, soapAction,
+                  httpRequest, fileName,
+                  cookie, cookie2, authInfo, requestHeaders );
+            is.setContentLength( contentLength );
+
+            int paramIdx = fileName.toString().indexOf( '?' );
+            if ( paramIdx != -1 )
+            {
+               // Got params
+               String params = fileName.substring( paramIdx + 1 );
+               fileName.setLength( paramIdx );
+
+               log.debug( Messages.getMessage( "filename00",
+                     fileName.toString() ) );
+               log.debug( Messages.getMessage( "params00",
+                     params ) );
+
+               if ( "wsdl".equalsIgnoreCase( params ) )
+               {
+                  doWsdl = true;
+               }
+
+               if ( params.startsWith( "method=" ) )
+               {
+                  methodName = params.substring( 7 );
+               }
+            }
+
+            // Real and relative paths are the same for the
+            // SimpleAxisServer
+            msgContext.setProperty( Constants.MC_REALPATH,
+                  fileName.toString() );
+            msgContext.setProperty( Constants.MC_RELATIVE_PATH,
+                  fileName.toString() );
+            msgContext.setProperty( Constants.MC_JWS_CLASSDIR,
+                  "jwsClasses" );
+            msgContext.setProperty( Constants.MC_HOME_DIR, "." );
+
+            // !!! Fix string concatenation
+            String url = "http://" + getLocalHost() + ":" +
+                  m_server.getServerSocket().getLocalPort() + "/" +
+                  fileName.toString();
+            msgContext.setProperty( MessageContext.TRANS_URL, url );
+
+            String filePart = fileName.toString();
+            if ( filePart.startsWith( "axis/services/" ) )
+            {
+               String servicePart = filePart.substring( 14 );
+               int separator = servicePart.indexOf( '/' );
+               if ( separator > -1 )
+               {
+                  msgContext.setProperty( "objectID",
+                        servicePart.substring( separator + 1 ) );
+                  servicePart = servicePart.substring( 0, separator );
+               }
+               msgContext.setTargetService( servicePart );
+            }
+
+            if ( authInfo.length() > 0 )
+            {
+               // Process authentication info
+               //authInfo = new StringBuffer("dXNlcjE6cGFzczE=");
+               byte[] decoded = Base64.decode( authInfo.toString() );
+               StringBuffer userBuf = new StringBuffer();
+               StringBuffer pwBuf = new StringBuffer();
+               StringBuffer authBuf = userBuf;
+               for ( int i = 0; i < decoded.length; i++ )
+               {
+                  if ( (char) ( decoded[i] & 0x7f ) == ':' )
+                  {
+                     authBuf = pwBuf;
+                     continue;
+                  }
+                  authBuf.append( (char) ( decoded[i] & 0x7f ) );
+               }
+
+               if ( log.isDebugEnabled() )
+               {
+                  log.debug( Messages.getMessage( "user00",
+                        userBuf.toString() ) );
+               }
+
+               msgContext.setUsername( userBuf.toString() );
+               msgContext.setPassword( pwBuf.toString() );
+            }
+
+            // if get, then return simpleton document as response
+            if ( httpRequest.toString().equals( "GET" ) )
+            {
+
+               OutputStream out = m_socket.getOutputStream();
+               out.write( HTTP );
+               if ( fileName.length() == 0 )
+               {
+                  out.write( "301 Redirect\nLocation: /axis/\n\n".getBytes() );
+                  out.flush();
+                  return;
+               }
+               out.write( status );
+
+               if ( methodName != null )
+               {
+                  String body =
+                        "<" + methodName + ">" +
+//                               args +
+                        "</" + methodName + ">";
+                  String msgtxt =
+                        "<SOAP-ENV:Envelope" +
+                        " xmlns:SOAP-ENV=\"" + Constants.URI_SOAP12_ENV + "\">" +
+                        "<SOAP-ENV:Body>" + body + "</SOAP-ENV:Body>" +
+                        "</SOAP-ENV:Envelope>";
+
+                  ByteArrayInputStream istream =
+                        new ByteArrayInputStream( msgtxt.getBytes() );
+                  requestMsg = new Message( istream );
+               }
+               else if ( doWsdl )
+               {
+                  engine.generateWSDL( msgContext );
+
+                  Document doc = (Document) msgContext.getProperty( "WSDL" );
+                  if ( doc != null )
+                  {
+                     XMLUtils.normalize( doc.getDocumentElement() );
+                     String response = XMLUtils.PrettyDocumentToString( doc );
+                     byte[] respBytes = response.getBytes();
+
+                     out.write( XML_MIME_STUFF );
+                     putInt( buf, out, respBytes.length );
+                     out.write( SEPARATOR );
+                     out.write( respBytes );
+                     out.flush();
+                     return;
+                  }
+               }
+               else if ( fileName.equals( "/" ) )
+               {
+                  StringBuffer sb = new StringBuffer();
+                  sb.append( "<h2>And now... Some Services</h2>\n" );
+                  Iterator i = engine.getConfig().getDeployedServices();
+                  sb.append( "<ul>\n" );
+                  while ( i.hasNext() )
+                  {
+                     ServiceDesc sd = (ServiceDesc) i.next();
+                     sb.append( "<li>\n" );
+                     sb.append( sd.getName() );
+                     sb.append( " <a href=\"services/" );
+                     sb.append( sd.getName() );
+                     sb.append( "?wsdl\"><i>(wsdl)</i></a></li>\n" );
+                     ArrayList operations = sd.getOperations();
+                     if ( !operations.isEmpty() )
+                     {
+                        sb.append( "<ul>\n" );
+                        for ( Iterator it = operations.iterator(); it.hasNext(); )
+                        {
+                           OperationDesc desc = (OperationDesc) it.next();
+                           sb.append( "<li>" + desc.getName() );
+                        }
+                        sb.append( "</ul>\n" );
+                     }
+                  }
+                  sb.append( "</ul>\n" );
+
+                  byte[] bytes = sb.toString().getBytes();
+
+                  out.write( HTML_MIME_STUFF );
+                  putInt( buf, out, bytes.length );
+                  out.write( SEPARATOR );
+                  out.write( bytes );
+                  out.flush();
+                  return;
+               }
+               else
+               {
+                   String filePath = fileName.toString();
+                   if ( filePath.startsWith( "/" ) )
+                   {
+                      filePath = filePath.substring( 1 );
+                   }
+                   File realPath = new File( m_docRootDir, filePath );
+                   System.out.println( "Attemping to serving up " + realPath + " ..." );
+                   InputStream in = new BufferedInputStream( new FileInputStream( realPath ) );
+                   out.write( XML_MIME_STUFF );
+                   putInt( buf, out, in.available() );
+                   out.write( SEPARATOR );
+                   //out.write( respBytes );
+                   System.out.println( "Served up " + realPath + " on a silver platter." );
+
+                   
+                   IoUtils.copy( in, out );
+                   in.close();
+                   out.flush();
+                   return;
+               }
+            }
+            else
+            {
+
+               // this may be "" if either SOAPAction: "" or if no SOAPAction at all.
+               // for now, do not complain if no SOAPAction at all
+               String soapActionString = soapAction.toString();
+               if ( soapActionString != null )
+               {
+                  msgContext.setUseSOAPAction( true );
+                  msgContext.setSOAPActionURI( soapActionString );
+               }
+               requestMsg = new Message( is,
+                     false,
+                     contentType.toString(),
+                     contentLocation.toString() );
+            }
+
+            // Transfer HTTP headers to MIME headers for request message.
+            MimeHeaders requestMimeHeaders = requestMsg.getMimeHeaders();
+            for ( Iterator i = requestHeaders.getAllHeaders(); i.hasNext(); )
+            {
+               MimeHeader requestHeader = (MimeHeader) i.next();
+               requestMimeHeaders.addHeader( requestHeader.getName(), requestHeader.getValue() );
+            }
+            msgContext.setRequestMessage( requestMsg );
+            // put character encoding of request to message context
+            // in order to reuse it during the whole process.
+            String requestEncoding = (String) requestMsg.getProperty( SOAPMessage.CHARACTER_SET_ENCODING );
+            if ( requestEncoding != null )
+            {
+               msgContext.setProperty( SOAPMessage.CHARACTER_SET_ENCODING, requestEncoding );
+            }
+
+            // set up session, if any
+            if ( m_server.isSessionUsed() )
+            {
+               // did we get a cookie?
+               if ( cookie.length() > 0 )
+               {
+                  cooky = cookie.toString().trim();
+               }
+               else if ( cookie2.length() > 0 )
+               {
+                  cooky = cookie2.toString().trim();
+               }
+
+               // if cooky is null, cook up a cooky
+               if ( cooky == null )
+               {
+                  // fake one up!
+                  // make it be an arbitrarily increasing number
+                  // (no this is not thread safe because ++ isn't atomic)
+                  int i = SimpleAxisServer.sessionIndex++;
+                  cooky = "" + i;
+               }
+
+               msgContext.setSession( m_server.createSession( cooky ) );
+            }
+
+            // invoke the Axis engine
+            engine.invoke( msgContext );
+
+            // Retrieve the response from Axis
+            responseMsg = msgContext.getResponseMessage();
+
+            if ( responseMsg == null )
+            {
+               status = NOCONTENT;
+            }
+         }
+         catch ( Exception e )
+         {
+            AxisFault af;
+            if ( e instanceof AxisFault )
+            {
+               af = (AxisFault) e;
+               log.debug( Messages.getMessage( "serverFault00" ), af );
+               QName faultCode = af.getFaultCode();
+               if ( Constants.FAULT_SOAP12_SENDER.equals( faultCode ) )
+               {
+                  status = SENDER;
+               }
+               else if ( "Server.Unauthorized".equals( af.getFaultCode().getLocalPart() ) )
+               {
+                  status = UNAUTH; // SC_UNAUTHORIZED
+               }
+               else
+               {
+                  status = ISE; // SC_INTERNAL_SERVER_ERROR
+               }
+            }
+            else
+            {
+               status = ISE; // SC_INTERNAL_SERVER_ERROR
+               af = AxisFault.makeFault( e );
+            }
+
+            // There may be headers we want to preserve in the
+            // response message - so if it's there, just add the
+            // FaultElement to it.  Otherwise, make a new one.
+            responseMsg = msgContext.getResponseMessage();
+            if ( responseMsg == null )
+            {
+               responseMsg = new Message( af );
+               responseMsg.setMessageContext( msgContext );
+            }
+            else
+            {
+               try
+               {
+                  SOAPEnvelope env = responseMsg.getSOAPEnvelope();
+                  env.clearBody();
+                  env.addBodyElement( new SOAPFault( (AxisFault) e ) );
+               }
+               catch ( AxisFault fault )
+               {
+                  // Should never reach here!
+               }
+            }
+         }
+
+         // synchronize the character encoding of request and response
+         String responseEncoding = (String) msgContext.getProperty( SOAPMessage.CHARACTER_SET_ENCODING );
+         if ( responseEncoding != null && responseMsg != null )
+         {
+            responseMsg.setProperty( SOAPMessage.CHARACTER_SET_ENCODING, responseEncoding );
+         }
+         // Send it on its way...
+         OutputStream out = m_socket.getOutputStream();
+         out.write( HTTP );
+         out.write( status );
+
+         if ( responseMsg != null )
+         {
+            if ( m_server.isSessionUsed() && null != cooky &&
+                  0 != cooky.trim().length() )
+            {
+               // write cookie headers, if any
+               // don't sweat efficiency *too* badly
+               // optimize at will
+               StringBuffer cookieOut = new StringBuffer();
+               cookieOut.append( "\r\nSet-Cookie: " )
+                     .append( cooky )
+                     .append( "\r\nSet-Cookie2: " )
+                     .append( cooky );
+               // OH, THE HUMILITY!  yes this is inefficient.
+               out.write( cookieOut.toString().getBytes() );
+            }
+
+            //out.write(XML_MIME_STUFF);
+            out.write(
+                  ( "\r\n" + HTTPConstants.HEADER_CONTENT_TYPE + ": " +
+                  responseMsg.getContentType( msgContext.getSOAPConstants() ) ).getBytes() );
+            // Writing the length causes the entire message to be decoded twice.
+            //out.write(("\r\n" + HTTPConstants.HEADER_CONTENT_LENGTH + ": " + responseMsg.getContentLength()).getBytes());
+            // putInt(out, response.length);
+
+            // Transfer MIME headers to HTTP headers for response message.
+            for ( Iterator i = responseMsg.getMimeHeaders().getAllHeaders(); i.hasNext(); )
+            {
+               MimeHeader responseHeader = (MimeHeader) i.next();
+               out.write( '\r' );
+               out.write( '\n' );
+               out.write( responseHeader.getName().getBytes() );
+               out.write( headerEnder );
+               out.write( responseHeader.getValue().getBytes() );
+            }
+
+            out.write( SEPARATOR );
+            responseMsg.writeTo( out );
+         }
+
+         // out.write(response);
+         out.flush();
+      }
+      catch ( Exception e )
+      {
+         log.info( Messages.getMessage( "exception00" ), e );
+      }
+      finally
+      {
+         try
+         {
+            if ( m_socket != null )
+            {
+               m_socket.close();
+            }
+         }
+         catch ( Exception e )
+         {
+         }
+      }
+      if ( msgContext.getProperty( MessageContext.QUIT_REQUESTED ) != null )
+      {
+         // why then, quit!
+         try
+         {
+            m_server.stop();
+         }
+         catch ( Exception e )
+         {
+         }
+      }
+
+   }
+
+   /**
+    * Read all mime headers, returning the value of Content-Length and SOAPAction.
+    *
+    * @param is              InputStream to read from
+    * @param contentType     The content type.
+    * @param contentLocation The content location
+    * @param soapAction      StringBuffer to return the soapAction into
+    * @param httpRequest     StringBuffer for GET / POST
+    * @param cookie          first cookie header (if doSessions)
+    * @param cookie2         second cookie header (if doSessions)
+    * @param headers         HTTP headers to transfer to MIME headers
+    *
+    * @return Content-Length
+    */
+   private int parseHeaders( NonBlockingBufferedInputStream is,
+                             byte[] buf,
+                             StringBuffer contentType,
+                             StringBuffer contentLocation,
+                             StringBuffer soapAction,
+                             StringBuffer httpRequest,
+                             StringBuffer fileName,
+                             StringBuffer cookie,
+                             StringBuffer cookie2,
+                             StringBuffer authInfo,
+                             MimeHeaders headers )
+         throws java.io.IOException
+   {
+      int n;
+      int len = 0;
+
+      // parse first line as GET or POST
+      n = this.readLine( is, buf, 0, buf.length );
+
+      if ( n < 0 )
+      {
+         // nothing!
+         throw new java.io.IOException( Messages.getMessage( "unexpectedEOS00" ) );
+      }
+
+      // which does it begin with?
+      httpRequest.delete( 0,
+            httpRequest.length() );
+      fileName.delete( 0,
+            fileName.length() );
+      contentType.delete( 0,
+            contentType.length() );
+      contentLocation.delete( 0,
+            contentLocation.length() );
+
+      if ( buf[0] == getHeader[0] )
+      {
+         httpRequest.append( "GET" );
+
+         for ( int i = 0; i < ( n - 5 ); i++ )
+         {
+            char c = (char) ( buf[i + 5] & 0x7f );
+
+            if ( c == ' ' )
+            {
+               break;
+            }
+
+            fileName.append( c );
+         }
+
+         log.debug( Messages.getMessage( "filename01",
+               "SimpleAxisServer",
+               fileName.toString() ) );
+
+         return 0;
+      }
+      else if ( buf[0] == postHeader[0] )
+      {
+         httpRequest.append( "POST" );
+
+         for ( int i = 0; i < ( n - 6 ); i++ )
+         {
+            char c = (char) ( buf[i + 6] & 0x7f );
+
+            if ( c == ' ' )
+            {
+               break;
+            }
+
+            fileName.append( c );
+         }
+
+         log.debug( Messages.getMessage( "filename01",
+               "SimpleAxisServer",
+               fileName.toString() ) );
+      }
+      else
+      {
+         throw new java.io.IOException( Messages.getMessage( "badRequest00" ) );
+      }
+
+      while ( ( n = readLine( is, buf, 0, buf.length ) ) > 0 )
+      {
+         if ( ( n <= 2 ) && ( ( buf[0] == '\n' ) || ( buf[0] == '\r' ) ) && ( len > 0 ) )
+         {
+            break;
+         }
+
+         // RobJ gutted the previous logic; it was too hard to extend for more headers.
+         // Now, all it does is search forwards for ": " in the buf,
+         // then do a length / byte compare.
+         // Hopefully this is still somewhat efficient (Sam is watching!).
+         // First, search forwards for ": "
+         int endHeaderIndex = 0;
+
+         while ( ( endHeaderIndex < n ) && ( TO_LOWER[buf[endHeaderIndex]] != headerEnder[0] ) )
+         {
+            endHeaderIndex++;
+         }
+
+         endHeaderIndex += 2;
+
+         // endHeaderIndex now points _just past_ the ": ", and is
+         // comparable to the various lenLen, actionLen, etc. values
+         // convenience; i gets pre-incremented, so initialize it to one less
+         int i = endHeaderIndex - 1;
+
+         // which header did we find?
+         if ( ( endHeaderIndex == lenLen ) && matches( buf, lenHeader ) )
+         {
+            // parse content length
+            while ( ( ++i < n ) && ( buf[i] >= '0' ) && ( buf[i] <= '9' ) )
+            {
+               len = ( len * 10 ) + ( buf[i] - '0' );
+            }
+
+            headers.addHeader( HTTPConstants.HEADER_CONTENT_LENGTH,
+                  String.valueOf( len ) );
+         }
+         else if ( ( endHeaderIndex == actionLen ) && matches( buf, actionHeader ) )
+         {
+            soapAction.delete( 0,
+                  soapAction.length() );
+
+            // skip initial '"'
+            i++;
+
+            while ( ( ++i < n ) && ( buf[i] != '"' ) )
+            {
+               soapAction.append( (char) ( buf[i] & 0x7f ) );
+            }
+
+            headers.addHeader( HTTPConstants.HEADER_SOAP_ACTION, "\"" + soapAction.toString() + "\"" );
+         }
+         else if ( m_server.isSessionUsed() && ( endHeaderIndex == cookieLen ) && matches( buf, cookieHeader ) )
+         {
+            // keep everything up to first ;
+            while ( ( ++i < n ) && ( buf[i] != ';' ) && ( buf[i] != '\r' ) && ( buf[i] != '\n' ) )
+            {
+               cookie.append( (char) ( buf[i] & 0x7f ) );
+            }
+
+            headers.addHeader( "Set-Cookie",
+                  cookie.toString() );
+         }
+         else if ( m_server.isSessionUsed() && ( endHeaderIndex == cookie2Len ) && matches( buf, cookie2Header ) )
+         {
+            // keep everything up to first ;
+            while ( ( ++i < n ) && ( buf[i] != ';' ) && ( buf[i] != '\r' ) && ( buf[i] != '\n' ) )
+            {
+               cookie2.append( (char) ( buf[i] & 0x7f ) );
+            }
+
+            headers.addHeader( "Set-Cookie2",
+                  cookie.toString() );
+         }
+         else if ( ( endHeaderIndex == authLen ) && matches( buf, authHeader ) )
+         {
+            if ( matches( buf, endHeaderIndex, basicAuth ) )
+            {
+               i += basicAuth.length;
+
+               while ( ( ++i < n ) && ( buf[i] != '\r' ) && ( buf[i] != '\n' ) )
+               {
+                  if ( buf[i] == ' ' )
+                  {
+                     continue;
+                  }
+
+                  authInfo.append( (char) ( buf[i] & 0x7f ) );
+               }
+
+               headers.addHeader( HTTPConstants.HEADER_AUTHORIZATION,
+                     new String( basicAuth ) + authInfo.toString() );
+            }
+            else
+            {
+               throw new java.io.IOException( Messages.getMessage( "badAuth00" ) );
+            }
+         }
+         else if ( ( endHeaderIndex == locationLen ) && matches( buf, locationHeader ) )
+         {
+            while ( ( ++i < n ) && ( buf[i] != '\r' ) && ( buf[i] != '\n' ) )
+            {
+               if ( buf[i] == ' ' )
+               {
+                  continue;
+               }
+
+               contentLocation.append( (char) ( buf[i] & 0x7f ) );
+            }
+
+            headers.addHeader( HTTPConstants.HEADER_CONTENT_LOCATION,
+                  contentLocation.toString() );
+         }
+         else if ( ( endHeaderIndex == typeLen ) && matches( buf, typeHeader ) )
+         {
+            while ( ( ++i < n ) && ( buf[i] != '\r' ) && ( buf[i] != '\n' ) )
+            {
+               if ( buf[i] == ' ' )
+               {
+                  continue;
+               }
+
+               contentType.append( (char) ( buf[i] & 0x7f ) );
+            }
+
+            headers.addHeader( HTTPConstants.HEADER_CONTENT_TYPE,
+                  contentLocation.toString() );
+         }
+         else
+         {
+            String customHeaderName = new String( buf, 0, endHeaderIndex - 2 );
+            StringBuffer customHeaderValue = new StringBuffer();
+
+            while ( ( ++i < n ) && ( buf[i] != '\r' ) && ( buf[i] != '\n' ) )
+            {
+               if ( buf[i] == ' ' )
+               {
+                  continue;
+               }
+
+               customHeaderValue.append( (char) ( buf[i] & 0x7f ) );
+            }
+
+            headers.addHeader( customHeaderName,
+                  customHeaderValue.toString() );
+         }
+      }
+
+      return len;
+   }
+
+   /**
+    * output an integer into the output stream
+    *
+    * @param out   OutputStream to be written to
+    * @param value Integer value to be written.
+    */
+   private void putInt( byte[] buf,
+                        OutputStream out,
+                        int value )
+         throws java.io.IOException
+   {
+      int len = 0;
+      int offset = buf.length;
+
+      // negative numbers
+      if ( value < 0 )
+      {
+         buf[--offset] = (byte) '-';
+         value = -value;
+         len++;
+      }
+
+      // zero
+      if ( value == 0 )
+      {
+         buf[--offset] = (byte) '0';
+         len++;
+      }
+
+      // positive numbers
+      while ( value > 0 )
+      {
+         buf[--offset] = (byte) ( ( value % 10 ) + '0' );
+         value = value / 10;
+         len++;
+      }
+
+      // write the result
+      out.write( buf, offset, len );
+   }
+
+   /**
+    * Read a single line from the input stream
+    *
+    * @param is  inputstream to read from
+    * @param b   byte array to read into
+    * @param off starting offset into the byte array
+    * @param len maximum number of bytes to read
+    */
+   private int readLine( NonBlockingBufferedInputStream is,
+                         byte[] b,
+                         int off,
+                         int len )
+         throws java.io.IOException
+   {
+      int count = 0;
+      int c;
+
+      while ( ( c = is.read() ) != -1 )
+      {
+         if ( ( c != '\n' ) && ( c != '\r' ) )
+         {
+            b[off++] = (byte) c;
+            count++;
+         }
+
+         if ( count == len )
+         {
+            break;
+         }
+
+         if ( '\n' == c )
+         {
+            int peek = is.peek(); //If the next line begins with tab or space then this is a continuation.
+
+            if ( ( peek != ' ' ) && ( peek != '\t' ) )
+            {
+               break;
+            }
+         }
+      }
+
+      return ( count > 0 ) ? count : ( -1 );
+   }
+}
\ No newline at end of file

Added: webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/resource/example/Disk.java
URL: http://svn.apache.org/viewcvs/webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/resource/example/Disk.java?rev=232389&view=auto
==============================================================================
--- webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/resource/example/Disk.java (added)
+++ webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/resource/example/Disk.java Fri Aug 12 13:51:57 2005
@@ -0,0 +1,309 @@
+/*=============================================================================*
+ *  Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *=============================================================================*/
+package org.apache.ws.resource.example;
+
+import org.apache.xmlbeans.GDuration;
+import java.io.Serializable;
+import java.math.BigInteger;
+import java.util.Calendar;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Example bean representing a "backend" managed resource.
+ *
+ * NOTE: Here's a high-level algo for mapping resource prop XSD types to member var types:
+ * <pre>
+ * if ( minOccurs == "1" && maxOccurs == "1" )
+ *    type = single object or primitive
+ * elif ( maxOccurs != "unbounded" )
+ *    type = array of objects or primitives w/ size=maxOccurs
+ * elif
+ *    type = java.util.List
+ * fi
+ * </pre>
+ *
+ * @author Ian P. Springer
+ */
+public class Disk
+   implements Serializable
+{
+   private BigInteger   m_number_of_blocks = ExampleConstants.INITIAL_PROP_VALUE__NUMBER_OF_BLOCKS;
+   private Set          m_filesystems    = buildFileSystemSet(  );
+   private Set          m_state_info_set = buildStateInfoSet(  );
+   private String       m_manufacturer   = ExampleConstants.INITIAL_PROP_VALUE__MANUFACTURER;
+   private int          m_block_size     = ExampleConstants.INITIAL_PROP_VALUE__BLOCK_SIZE;
+   private boolean      m_isStarted;
+   private final String m_serialNumber;
+   private GDuration    m_activeTime     = ExampleConstants.INITIAL_PROP_VALUE__ACTIVE_TIME;
+
+   /**
+    * Creates a new {@link Disk} object with the specified serial number.
+    */
+   public Disk( String serialNumber )
+   {
+      m_serialNumber = serialNumber;
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @param activeTime DOCUMENT_ME
+    */
+   public void setActiveTime( GDuration activeTime )
+   {
+      m_activeTime = activeTime;
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @return DOCUMENT_ME
+    */
+   public GDuration getActiveTime(  )
+   {
+      return m_activeTime;
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @param blockSize DOCUMENT_ME
+    */
+   public void setBlockSize( int blockSize )
+   {
+      m_block_size = blockSize;
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @return DOCUMENT_ME
+    */
+   public int getBlockSize(  )
+   {
+      return m_block_size;
+   }
+
+   /**
+    * Returns the current capacity, computed via the formula: NumberOfBlocks * BlockSize
+    */
+   public BigInteger getCapacity(  )
+   {
+      return computeCapacity( m_number_of_blocks, m_block_size );
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @return DOCUMENT_ME
+    */
+   public String getSerialNumber(  )
+   {
+      return m_serialNumber;
+   }
+
+   /**
+    * Computes the capacity of a disk with the specified number of blocks and block size.
+    *
+    * @param numberOfBlocks number of blocks
+    * @param blockSize block size
+    *
+    * @return the capacity of a disk with specified number of blocks and block size
+    */
+   public static BigInteger computeCapacity( BigInteger numberOfBlocks,
+                                             int        blockSize )
+   {
+      return numberOfBlocks.multiply( new BigInteger( String.valueOf( blockSize ) ) );
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @return DOCUMENT_ME
+    */
+   public String[] getFilesystems(  )
+   {
+      return (String[]) m_filesystems.toArray( new String[0] );
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @param manufacturer DOCUMENT_ME
+    */
+   public void setManufacturer( String manufacturer )
+   {
+      m_manufacturer = manufacturer;
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @return DOCUMENT_ME
+    */
+   public String getManufacturer(  )
+   {
+      return m_manufacturer;
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @param numberOfBlocks DOCUMENT_ME
+    */
+   public void setNumberOfBlocks( BigInteger numberOfBlocks )
+   {
+      m_number_of_blocks = numberOfBlocks;
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @return DOCUMENT_ME
+    */
+   public BigInteger getNumberOfBlocks(  )
+   {
+      return m_number_of_blocks;
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @return DOCUMENT_ME
+    */
+   public boolean isStarted(  )
+   {
+      return m_isStarted;
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @return DOCUMENT_ME
+    */
+   public StateInfo[] getStateInfoList(  )
+   {
+      return (StateInfo[]) m_state_info_set.toArray( new StateInfo[0] );
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @param filesystem DOCUMENT_ME
+    */
+   public void addFilesystem( String filesystem )
+   {
+      m_filesystems.add( filesystem );
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @param stateInfo DOCUMENT_ME
+    */
+   public void addStateInfo( StateInfo stateInfo )
+   {
+      m_state_info_set.add( stateInfo );
+   }
+
+   /**
+    * DOCUMENT_ME
+    */
+   public void removeAllFilesystems(  )
+   {
+      m_filesystems = new HashSet(  );
+   }
+
+   /**
+    * DOCUMENT_ME
+    */
+   public void removeAllStateInfos(  )
+   {
+      m_state_info_set.clear(  );
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @param filesystem DOCUMENT_ME
+    */
+   public void removeFilesystem( String filesystem )
+   {
+      m_filesystems.remove( filesystem );
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @param stateInfo DOCUMENT_ME
+    */
+   public void removeStateInfo( StateInfo stateInfo )
+   {
+      m_state_info_set.remove( stateInfo );
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @throws Exception DOCUMENT_ME
+    */
+   public void start(  )
+   throws Exception
+   {
+      if ( !m_isStarted )
+      {
+         m_isStarted = true;
+         System.out.println( "Backend disk with serial # " + m_serialNumber + " has been started." );
+      }
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @throws Exception DOCUMENT_ME
+    */
+   public void stop(  )
+   throws Exception
+   {
+      if ( m_isStarted )
+      {
+         m_isStarted = false;
+         System.out.println( "Backend disk with serial # " + m_serialNumber + " has been stopped." );
+      }
+   }
+
+   private Set buildFileSystemSet(  )
+   {
+      Set set = new HashSet(  );
+      set.add( "/" );
+      return set;
+   }
+
+   private Set buildStateInfoSet(  )
+   {
+      Set       set        = new HashSet(  );
+      StateInfo stateInfo1 = new StateInfo(  );
+      stateInfo1.setState( "http://stopped" );
+      stateInfo1.setTimeEntered( Calendar.getInstance(  ) );
+      set.add( stateInfo1 );
+      StateInfo stateInfo2 = new StateInfo(  );
+      stateInfo2.setState( "http://starting" );
+      stateInfo2.setTimeEntered( Calendar.getInstance(  ) );
+      set.add( stateInfo2 );
+      return set;
+   }
+}
\ No newline at end of file

Added: webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/resource/example/ExampleConstants.java
URL: http://svn.apache.org/viewcvs/webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/resource/example/ExampleConstants.java?rev=232389&view=auto
==============================================================================
--- webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/resource/example/ExampleConstants.java (added)
+++ webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/resource/example/ExampleConstants.java Fri Aug 12 13:51:57 2005
@@ -0,0 +1,83 @@
+/*=============================================================================*
+ *  Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *=============================================================================*/
+package org.apache.ws.resource.example;
+
+import org.apache.xmlbeans.GDuration;
+import javax.xml.namespace.QName;
+import java.math.BigInteger;
+
+/**
+ * Example-related constants.
+ *
+ * @author Ian P. Springer
+ */
+public interface ExampleConstants
+{
+   /** DOCUMENT_ME */
+   BigInteger INITIAL_PROP_VALUE__NUMBER_OF_BLOCKS = new BigInteger( "20000000000" );
+
+   /** Target namespace prefix for the disk WSDL */
+   String NSPREFIX_XYZ = "xyz";
+
+   /** Target namespace URI of the disk WSDL */
+   String NSURI_XYZ = "http://xyz.com/";
+
+   /** QNames */
+   QName RESOURCE_PROP_QNAME_ACTIVE_TIME = new QName( NSURI_XYZ, "ActiveTime", NSPREFIX_XYZ );
+
+   /** DOCUMENT_ME */
+   QName RESOURCE_PROP_QNAME_BLOCK_SIZE = new QName( NSURI_XYZ, "BlockSize", NSPREFIX_XYZ );
+
+   /** DOCUMENT_ME */
+   QName RESOURCE_PROP_QNAME_CAPACITY = new QName( NSURI_XYZ, "Capacity", NSPREFIX_XYZ );
+
+   /** DOCUMENT_ME */
+   QName RESOURCE_PROP_QNAME_FILE_SYSTEM = new QName( NSURI_XYZ, "FileSystem", NSPREFIX_XYZ );
+
+   /** DOCUMENT_ME */
+   QName RESOURCE_PROP_QNAME_MANUFACTURER = new QName( NSURI_XYZ, "Manufacturer", NSPREFIX_XYZ );
+
+   /** DOCUMENT_ME */
+   QName RESOURCE_PROP_QNAME_NUMBER_OF_BLOCKS = new QName( NSURI_XYZ, "NumberOfBlocks", NSPREFIX_XYZ );
+
+   /** DOCUMENT_ME */
+   QName RESOURCE_PROP_QNAME_STATE_INFO = new QName( NSURI_XYZ, "StateInfo", NSPREFIX_XYZ );
+
+   /** DOCUMENT_ME */
+   QName RESOURCE_PROP_QNAME_TOPIC_SPACE = new QName( NSURI_XYZ, "TopicSpace", NSPREFIX_XYZ );
+
+   /** DOCUMENT_ME */
+   String INITIAL_PROP_VALUE__MANUFACTURER = "Hewlett-Packard Company";
+
+   /** Name of the deployed disk Web service */
+   String SERVICE_NAME = "disk";
+
+   /** Qualified name of the deployed disk Web service */
+   QName SERVICE_QNAME = new QName( NSURI_XYZ, SERVICE_NAME );
+
+   /** URL path of the disk Web service */
+   String SERVICE_URL_PATH = "/axis/services/" + SERVICE_NAME;
+
+   /** DOCUMENT_ME */
+   int INITIAL_PROP_VALUE__BLOCK_SIZE = 1024;
+
+   /** DOCUMENT_ME */
+   BigInteger INITIAL_PROP_VALUE__CAPACITY =
+      Disk.computeCapacity( INITIAL_PROP_VALUE__NUMBER_OF_BLOCKS, INITIAL_PROP_VALUE__BLOCK_SIZE );
+
+   /** DOCUMENT_ME */
+   GDuration INITIAL_PROP_VALUE__ACTIVE_TIME = new GDuration( "P0M" );
+}
\ No newline at end of file

Added: webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/resource/example/StateInfo.java
URL: http://svn.apache.org/viewcvs/webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/resource/example/StateInfo.java?rev=232389&view=auto
==============================================================================
--- webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/resource/example/StateInfo.java (added)
+++ webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/resource/example/StateInfo.java Fri Aug 12 13:51:57 2005
@@ -0,0 +1,69 @@
+/*=============================================================================*
+ *  Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *=============================================================================*/
+package org.apache.ws.resource.example;
+
+import java.io.Serializable;
+import java.util.Calendar;
+
+/**
+ * @author Ian P. Springer
+ */
+public class StateInfo
+   implements Serializable
+{
+   private Calendar m_timeEntered;
+   private String   m_state;
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @param state DOCUMENT_ME
+    */
+   public void setState( String state )
+   {
+      m_state = state;
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @return DOCUMENT_ME
+    */
+   public String getState(  )
+   {
+      return m_state;
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @param timeEntered DOCUMENT_ME
+    */
+   public void setTimeEntered( Calendar timeEntered )
+   {
+      m_timeEntered = timeEntered;
+   }
+
+   /**
+    * DOCUMENT_ME
+    *
+    * @return DOCUMENT_ME
+    */
+   public Calendar getTimeEntered(  )
+   {
+      return ( m_timeEntered );
+   }
+}
\ No newline at end of file

Added: webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/resource/example/discovery/DiskDiscoveryAgent.java
URL: http://svn.apache.org/viewcvs/webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/resource/example/discovery/DiskDiscoveryAgent.java?rev=232389&view=auto
==============================================================================
--- webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/resource/example/discovery/DiskDiscoveryAgent.java (added)
+++ webservices/muse/trunk/src/examples/client/src/test/org/apache/ws/resource/example/discovery/DiskDiscoveryAgent.java Fri Aug 12 13:51:57 2005
@@ -0,0 +1,100 @@
+package org.apache.ws.resource.example.discovery;
+	    
+
+import javax.xml.namespace.QName;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.ws.resource.discovery.DiscoveryAgent;
+import org.apache.ws.resource.discovery.RegistrationManager;
+import org.apache.ws.resource.discovery.faults.RegistrationFailureException;
+import org.apache.ws.resource.discovery.impl.DiscoveryAgentProperty;
+
+import axis.com.xyz.DiskWsdmServiceWSResource;
+
+/**
+ * This is a sample discovery agent that will add one new instance of a
+ * disk resource for each Agent property with an id of ResourceID.
+ * Its value will be the resource id to be used.
+ * <p/>
+ * Below is a sample of how to instantiate 2 instances of
+ * disk resource, one with the id of 1234 and another with one
+ * of 5678.
+ * <p/>
+ * <pre>
+ *  <agent-list >
+ *   <agent>
+ *       <name>Disk Resource Discovery Agent</name>
+ *       <class>org.apache.ws.resource.example.discovery.DiskDiscoveryAgent</class>
+ *       <properties>
+ *           <property id="ResourceID">1234</property>
+ *           <property id="ResourceID">5678</property>
+ *       </properties>
+ *    </agent>
+ *   </agent-list>
+ * </pre>
+ *
+ * @author wire
+ * @version $Revision: 1.1 $
+ */
+public class DiskDiscoveryAgent
+   implements DiscoveryAgent
+{
+   /**
+    * Provides log access for this class.
+    */
+   private static final Log LOG = LogFactory.getLog( DiskDiscoveryAgent.class );
+
+   /**
+    * @see DiscoveryAgent#discover(String, RegistrationManager, DiscoveryAgentProperty[])
+    */
+   public void discover( String                   agentname,
+                         RegistrationManager      registrationManager,
+                         DiscoveryAgentProperty[] agentProps )
+   {
+      // See how many agentProps there are with ResourceID
+      // For each one, create a DiskResource and register it
+      int discoveredCount = 0;
+      for ( int i = 0; i < agentProps.length; i++ )
+      {
+         DiscoveryAgentProperty agentProp = agentProps[i];
+         if ( agentProp.getId(  ).equals( "ResourceID" ) )
+         {
+            DiskWsdmServiceWSResource resource = null;
+            try
+            {
+               String resourceId = agentProp.getValue(  );
+               resource = new DiskWsdmServiceWSResource( resourceId );
+               resource.getPropertiesManager(  ).setReadOnly(new QName( "http://xyz.com/", "Capacity", "xyz" ), true );
+               discoveredCount++;
+            }
+            catch ( Throwable t )
+            {
+               LOG.error( "Discovery failed for DiskWsdmServiceWSResource with Id " + agentProp.getId(  ), t );
+               continue;
+            }
+
+            LOG.info( "Attempting to register an instance of DiskWsdmServiceWSResource ResourceID="
+                      + agentProp.getValue(  ) );
+            try
+            {
+               registrationManager.register( resource );
+            }
+            catch ( RegistrationFailureException rfe )
+            {
+               LOG.error( "Discovery failed to register " + agentProp.getId(  ), rfe );
+            }
+         }
+      }
+
+      //Just for conveniance, if nothing was discovered, write that to the log.
+      if ( discoveredCount == 0 )
+      {
+         LOG.warn( "Discovery completed on agent " + agentname + " but no new resources where added." );
+      }
+      else
+      {
+         LOG.info( "Discovery agent <" + agentname + "> finished." );
+      }
+   }
+}
\ No newline at end of file



---------------------------------------------------------------------
To unsubscribe, e-mail: muse-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: muse-dev-help@ws.apache.org