You are viewing a plain text version of this content. The canonical link for it is here.
Posted to soap-dev@xml.apache.org by du...@apache.org on 2001/04/06 15:03:51 UTC

cvs commit: xml-soap/java/src/org/apache/soap/server BaseConfigManager.java XMLConfigManager.java DefaultConfigManager.java

dug         01/04/06 06:03:51

  Modified:    java/src/org/apache/soap/server XMLConfigManager.java
                        DefaultConfigManager.java
  Added:       java/src/org/apache/soap/server BaseConfigManager.java
  Log:
  Changes to the XML Config Manager and addition of a Base
  Config Manager to make writing new Config Managers a little easier.
  Sumitted by: Mugnus Thor Torfason(magnus@handpoint.com)
  
  Revision  Changes    Path
  1.2       +42 -100   xml-soap/java/src/org/apache/soap/server/XMLConfigManager.java
  
  Index: XMLConfigManager.java
  ===================================================================
  RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/server/XMLConfigManager.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XMLConfigManager.java	2001/04/03 02:24:35	1.1
  +++ XMLConfigManager.java	2001/04/06 13:03:51	1.2
  @@ -57,20 +57,30 @@
   
   package org.apache.soap.server ;
   
  +// Core java classes
   import java.util.* ;
   import java.io.* ;
  +
  +// Java Servlet Classes
   import javax.servlet.* ;
   import javax.servlet.http.* ;
  +
  +// XML Classes
  +import javax.xml.parsers.* ;
  +import org.w3c.dom.* ;
  +import org.xml.sax.* ;
  +
  +// SOAP Classes
   import org.apache.soap.* ;
   import org.apache.soap.rpc.* ;
   import org.apache.soap.server.* ;
   import org.apache.soap.server.http.* ;
   import org.apache.soap.util.* ;
  +import org.apache.soap.util.xml.* ;
   
   /**
    * An <code>XMLConfigManager</code> ...
    *
  - * @author Dug (dug@us.ibm.com)
    * @author <a href="mailto:magnus@handpoint.com">Magnus Thor Torfason</a>
    *
    * This class should be almost identical in function to the
  @@ -85,18 +95,11 @@
    * registry file (typically <tt>DeployedServices.xml</tt>).
    *
    */
  -public class XMLConfigManager implements ConfigManager {
  -  protected Hashtable      dds      = new Hashtable();
  -  protected String         filename = "DeployedServices.xml";
  -  protected String[]       serviceNamesCache ;
  -  protected ServletContext context  = null;
  +public class XMLConfigManager extends BaseConfigManager
  +          implements ConfigManager {
   
  -  /**
  -   * Sets the Servlet Context.
  -   */
  -  public void setContext(ServletContext context) {
  -    this.context = context;
  -  }
  +  /** The name of the deployment file. */
  +  protected String filename = "DeployedServices.xml";
   
     /**
      * This method sets the configuration options (usually
  @@ -106,83 +109,12 @@
       if ( options == null ) return ;
   
       String value = (String) options.get( "filename" );
  -    if ( value != null && !"".equals(value) )
  +    if ( value != null && !"".equals(value) ) {
         filename = value ;
  -  }
  -
  -  /**
  -   * The init method loads any services that are defined in
  -   * the underlying registry file.
  -   */
  -  public void init() throws SOAPException {
  -    loadRegistry();
  -  }
  -
  -  /**
  -   * Used to deploy a service using a specified DeploymentDescriptor.
  -   *
  -   * <p>
  -   *
  -   * Note that this method will save the currently deployed services
  -   * to the underlying registry file, overriding the old configuration.
  -   */
  -  public void deploy( DeploymentDescriptor dd ) throws SOAPException {
  -    String  id = dd.getID();
  -    dds.put( id, dd );
  -    saveRegistry();
  -    serviceNamesCache = null ;
  -  }
  -
  -  /**
  -   * Undeploy previously deployed services.
  -   *
  -   * <p>
  -   *
  -   * Note that this method will save the currently deployed services
  -   * to the underlying registry file, overriding the old configuration.
  -   */
  -  public DeploymentDescriptor undeploy( String id ) throws SOAPException {
  -    DeploymentDescriptor dd = (DeploymentDescriptor) dds.remove( id );
  -    if ( dd != null ) {
  -      saveRegistry();
  -      serviceNamesCache = null ;
  -    } else {
  -      throw new SOAPException( Constants.FAULT_CODE_SERVER,
  -        "Service '" + id + "' unknown" );
  -    }
  -    return( dd );
  -  }
  -
  -  /**
  -   * Returns a list of all currently deployed services.
  -   */
  -  public String[] list() throws SOAPException {
  -    if (serviceNamesCache != null) {
  -      return serviceNamesCache;
  -    }
  -    Enumeration e = dds.keys ();
  -    int count = dds.size ();
  -    serviceNamesCache = new String[count];
  -    for (int i = 0; i < count; i++) {
  -      serviceNamesCache[i] = (String) e.nextElement ();
       }
  -    return serviceNamesCache;
     }
   
     /**
  -   * Returns a DeploymentDescriptor from the ConfigManager.
  -   *
  -   * <p>
  -   *
  -   * This method will simply return null if there is no descriptor
  -   * corresponding to the id (should it throw a SOAPException ?).
  -   */
  -  public DeploymentDescriptor query(String id) throws SOAPException {
  -    DeploymentDescriptor dd = (DeploymentDescriptor) dds.get (id);
  -    return( dd );
  -  }
  -
  -  /**
      * Loads the descriptors from the underlying registry file, which
      * should be represented as a list of deployment descriptor elements.
      */
  @@ -191,32 +123,37 @@
       try {
         File file = ServerHTTPUtils.getFileFromNameAndContext(filename,
           context);
  -      FileReader fr = new FileReader (file);
  -      StringWriter sw = new StringWriter();
  -      char[] buf = new char[1024];
  -      int cnt;
  -      while ( (cnt = fr.read(buf)) != -1) {
  -        sw.write(buf,0,cnt);
  +      FileReader rd = new FileReader (file);
  +
  +      DocumentBuilder       xdb  = null;
  +      Document              doc  = null;
  +      Element               root = null;
  +
  +      try {
  +        xdb  = XMLParserUtils.getXMLDocBuilder();
  +        doc  = xdb.parse(new InputSource(rd));
  +        root = doc.getDocumentElement();
  +      } catch (Exception e) {
  +        e.printStackTrace();
  +        throw new SOAPException(Constants.FAULT_CODE_SERVER,e.getMessage());
         }
  -      fr.close ();
  -      String fileString = sw.toString();
   
  +      NodeList deploymentElements = root.getElementsByTagNameNS(
  +              Constants.NS_URI_XML_SOAP_DEPLOYMENT, "service");
  +
  +      int count = deploymentElements.getLength();
         dds = new Hashtable();
  -      int endTokenPosition;
  -      while ( (endTokenPosition =
  -              fileString.indexOf("</isd:service>") ) != -1) {
  -        StringReader sr = new StringReader(
  -                fileString.substring(0,endTokenPosition+14));
  -        DeploymentDescriptor dd = DeploymentDescriptor.fromXML(sr);
  +      for( int i=0; i<count; i++ ) {
  +        Element deploymentElement = (Element)deploymentElements.item(i);
  +        DeploymentDescriptor dd = DeploymentDescriptor.fromXML(
  +                deploymentElement);
           String  id = dd.getID();
           dds.put( id, dd );
  -        fileString = fileString.substring(endTokenPosition+14);
         }
       } catch(Exception e) {
         dds = new Hashtable ();
         System.err.println ("SOAP Service Manager: Unable to read '" +
           filename +  "': assuming fresh start");
  -      // e.printStackTrace();
       }
     }
   
  @@ -230,11 +167,16 @@
           context);
         PrintWriter pw = new PrintWriter(new FileWriter (file));
         Enumeration e = dds.elements();
  +
  +      pw.println("<deployedServices>");
  +      pw.println();
         while ( e.hasMoreElements() ) {
           DeploymentDescriptor dd = (DeploymentDescriptor)e.nextElement();
           dd.toXML(pw);
           pw.println();
         }
  +      pw.println("</deployedServices>");
  +
         pw.close ();
       } catch (Exception e) {
         throw new SOAPException (Constants.FAULT_CODE_SERVER,
  
  
  
  1.8       +20 -52    xml-soap/java/src/org/apache/soap/server/DefaultConfigManager.java
  
  Index: DefaultConfigManager.java
  ===================================================================
  RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/server/DefaultConfigManager.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- DefaultConfigManager.java	2001/02/02 03:32:05	1.7
  +++ DefaultConfigManager.java	2001/04/06 13:03:51	1.8
  @@ -71,6 +71,7 @@
    * A <code>DefaultConfigManager</code> ...
    *
    * @author Dug (dug@us.ibm.com)
  + * @author <a href="mailto:magnus@handpoint.com">Magnus Thor Torfason</a>
    *
    * With the introduction of a ConfigManager, the notion of a SOAP
    * configuration file was also introduced.  The SOAP server will now
  @@ -92,66 +93,29 @@
    * of the soap.xml configuration file.
    *
    */
  -public class DefaultConfigManager implements ConfigManager {
  -  protected Hashtable      dds      = new Hashtable();
  -  protected String         filename = "DeployedServices.ds";
  -  protected String[]       serviceNamesCache ;
  -  protected ServletContext context  = null;
  +public class DefaultConfigManager extends BaseConfigManager
  +          implements ConfigManager {
   
  -  public void setContext(ServletContext context) {
  -    this.context = context;
  -  }
  +  /** The name of the deployment file. */
  +  protected String filename = "DeployedServices.ds";
  +
   
  +  /**
  +   * This method sets the configuration options (usually
  +   * read from the config file).
  +   */
     public void setOptions( Hashtable options ) {
       if ( options == null ) return ;
  -    
  +
       String value = (String) options.get( "filename" );
  -    if ( value != null && !"".equals(value) ) 
  +    if ( value != null && !"".equals(value) )
         filename = value ;
     }
  -
  -  public void init() throws SOAPException {
  -    loadRegistry();
  -  }
  -
  -  public void deploy( DeploymentDescriptor dd ) throws SOAPException {
  -    String  id = dd.getID();
  -    dds.put( id, dd );
  -    saveRegistry();
  -    serviceNamesCache = null ;
  -  }
  -
  -  public DeploymentDescriptor undeploy( String id ) throws SOAPException {
  -    DeploymentDescriptor dd = (DeploymentDescriptor) dds.remove( id );
  -    if ( dd != null ) {
  -      saveRegistry();
  -      serviceNamesCache = null ;
  -    }
  -    else {
  -      throw new SOAPException( Constants.FAULT_CODE_SERVER,
  -                               "Service '" + id + "' unknown" );
  -    }
  -    return( dd );
  -  }
  -
  -  public String[] list() throws SOAPException {
  -    if (serviceNamesCache != null) {
  -      return serviceNamesCache;
  -    }
  -    Enumeration e = dds.keys ();
  -    int count = dds.size ();
  -    serviceNamesCache = new String[count];
  -    for (int i = 0; i < count; i++) {
  -      serviceNamesCache[i] = (String) e.nextElement ();
  -    }
  -    return serviceNamesCache;
  -  }
  -
  -  public DeploymentDescriptor query(String id) throws SOAPException {
  -    DeploymentDescriptor dd = (DeploymentDescriptor) dds.get (id);
  -    return( dd );
  -  }
   
  +  /**
  +   * Loads the descriptors from the underlying registry file, which
  +   * contains a serialized Hashtable.
  +   */
     public void loadRegistry() throws SOAPException {
       // load in a serialized thing
       dds = null ;
  @@ -170,6 +134,10 @@
       }
     }
   
  +  /**
  +   * Saves currently deployed descriptors to the underlying registry file,
  +   * as a serialized Hashtable.
  +   */
     public void saveRegistry() throws SOAPException {
       try {
         File file = ServerHTTPUtils.getFileFromNameAndContext(filename,
  
  
  
  1.1                  xml-soap/java/src/org/apache/soap/server/BaseConfigManager.java
  
  Index: BaseConfigManager.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2000 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "SOAP" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation and was
   * originally based on software copyright (c) 2000, International
   * Business Machines, Inc., http://www.apache.org.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.soap.server ;
  
  import java.util.* ;
  import java.io.* ;
  import javax.servlet.* ;
  import javax.servlet.http.* ;
  import org.apache.soap.* ;
  import org.apache.soap.rpc.* ;
  import org.apache.soap.server.* ;
  import org.apache.soap.server.http.* ;
  import org.apache.soap.util.* ;
  
  /**
   * An <code>XMLConfigManager</code> ...
   *
   * @author Dug (dug@us.ibm.com)
   * @author <a href="mailto:magnus@handpoint.com">Magnus Thor Torfason</a>
   *
   * This class should be almost identical in function to the
   * DefaultConfigManager.
   *
   * <p>
   *
   * The only notable difference is that while
   * the DefaultConfigManager uses java readObject() and writeObject()
   * methods, this class uses the XML routines of DeploymentDescriptor
   * to save and load the DeploymentDescriptors from the underlying
   * registry file (typically <tt>DeployedServices.xml</tt>).
   *
   */
  public abstract class BaseConfigManager implements ConfigManager {
    protected Hashtable      dds      = new Hashtable();
    protected String[]       serviceNamesCache ;
    protected ServletContext context  = null;
  
    /**
     * Sets the Servlet Context.
     */
    public void setContext(ServletContext context) {
      this.context = context;
    }
  
    /**
     * The init method loads any services that are defined in
     * the underlying registry file.
     */
    public void init() throws SOAPException {
      loadRegistry();
    }
  
    /**
     * Used to deploy a service using a specified DeploymentDescriptor.
     *
     * <p>
     *
     * Note that this method will save the currently deployed services
     * to the underlying registry file, overriding the old configuration.
     */
    public void deploy( DeploymentDescriptor dd ) throws SOAPException {
      String  id = dd.getID();
      dds.put( id, dd );
      saveRegistry();
      serviceNamesCache = null ;
    }
  
    /**
     * Undeploy previously deployed services.
     *
     * <p>
     *
     * Note that this method will save the currently deployed services
     * to the underlying registry file, overriding the old configuration.
     */
    public DeploymentDescriptor undeploy( String id ) throws SOAPException {
      DeploymentDescriptor dd = (DeploymentDescriptor) dds.remove( id );
      if ( dd != null ) {
        saveRegistry();
        serviceNamesCache = null ;
      } else {
        throw new SOAPException( Constants.FAULT_CODE_SERVER,
          "Service '" + id + "' unknown" );
      }
      return( dd );
    }
  
    /**
     * Returns a list of all currently deployed services.
     */
    public String[] list() throws SOAPException {
      if (serviceNamesCache != null) {
        return serviceNamesCache;
      }
      Enumeration e = dds.keys ();
      int count = dds.size ();
      serviceNamesCache = new String[count];
      for (int i = 0; i < count; i++) {
        serviceNamesCache[i] = (String) e.nextElement ();
      }
      return serviceNamesCache;
    }
  
    /**
     * Returns a DeploymentDescriptor from the ConfigManager.
     *
     * <p>
     *
     * This method will simply return null if there is no descriptor
     * corresponding to the id (should it throw a SOAPException ?).
     */
    public DeploymentDescriptor query(String id) throws SOAPException {
      DeploymentDescriptor dd = (DeploymentDescriptor) dds.get (id);
      return( dd );
    }
  
    /**
     * The loadRegistry() method must be implemented in non-abstract
     * subclasses of BaseConfigManager.
     */
    public abstract void loadRegistry() throws SOAPException;
  
    /**
     * The saveRegistry() method must be implemented in non-abstract
     * subclasses of BaseConfigManager.
     */
    public abstract void saveRegistry() throws SOAPException;
  }