You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2004/01/19 07:40:07 UTC

cvs commit: incubator-geronimo/modules/deployment/src/java/org/apache/geronimo/deployment/xml LocalEntityResolver.java ParserFactory.java ParserFactoryImpl.java

djencks     2004/01/18 22:40:07

  Modified:    modules/deployment/src/java/org/apache/geronimo/deployment/service
                        ServiceDeployer.java ServiceModule.java
               modules/deployment/src/java/org/apache/geronimo/deployment/tools
                        DeployCommand.java
  Added:       modules/deployment/src/java/org/apache/geronimo/deployment
                        BatchDeployerFactory.java
               modules/deployment/src/java/org/apache/geronimo/deployment/util
                        ExplicitDeployment.java
               modules/deployment/src/java/org/apache/geronimo/deployment/xml
                        LocalEntityResolver.java ParserFactory.java
                        ParserFactoryImpl.java
  Log:
  infrastructure and updates for working deployer test framework.  Several of these classes may be temporary
  
  Revision  Changes    Path
  1.1                  incubator-geronimo/modules/deployment/src/java/org/apache/geronimo/deployment/BatchDeployerFactory.java
  
  Index: BatchDeployerFactory.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 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 "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" 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",
   *    "Apache Geronimo", 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.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  
  package org.apache.geronimo.deployment;
  
  import java.util.Collection;
  import java.util.ArrayList;
  import java.net.URI;
  import java.io.File;
  
  import org.apache.geronimo.gbean.GBeanInfo;
  import org.apache.geronimo.gbean.GBeanInfoFactory;
  import org.apache.geronimo.gbean.GEndpointInfo;
  import org.apache.geronimo.gbean.GOperationInfo;
  import org.apache.geronimo.kernel.config.ConfigurationParent;
  
  /**
   * TODO this does not put the deployers in any particular order.  This may be a problem.
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/19 06:40:07 $
   *
   * */
  public class BatchDeployerFactory {
  
      private static final GBeanInfo GBEAN_INFO;
  
      private int id = 0;
  
      private static File tmpDir = new File(System.getProperty("java.io.tmpdir"), "geronimo");
  
  
      private Collection deployers;
  
      public Collection getDeployers() {
          return deployers;
      }
  
      public void setDeployers(Collection deployers) {
          this.deployers = deployers;
      }
  
      public BatchDeployer getBatchDeployer(ConfigurationParent configurationParent, URI configID, File workingDir) {
          return new BatchDeployer(configurationParent, configID, new ArrayList(deployers), workingDir);
      }
  
      public synchronized File createWorkDir() {
          while (true) {
              File result = new File(tmpDir, "package" + id++);
              if (!result.exists()) {
                  result.mkdirs();
                  return result;
              }
          }
      }
  
  
      static {
          GBeanInfoFactory infoFactory = new GBeanInfoFactory(BatchDeployerFactory.class.getName());
          infoFactory.addOperation(new GOperationInfo("getBatchDeployer", new String[] {ConfigurationParent.class.getName(), URI.class.getName(), File.class.getName()}));
          infoFactory.addOperation(new GOperationInfo("createWorkDir"));
          infoFactory.addEndpoint(new GEndpointInfo("Deployers", ModuleFactory.class.getName()));
          GBEAN_INFO = infoFactory.getBeanInfo();
      }
  
      public static GBeanInfo getGBeanInfo() {
          return GBEAN_INFO;
      }
  
  }
  
  
  
  1.6       +3 -5      incubator-geronimo/modules/deployment/src/java/org/apache/geronimo/deployment/service/ServiceDeployer.java
  
  Index: ServiceDeployer.java
  ===================================================================
  RCS file: /home/cvs/incubator-geronimo/modules/deployment/src/java/org/apache/geronimo/deployment/service/ServiceDeployer.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ServiceDeployer.java	17 Jan 2004 17:00:31 -0000	1.5
  +++ ServiceDeployer.java	19 Jan 2004 06:40:07 -0000	1.6
  @@ -55,6 +55,7 @@
    */
   package org.apache.geronimo.deployment.service;
   
  +import java.beans.PropertyEditor;
   import java.net.URI;
   import java.net.URISyntaxException;
   import java.util.ArrayList;
  @@ -64,21 +65,18 @@
   import java.util.List;
   import java.util.Map;
   import java.util.Set;
  -import java.beans.PropertyEditor;
  -import java.beans.PropertyEditorManager;
   
   import javax.management.MalformedObjectNameException;
   import javax.management.ObjectName;
   import javax.xml.parsers.DocumentBuilder;
   
  +import org.apache.geronimo.common.propertyeditor.PropertyEditors;
   import org.apache.geronimo.deployment.DeploymentModule;
   import org.apache.geronimo.deployment.ModuleFactory;
   import org.apache.geronimo.deployment.util.DeploymentHelper;
   import org.apache.geronimo.kernel.deployment.DeploymentException;
   import org.apache.geronimo.kernel.deployment.scanner.URLInfo;
   import org.apache.geronimo.kernel.deployment.service.XMLUtil;
  -import org.apache.geronimo.common.Classes;
  -import org.apache.geronimo.common.propertyeditor.PropertyEditors;
   import org.w3c.dom.Document;
   import org.w3c.dom.Element;
   import org.w3c.dom.Node;
  
  
  
  1.3       +8 -8      incubator-geronimo/modules/deployment/src/java/org/apache/geronimo/deployment/service/ServiceModule.java
  
  Index: ServiceModule.java
  ===================================================================
  RCS file: /home/cvs/incubator-geronimo/modules/deployment/src/java/org/apache/geronimo/deployment/service/ServiceModule.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ServiceModule.java	16 Jan 2004 22:19:51 -0000	1.2
  +++ ServiceModule.java	19 Jan 2004 06:40:07 -0000	1.3
  @@ -56,16 +56,16 @@
   package org.apache.geronimo.deployment.service;
   
   import java.io.BufferedInputStream;
  -import java.io.IOException;
  -import java.io.InputStream;
   import java.io.File;
   import java.io.FileInputStream;
  +import java.io.IOException;
  +import java.io.InputStream;
   import java.net.URI;
   import java.net.URL;
   import java.util.Iterator;
  +import java.util.LinkedList;
   import java.util.List;
   import java.util.Map;
  -import java.util.LinkedList;
   import java.util.Set;
   import java.util.zip.ZipEntry;
   import java.util.zip.ZipInputStream;
  @@ -75,12 +75,12 @@
   
   import org.apache.geronimo.deployment.ConfigurationCallback;
   import org.apache.geronimo.deployment.DeploymentModule;
  -import org.apache.geronimo.kernel.deployment.DeploymentException;
  -import org.apache.geronimo.kernel.deployment.scanner.URLInfo;
  -import org.apache.geronimo.kernel.deployment.scanner.URLType;
   import org.apache.geronimo.gbean.GBeanInfo;
   import org.apache.geronimo.gbean.InvalidConfigurationException;
   import org.apache.geronimo.gbean.jmx.GBeanMBean;
  +import org.apache.geronimo.kernel.deployment.DeploymentException;
  +import org.apache.geronimo.kernel.deployment.scanner.URLInfo;
  +import org.apache.geronimo.kernel.deployment.scanner.URLType;
   
   /**
    *
  @@ -203,7 +203,7 @@
   
               GBeanMBean gbean;
               try {
  -                gbean = new GBeanMBean(gbeanInfo);
  +                gbean = new GBeanMBean(gbeanInfo, cl);
               } catch (InvalidConfigurationException e) {
                   throw new DeploymentException("Unable to create GMBean", e);
               }
  
  
  
  1.3       +9 -25     incubator-geronimo/modules/deployment/src/java/org/apache/geronimo/deployment/tools/DeployCommand.java
  
  Index: DeployCommand.java
  ===================================================================
  RCS file: /home/cvs/incubator-geronimo/modules/deployment/src/java/org/apache/geronimo/deployment/tools/DeployCommand.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- DeployCommand.java	17 Jan 2004 03:44:38 -0000	1.2
  +++ DeployCommand.java	19 Jan 2004 06:40:07 -0000	1.3
  @@ -65,20 +65,22 @@
   import java.util.ArrayList;
   import java.util.List;
   import java.util.jar.JarOutputStream;
  +
   import javax.xml.parsers.DocumentBuilder;
   import javax.xml.parsers.DocumentBuilderFactory;
   import javax.xml.parsers.ParserConfigurationException;
   
   import org.apache.geronimo.deployment.BatchDeployer;
   import org.apache.geronimo.deployment.NoDeployerException;
  +import org.apache.geronimo.deployment.util.FileUtil;
   import org.apache.geronimo.deployment.service.ServiceDeployer;
   import org.apache.geronimo.kernel.deployment.DeploymentException;
   import org.apache.geronimo.kernel.deployment.scanner.URLInfo;
   import org.apache.geronimo.kernel.deployment.scanner.URLType;
   
   /**
  - * 
  - * 
  + *
  + *
    * @version $Revision$ $Date$
    */
   public class DeployCommand {
  @@ -105,7 +107,7 @@
   
       public static void main(String[] args) {
           if (args.length < 3) {
  -            System.err.println("usage: "+DeployCommand.class.getName()+" <configID> <outfile> <url>+");
  +            System.err.println("usage: " + DeployCommand.class.getName() + " <configID> <outfile> <url>+");
               System.exit(1);
               throw new AssertionError();
           }
  @@ -134,7 +136,7 @@
           DeployCommand deployer = new DeployCommand(configFile, configID, workDir, deployers);
           int status = 0;
           try {
  -            for (int i=2; i < args.length; i++) {
  +            for (int i = 2; i < args.length; i++) {
                   File source = new File(args[i]);
                   deployer.add(source.toURL());
               }
  @@ -143,11 +145,7 @@
               e.printStackTrace();
               status = 2;
           } finally {
  -            try {
  -                recursiveDelete(workDir);
  -            } catch (IOException e) {
  -                // ignore
  -            }
  +            FileUtil.recursiveDelete(workDir);
           }
           System.exit(status);
       }
  @@ -159,22 +157,8 @@
               deployers.add(new ServiceDeployer(parser));
               return deployers;
           } catch (ParserConfigurationException e) {
  -            throw new AssertionError("Unable to instanciate XML Parser");
  +            throw new AssertionError("Unable to instantiate XML Parser");
           }
       }
   
  -    private static void recursiveDelete(File root) throws IOException {
  -        File[] files = root.listFiles();
  -        if (files != null) {
  -            for (int i = 0; i < files.length; i++) {
  -                File file = files[i];
  -                if (file.isDirectory()) {
  -                    recursiveDelete(file);
  -                } else {
  -                    file.delete();
  -                }
  -            }
  -        }
  -        root.delete();
  -    }
   }
  
  
  
  1.1                  incubator-geronimo/modules/deployment/src/java/org/apache/geronimo/deployment/util/ExplicitDeployment.java
  
  Index: ExplicitDeployment.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 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 "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" 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",
   *    "Apache Geronimo", 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.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  
  package org.apache.geronimo.deployment.util;
  
  import java.io.File;
  import java.net.URI;
  import java.net.URL;
  
  import javax.management.ObjectName;
  
  import org.apache.geronimo.deployment.BatchDeployer;
  import org.apache.geronimo.deployment.BatchDeployerFactory;
  import org.apache.geronimo.gbean.GAttributeInfo;
  import org.apache.geronimo.gbean.GBean;
  import org.apache.geronimo.gbean.GBeanInfo;
  import org.apache.geronimo.gbean.GBeanInfoFactory;
  import org.apache.geronimo.gbean.GConstructorInfo;
  import org.apache.geronimo.gbean.GEndpointInfo;
  import org.apache.geronimo.gbean.WaitingException;
  import org.apache.geronimo.kernel.KernelMBean;
  import org.apache.geronimo.kernel.config.ConfigurationParent;
  import org.apache.geronimo.kernel.config.NoSuchConfigException;
  import org.apache.geronimo.kernel.deployment.scanner.URLInfo;
  import org.apache.geronimo.kernel.deployment.scanner.URLType;
  
  /**
   *
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/19 06:40:07 $
   *
   * */
  public class ExplicitDeployment implements GBean {
  
      private final static GBeanInfo GBEAN_INFO;
  
      private ConfigurationParent configurationParent;
  
      private URI configID;
  
      private URL packageURL;
  
      private BatchDeployerFactory batchDeployerFactory;
  
      private KernelMBean kernel;
      private ObjectName configName;
  
      public ExplicitDeployment(URI configID, URL packageURL, ConfigurationParent configurationParent, BatchDeployerFactory batchDeployerFactory, KernelMBean kernel) {
          this.configID = configID;
          this.packageURL = packageURL;
          this.configurationParent = configurationParent;
          this.batchDeployerFactory = batchDeployerFactory;
          this.kernel = kernel;
      }
  
      public ConfigurationParent getConfigurationParent() {
          return configurationParent;
      }
  
      public void setConfigurationParent(ConfigurationParent configurationParent) {
          this.configurationParent = configurationParent;
      }
  
      public URI getConfigID() {
          return configID;
      }
  
      public void setConfigID(URI configID) {
          this.configID = configID;
      }
  
      public URL getPackageURL() {
          return packageURL;
      }
  
      public void setPackageURL(URL packageURL) {
          this.packageURL = packageURL;
      }
  
      public BatchDeployerFactory getBatchDeployerFactory() {
          return batchDeployerFactory;
      }
  
      public void setBatchDeployerFactory(BatchDeployerFactory batchDeployerFactory) {
          this.batchDeployerFactory = batchDeployerFactory;
      }
  
      public KernelMBean getKernel() {
          return kernel;
      }
  
      public void doStart() throws WaitingException, Exception {
          File workDir = batchDeployerFactory.createWorkDir();
          BatchDeployer batchDeployer = batchDeployerFactory.getBatchDeployer(configurationParent, configID, workDir);
          batchDeployer.addSource(new URLInfo(packageURL, URLType.getType(packageURL)));
          batchDeployer.deploy();
          configName = kernel.load(batchDeployer.getConfiguration(), workDir.toURL());
          kernel.getMBeanServer().invoke(configName, "startRecursive", null, null);
      }
  
      public void doStop() {
          try {
              kernel.getMBeanServer().invoke(configName,  "stopRecursive", null, null);
          } catch (Exception e) {
              //log.info(e);
          }
          try {
              kernel.unload(configName);
          } catch (NoSuchConfigException e) {
              //log.info(e);
          }
          configName = null;
      }
  
      public void doFail() {
          if (configName != null) {
              doStop();
          }
      }
  
      static {
          GBeanInfoFactory infoFactory = new GBeanInfoFactory(ExplicitDeployment.class.getName());
          infoFactory.addAttribute(new GAttributeInfo("ConfigID", true));
          infoFactory.addAttribute(new GAttributeInfo("PackageURL", true));
          infoFactory.addEndpoint(new GEndpointInfo("ConfigurationParent", ConfigurationParent.class.getName()));
          infoFactory.addEndpoint(new GEndpointInfo("BatchDeployerFactory", BatchDeployerFactory.class.getName()));
          infoFactory.addEndpoint(new GEndpointInfo("Kernel", KernelMBean.class.getName()));
          infoFactory.setConstructor(new GConstructorInfo(
                  new String[] {"ConfigID", "PackageURL", "ConfigurationParent", "BatchDeployerFactory", "Kernel"},
                  new Class[] {URI.class, URL.class, ConfigurationParent.class, BatchDeployerFactory.class, KernelMBean.class}));
          GBEAN_INFO = infoFactory.getBeanInfo();
      }
  
      public static GBeanInfo getGBeanInfo() {
          return GBEAN_INFO;
      }
  
  }
  
  
  
  1.1                  incubator-geronimo/modules/deployment/src/java/org/apache/geronimo/deployment/xml/LocalEntityResolver.java
  
  Index: LocalEntityResolver.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 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 "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" 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",
   *    "Apache Geronimo", 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.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.deployment.xml;
  
  import java.io.BufferedInputStream;
  import java.io.File;
  import java.io.IOException;
  import java.io.InputStream;
  import java.net.MalformedURLException;
  import java.net.URI;
  import java.util.Vector;
  
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
  import org.apache.geronimo.gbean.GAttributeInfo;
  import org.apache.geronimo.gbean.GBeanInfo;
  import org.apache.geronimo.gbean.GBeanInfoFactory;
  import org.apache.geronimo.gbean.GConstructorInfo;
  import org.apache.geronimo.gbean.GOperationInfo;
  import org.apache.xml.resolver.Catalog;
  import org.apache.xml.resolver.CatalogEntry;
  import org.apache.xml.resolver.CatalogException;
  import org.apache.xml.resolver.CatalogManager;
  import org.xml.sax.EntityResolver;
  import org.xml.sax.InputSource;
  import org.xml.sax.SAXException;
  
  /**
   * Implementation of EntityResolver that looks to the local filesystem.
   *
   * The implementation tries to resolve an entity via the following steps:
   *
   * <ul>
   *   <li>using a catalog file</li>
   *   <li>using a local repository</li>
   *   <li>using JAR files in Classpath</li>
   * </ul>
   *
   * The catalog resolving is based on the OASIS XML Catalog Standard.
   * (see http://www.oasis-open.org/committees/entity/spec-2001-08-01.html
   * and http://www.oasis-open.org/html/a401.htm)
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/19 06:40:07 $
   */
  public class LocalEntityResolver implements EntityResolver {
  
      private static final GBeanInfo GBEAN_INFO;
  
      private static final String INTERNAL_CATALOG = "resolver-catalog.xml";
      /**
       * used Logger
       */
      private static final Log log = LogFactory.getLog(LocalEntityResolver.class);
  
      /**
       * The used Catalog Manager
       */
      private final CatalogManager manager = new CatalogManager();
  
      /**
       * the XML Catalog
       */
      private Catalog catalog = null;
  
      /**
       * the URI of the catalog file
       */
      private URI catalogFileURI = null;
  
      /**
       * Local Repository where DTDs and Schemas are located
       */
      private String localRepository = null;
  
      /**
       * Flag indicating if this resolver may return null to signal
       * the parser to open a regular URI connection to the system
       * identifier. Otherwise an exception is thrown.
       */
      private boolean failOnUnresolvable = false;
  
  
      public LocalEntityResolver(URI catalogFileURI, boolean failOnUnresolvable) {
          this(catalogFileURI, INTERNAL_CATALOG, failOnUnresolvable);
      }
  
      public LocalEntityResolver(URI catalogFileURI, String localRepository, boolean failOnUnresolvable) {
          this.catalogFileURI = catalogFileURI;
          setLocalRepository(localRepository);
          setFailOnUnresolvable(failOnUnresolvable);
          //setCatalogFile(catalogFile);
          init();
      }
  
      /**
       * Sets the setFailOnUnresolvable flag.
       *
       * @param b value (true means that a SAXException is thrown
       * if the entity could not be resolved)
       */
      public void setFailOnUnresolvable(final boolean b) {
          failOnUnresolvable = b;
      }
  
      public boolean isFailOnUnresolvable() {
          return failOnUnresolvable;
      }
  
      public void setCatalogFileURI(final URI catalogFileURI) {
          this.catalogFileURI = catalogFileURI;
          /*
          try {
              URL url = new URL(catalogFile);
              this.catalogFileURI = new URI(url.toExternalForm());
          } catch (MalformedURLException e) {
              throw new IllegalArgumentException("could not parse url: " + catalogFile);
          } catch (URISyntaxException e) {
              throw new IllegalArgumentException("could not parse url: " + catalogFile);
          }
          */
          init();
      }
  
      public URI getCatalogFileURI() {
          return this.catalogFileURI;
      }
  
      public String getLocalRepository() {
          return localRepository;
      }
  
      public void setLocalRepository(String string) {
          localRepository = string;
      }
  
      public void addPublicMapping(final String publicId, final String uri) {
  
          Vector args = new Vector();
          args.add(publicId);
          args.add(uri);
  
          addEntry("PUBLIC", args);
  
      }
  
      public void addSystemMapping(final String systemId, final String uri) {
  
          Vector args = new Vector();
          args.add(systemId);
          args.add(uri);
  
          addEntry("SYSTEM", args);
  
      }
  
      /**
       * Attempt to resolve the entity based on the supplied publicId and systemId.
       * First the catalog is queried with both publicId and systemId.
       * Then the local repository is queried with the file name part of the systemId
       * Then the classpath is queried with  the file name part of the systemId.
       *
       * Then, if failOnUnresolvable is true, an exception is thrown: otherwise null is returned.
       * @param publicId
       * @param systemId
       * @return
       * @throws SAXException
       * @throws IOException
       */
      public InputSource resolveEntity(
              final String publicId,
              final String systemId)
              throws SAXException, IOException {
  
          if (log.isTraceEnabled()) {
              log.trace(
                      "start resolving for "
                      + entityMessageString(publicId, systemId));
          }
  
          InputSource source = resolveWithCatalog(publicId, systemId);
          if (source != null) {
              return source;
          }
  
          source = resolveWithRepository(publicId, systemId);
          if (source != null) {
              return source;
          }
  
          source = resolveWithClasspath(publicId, systemId);
          if (source != null) {
              return source;
          }
  
          String message =
                  "could not resolve " + entityMessageString(publicId, systemId);
  
          if (failOnUnresolvable) {
              throw new SAXException(message);
          } else {
              log.debug(message);
          }
  
          return null;
      }
  
      /**
       * Try to resolve using the catalog file
       *
       * @param publicId the PublicId
       * @param systemId the SystemId
       * @return InputSource if the entity could be resolved. null otherwise
       * @throws MalformedURLException
       * @throws IOException
       */
      InputSource resolveWithCatalog(
              final String publicId,
              final String systemId)
              throws MalformedURLException, IOException {
  
          if (catalogFileURI == null) {
              return null;
          }
  
          String resolvedSystemId =
                  catalog.resolvePublic(guaranteeNotNull(publicId), systemId);
  
          if (resolvedSystemId != null) {
              if (log.isTraceEnabled()) {
                  log.trace(
                          "resolved "
                          + entityMessageString(publicId, systemId)
                          + " using the catalog file. result: "
                          + resolvedSystemId);
              }
              return new InputSource(resolvedSystemId);
          }
  
          return null;
      }
  
      /**
       * Try to resolve using the local repository and only the supplied systemID filename.
       * Any path in the systemID will be removed.
       *
       * @param publicId the PublicId
       * @param systemId the SystemId
       * @return InputSource if the entity could be resolved. null otherwise
       */
      InputSource resolveWithRepository(
              final String publicId,
              final String systemId) {
  
          if (localRepository == null) {
              return null;
          }
  
          String fileName = getSystemIdFileName(systemId);
  
          if (fileName == null) {
              return null;
          }
  
          String resolvedSystemId = null;
  
          File file = new File(localRepository, fileName);
          if (file.exists()) {
              resolvedSystemId = file.getAbsolutePath();
              if (log.isTraceEnabled()) {
                  log.trace(
                          "resolved "
                          + entityMessageString(publicId, systemId)
                          + "with file relative to "
                          + localRepository
                          + resolvedSystemId);
              }
              return new InputSource(resolvedSystemId);
          }
          return null;
      }
  
      /**
       * Try to resolve using the the classpath and only the supplied systemID.
       * Any path in the systemID will be removed.
       *
       * @param publicId the PublicId
       * @param systemId the SystemId
       * @return InputSource if the entity could be resolved. null otherwise
       */
      InputSource resolveWithClasspath(
              final String publicId,
              final String systemId) {
  
          String fileName = getSystemIdFileName(systemId);
  
          if (fileName == null) {
              return null;
          }
  
          InputStream in =
                  getClass().getClassLoader().getResourceAsStream(fileName);
          if (in != null) {
              if (log.isTraceEnabled()) {
                  log.trace(
                          "resolved "
                          + entityMessageString(publicId, systemId)
                          + " via file found file on classpath: "
                          + fileName);
              }
              InputSource is = new InputSource(new BufferedInputStream(in));
              is.setSystemId(systemId);
              return is;
          }
  
          return null;
      }
  
      /**
       * Guarantees a not null value
       */
      private String guaranteeNotNull(final String string) {
          return string != null ? string : "";
      }
  
      /**
       * Returns the SystemIds filename
       *
       * @param systemId SystemId
       * @return filename
       */
      private String getSystemIdFileName(final String systemId) {
  
          if (systemId == null) {
              return null;
          }
  
          int indexBackSlash = systemId.lastIndexOf("\\");
          int indexSlash = systemId.lastIndexOf("/");
  
          int index = Math.max(indexBackSlash, indexSlash);
  
          String fileName = systemId.substring(index + 1);
          return fileName;
      }
  
      /**
       * Constructs a debugging message string
       */
      private String entityMessageString(
              final String publicId,
              final String systemId) {
  
          StringBuffer buffer = new StringBuffer("entity with publicId '");
          buffer.append(publicId);
          buffer.append("' and systemId '");
          buffer.append(systemId);
          buffer.append("'");
          return buffer.toString();
  
      }
  
      /**
       * Adds a new Entry to the catalog
       */
      private void addEntry(String type, Vector args) {
          try {
              CatalogEntry entry = new CatalogEntry(type, args);
              catalog.addEntry(entry);
          } catch (CatalogException e) {
              throw new RuntimeException(e);
          }
      }
  
      /**
       * Loads mappings from configuration file
       */
      private void init() {
  
          if (log.isDebugEnabled()) {
              log.debug("init catalog file " + this.catalogFileURI);
          }
  
          manager.setUseStaticCatalog(false);
          manager.setCatalogFiles(this.catalogFileURI.toString());
          manager.setIgnoreMissingProperties(true);
          catalog = manager.getCatalog();
      }
  
      static {
          GBeanInfoFactory infoFactory = new GBeanInfoFactory("configurable local entity resolver", LocalEntityResolver.class.getName());
          infoFactory.addAttribute(new GAttributeInfo("CatalogFileURI", true));
          infoFactory.addAttribute(new GAttributeInfo("LocalRepository", true));
          infoFactory.addAttribute(new GAttributeInfo("FailOnUnresolvable", true));
          infoFactory.addOperation(new GOperationInfo("resolveEntity", new String[]{String.class.getName(), String.class.getName()}));
          infoFactory.addOperation(new GOperationInfo("addPublicMapping", new String[]{String.class.getName(), String.class.getName()}));
          infoFactory.addOperation(new GOperationInfo("addSystemMapping", new String[]{String.class.getName(), String.class.getName()}));
          infoFactory.setConstructor(new GConstructorInfo(new String[]{"CatalogFileURI", "LocalRepository", "FailOnUnresolvable"},
                  new Class[]{URI.class, String.class, Boolean.TYPE}));
          GBEAN_INFO = infoFactory.getBeanInfo();
      }
  
      public static GBeanInfo getGBeanInfo() {
          return GBEAN_INFO;
      }
  
  }
  
  
  
  1.1                  incubator-geronimo/modules/deployment/src/java/org/apache/geronimo/deployment/xml/ParserFactory.java
  
  Index: ParserFactory.java
  ===================================================================
  package org.apache.geronimo.deployment.xml;
  
  import javax.xml.parsers.DocumentBuilder;
  import javax.xml.parsers.ParserConfigurationException;
  
  /**
   *
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/19 06:40:07 $
   *
   * */
  public interface ParserFactory {
      DocumentBuilder getParser()
              throws ParserConfigurationException;
  }
  
  
  
  1.1                  incubator-geronimo/modules/deployment/src/java/org/apache/geronimo/deployment/xml/ParserFactoryImpl.java
  
  Index: ParserFactoryImpl.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 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 "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" 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",
   *    "Apache Geronimo", 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.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  
  package org.apache.geronimo.deployment.xml;
  
  import javax.xml.parsers.DocumentBuilder;
  import javax.xml.parsers.DocumentBuilderFactory;
  import javax.xml.parsers.ParserConfigurationException;
  
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
  import org.apache.geronimo.gbean.GBeanInfo;
  import org.apache.geronimo.gbean.GBeanInfoFactory;
  import org.apache.geronimo.gbean.GOperationInfo;
  import org.apache.geronimo.gbean.GEndpointInfo;
  import org.apache.geronimo.gbean.GConstructorInfo;
  import org.xml.sax.EntityResolver;
  import org.xml.sax.ErrorHandler;
  import org.xml.sax.SAXException;
  import org.xml.sax.SAXParseException;
  
  /**
   *
   *
   * @version $Revision: 1.1 $ $Date: 2004/01/19 06:40:07 $
   *
   * */
  public class ParserFactoryImpl implements ParserFactory {
  
      private static final Log log = LogFactory.getLog(ParserFactoryImpl.class);
  
      private final static GBeanInfo GBEAN_INFO;
  
      private final DocumentBuilderFactory factory;
      private EntityResolver entityResolver;
  
      public ParserFactoryImpl(EntityResolver entityResolver) {
          this.entityResolver = entityResolver;
          factory = DocumentBuilderFactory.newInstance();
          //sets "http://xml.org/sax/features/namespaces"
          factory.setNamespaceAware(true);
          //sets "http://xml.org/sax/features/validation"
          factory.setValidating(true);
          factory.setAttribute(
                  "http://java.sun.com/xml/jaxp/properties/schemaLanguage",
                  "http://www.w3.org/2001/XMLSchema");
          factory.setAttribute("http://apache.org/xml/features/validation/schema",
                  Boolean.TRUE);
      }
  
      public DocumentBuilder getParser()
              throws ParserConfigurationException {
          DocumentBuilder builder = factory.newDocumentBuilder();
          builder.setEntityResolver(entityResolver);
          builder.setErrorHandler(new ErrorHandler() {
              public void error(SAXParseException exception)
                      throws SAXException {
                  log.warn("SAX parse error (ignored)", exception);
                  //throw exception;
              }
  
              public void fatalError(SAXParseException exception)
                      throws SAXException {
                  log.warn("Fatal SAX parse error (ignored)", exception);
                  //throw exception;
              }
  
              public void warning(SAXParseException exception)
                      throws SAXException {
                  log.warn("SAX parse warning", exception);
              }
          });
          return builder;
      }
  
      public EntityResolver getEntityResolver() {
          return entityResolver;
      }
  
      public void setEntityResolver(EntityResolver entityResolver) {
          this.entityResolver = entityResolver;
      }
  
      static {
          GBeanInfoFactory infoFactory = new GBeanInfoFactory("Factory for constructing suitable configured xml parsers", ParserFactoryImpl.class.getName());
          infoFactory.addOperation(new GOperationInfo("getParser"));
          infoFactory.addEndpoint(new GEndpointInfo("EntityResolver", EntityResolver.class.getName()));
          infoFactory.setConstructor(new GConstructorInfo(
                  new String[] {"EntityResolver"},
                  new Class[] {EntityResolver.class}));
          GBEAN_INFO = infoFactory.getBeanInfo();
      }
  
      public static GBeanInfo getGBeanInfo() {
          return GBEAN_INFO;
      }
  }