taylor      2004/02/18 01:14:15

  Modified:    .        .classpath
               cps      maven.xml project.xml
               cps/src/java/org/apache/jetspeed/cps
                        CommonPortletServices.java
  Added:       cps/src/java/META-INF js-components.properties
               cps/src/java/org/apache/jetspeed/components
                        ComponentManagement.java ComponentManager.java
                        ContainerManagement.java InterceptorAdapter.java
                        InterceptorAdapterFactory.java
               cps/src/test/org/apache/jetspeed/components
                        TestComponentManager.java
               cps/test/WEB-INF/conf components.properties components.xml
  Log:
  Start of Component Manager based upon Pico Container.
  
  Revision  Changes    Path
  1.17      +1 -1      jakarta-jetspeed-2/.classpath
  
  Index: .classpath
  ===================================================================
  RCS file: /home/cvs/jakarta-jetspeed-2/.classpath,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- .classpath        17 Feb 2004 18:35:00 -0000      1.16
  +++ .classpath        18 Feb 2004 09:14:14 -0000      1.17
  @@ -19,7 +19,6 @@
       <classpathentry exported="true" kind="var" 
path="MAVEN_REPO/commons-betwixt/jars/commons-betwixt-1.0-beta-1.jar"/>
       <classpathentry exported="true" kind="var" 
path="MAVEN_REPO/commons-beanutils/jars/commons-beanutils-1.6.jar"/>
       <classpathentry exported="true" kind="var" 
path="MAVEN_REPO/castor/jars/castor-0.9.4.3.jar"/>
  -    <classpathentry exported="true" kind="var" 
path="MAVEN_REPO/commons-configuration/jars/commons-configuration-1.0-dev.jar"/>
       <classpathentry exported="true" kind="var" 
path="MAVEN_REPO/commons-digester/jars/commons-digester-1.3.jar"/>
       <classpathentry exported="true" kind="var" 
path="MAVEN_REPO/commons-io/jars/commons-io-0.1.jar"/>
       <classpathentry exported="true" kind="var" 
path="MAVEN_REPO/commons-lang/jars/commons-lang-1.0.1.jar"/>
  @@ -47,5 +46,6 @@
       <classpathentry kind="var" 
path="MAVEN_REPO/velocity-tools/jars/velocity-tools-view-1.1-beta1.jar"/>
       <classpathentry kind="var" 
path="MAVEN_REPO/picocontainer/jars/picocontainer-1.0-beta-5-SNAPSHOT.jar"/>
       <classpathentry kind="var" 
path="MAVEN_REPO/commons-dbcp/jars/commons-dbcp-1.1.jar"/>
  +    <classpathentry kind="var" 
path="MAVEN_REPO/commons-configuration/jars/commons-configuration-SNAPSHOT.jar"/>
       <classpathentry kind="output" path="bin"/>
   </classpath>
  
  
  
  1.7       +12 -1     jakarta-jetspeed-2/cps/maven.xml
  
  Index: maven.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-jetspeed-2/cps/maven.xml,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- maven.xml 17 Feb 2004 04:02:39 -0000      1.6
  +++ maven.xml 18 Feb 2004 09:14:14 -0000      1.7
  @@ -4,12 +4,23 @@
            xmlns:reactor="reactor">
   
     <!-- Target of maven test:single test -->
  -  <property name='testcase' value='org.apache.jetspeed.cps.components.TestHSQL'/> 
  +  <property name='testcase' 
value='org.apache.jetspeed.components.TestComponentManager'/> 
     
      <goal name="deployJar">
        <attainGoal name="jar:install"/>
   
        <copy file="${basedir}/target/${maven.final.name}.jar" 
todir="${deploy.war.dir}/jetspeed/WEB-INF/lib"/>
     </goal>
  +
  +  <!-- ================================================================ -->
  +  <!-- Set System properties for junit                                  -->
  +  <!-- ================================================================ -->
  +  <preGoal name="test:single">
  +      <copy  file="./src/java/META-INF/js-components.properties" 
tofile="./target/classes/META-INF/js-components.properties"/>    
  +  </preGoal>
  + 
  +  <preGoal name="test:test">
  +      <copy  file="./src/java/META-INF/js-components.properties" 
tofile="./target/classes/META-INF/js-components.properties"/>    
  +  </preGoal>
   
   </project>
  
  
  
  1.11      +8 -1      jakarta-jetspeed-2/cps/project.xml
  
  Index: project.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-jetspeed-2/cps/project.xml,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- project.xml       17 Feb 2004 04:02:39 -0000      1.10
  +++ project.xml       18 Feb 2004 09:14:14 -0000      1.11
  @@ -64,7 +64,14 @@
       </dependency>   
       <dependency>
         <id>commons-configuration</id>
  -      <version>1.0-dev</version>
  +      <version>SNAPSHOT</version>
  +      <properties>
  +        <war.bundle.jar>true</war.bundle.jar>
  +      </properties>
  +    </dependency>
  +    <dependency>
  +      <id>dom4j</id>
  +      <version>1.4</version>
         <properties>
           <war.bundle.jar>true</war.bundle.jar>
         </properties>
  
  
  
  1.1                  
jakarta-jetspeed-2/cps/src/java/META-INF/js-components.properties
  
  Index: js-components.properties
  ===================================================================
  components = locator, locator2
  
  locator.classname = org.apache.jetspeed.cps.template.TemplateLocatorComponentImpl
  # locator.adapter = not defined
  
  locator2.classname = org.apache.jetspeed.cps.template.TemplateLocatorComponentImpl
  locator2.container = persistence
  
  locator.roots = WEB-INF/templates
  locator.templatelocator.classname = 
org.apache.jetspeed.cps.template.TemplateLocatorImpl
  locator.template.class = org.apache.jetspeed.cps.template.TemplateImpl
  locator.default.type = layout
  locator.default.template.name = columns.vm
  locator.default.extension = vm
  
  locator2.roots = WEB-INF/templates
  locator2.templatelocator.classname = 
org.apache.jetspeed.cps.template.TemplateLocatorImpl
  locator2.template.class = org.apache.jetspeed.cps.template.TemplateImpl
  locator2.default.type = layout
  locator2.default.template.name = columns.vm
  locator2.default.extension = vm
  
  
  
  1.1                  
jakarta-jetspeed-2/cps/src/java/org/apache/jetspeed/components/ComponentManagement.java
  
  Index: ComponentManagement.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2000-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 Jetspeed" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Jetspeed", 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.jetspeed.components;
  
  /**
   * ComponentManagement
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">David Sean Taylor</a>
   * @version $Id: ComponentManagement.java,v 1.1 2004/02/18 09:14:14 taylor Exp $
   */
  public interface ComponentManagement
  {
      Object getComponent(String componentName);
      
      Object getComponent(String containerName, String componentName);
      
      // I am thinking that there should be categories and discovery of components
      // Try to find the best component given params "database, psml"
      // Object getComponent(UniveralDescription description);
  }
  
  
  
  1.1                  
jakarta-jetspeed-2/cps/src/java/org/apache/jetspeed/components/ComponentManager.java
  
  Index: ComponentManager.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2000-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 Jetspeed" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Jetspeed", 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.jetspeed.components;
  
  import java.io.IOException;
  import java.net.URL;
  import java.util.Collection;
  import java.util.Enumeration;
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.Map;
  import java.util.Properties;
  
  import org.apache.commons.configuration.Configuration;
  import org.apache.commons.configuration.PropertiesConfiguration;
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
  import org.picocontainer.MutablePicoContainer;
  import org.picocontainer.Parameter;
  import org.picocontainer.Startable;
  import org.picocontainer.defaults.ComponentAdapterFactory;
  import org.picocontainer.defaults.ConstantParameter;
  import org.picocontainer.defaults.DefaultPicoContainer;
  
  /**
   * ComponentManager manages Jetspeed components.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">David Sean Taylor</a>
   * @version $Id: ComponentManager.java,v 1.1 2004/02/18 09:14:14 taylor Exp $
   */
  public class ComponentManager implements Startable, ContainerManagement, 
ComponentManagement
  {
      private static final Log log = LogFactory.getLog(ComponentManager.class);
  
      private Configuration config = null;
      private Map containers = new HashMap();
      private MutablePicoContainer defaultContainer = null;
      
      private ComponentManager()
      {       
          // requires a components configuration     
      }
      
      public ComponentManager(Configuration config)
      {
          this.config = config;
      }
      
      public void start()
      {
          createContainers();
          loadComponents();
  
          // start containers
          // with container hierachies, will starting the root container start its 
children?                
          // defaultContainer.start();
          Iterator all = containers.values().iterator();
          while (all.hasNext())
          {
              MutablePicoContainer container = (MutablePicoContainer)all.next();
              container.start();
          }
      }
      
      public void stop()
      {
      }
  
      public Object getComponent(String componentName)
      {
          // TODO: might be better to use a container hierarchy, with parent 
containers    
          return this.defaultContainer.getComponentInstance(componentName);
      }
      
      public Object getComponent(String containerName, String componentName)
      {
          Object component = null;
          MutablePicoContainer container = getContainer(containerName);
          if (container != null)
          {
              component = container.getComponentInstance(componentName);
          }
          return component;
      }
  
      public MutablePicoContainer getContainer(String containerName)
      {
          return (MutablePicoContainer)this.containers.get(containerName);
      }
      
      public MutablePicoContainer getDefaultContainer()
      {
          return this.defaultContainer;
      }
      
      public Collection getContainers()
      {
          return this.containers.values();
      }
  
          
      private void loadComponents()
      {
          ClassLoader classLoader = Thread.currentThread().getContextClassLoader() ;
          Enumeration resources = null;   
          try
          { 
              resources = 
classLoader.getResources("META-INF/js-components.properties") ;
          }
          catch (IOException e)
          {
              log.error("failed to load js components", e);
              return;
          }
          
          while(resources.hasMoreElements()) 
          {
              URL url = (URL)resources.nextElement();
              System.out.println("Loading URL " + url);                    
              this.loadComponent(url);
          }        
      }
  
      private void createContainers()
      {
          // for now this is kinda hard-coded to the simple properties file format
          String defaultContainer = config.getString("default.container"); 
          String [] containerNames = config.getStringArray("containers");
          MutablePicoContainer container = null;            
          
          for (int ix = 0; ix < containerNames.length; ix++)
          {
              String className = config.getString("container." + containerNames[ix] + 
".classname");
              String adapter = config.getString("container." + containerNames[ix] + 
".adapter");
              try
              {            
                  Class containerClass = Class.forName(className);
                  container = (MutablePicoContainer)containerClass.newInstance();
                  if (containerNames.equals(defaultContainer))
                  {
                      this.defaultContainer = container;
                  }
                  containers.put(containerNames[ix], container);
                  System.out.println("Created container for container " + 
containerNames[ix] + " and class  " + className);
              }
              catch (Exception e)
              {
                  log.error("failed to create container  " + containerNames[ix] + " 
and class " + className, e);
              }            
          }
          if (this.defaultContainer == null)
          {
              if (container != null)
              {
                  this.defaultContainer = container;
              }
              else
              {
                  this.defaultContainer = new DefaultPicoContainer();
                  containers.put("default", this.defaultContainer);
              }
          }            
      }
      
      private void loadComponent(URL url)
      {        
          PropertiesConfiguration configuration = new PropertiesConfiguration();
          configuration.setFileName(url.getFile().toString());
          try
          {                 
              System.out.println("loading configuration: " + configuration);
              configuration.load();
          }
          catch (IOException e)
          {
              log.error("Failed to load js component configuration for " + url, e);
              return;
          }
          
          String [] componentNames = configuration.getStringArray("components");
          
          for (int ix = 0; ix < componentNames.length; ix++)
          {
              System.out.println("loading component: [" + componentNames[ix] + "]");
              
              String className = configuration.getString(componentNames[ix] + 
".classname");
              String containerName = configuration.getString(componentNames[ix] + 
".container");
              // String adapter = config.getString("container." + componentNames[ix] + 
".adapter");
              try
              {            
                  Configuration componentConfig = 
configuration.subset(componentNames[ix]);
                  // debugConfig(componentConfig);
                  Class componentClass = Class.forName(className);
                  Parameter [] parameters =  {new ConstantParameter(componentConfig)};
                  
                  MutablePicoContainer container = this.getContainer(containerName);
                  if (null == container)
                  {
                      container = this.defaultContainer;                  
                  }
                  
                  container.registerComponentImplementation(componentNames[ix], 
componentClass, parameters);
                  
                  System.out.println("Created component " + componentNames[ix] + " and 
class  " + className);
              }
              catch (Exception e)
              {
                  log.error("failed to create component " + componentNames[ix] + " and 
class " + className, e);
              }            
          }
      }
      
      private void debugConfig(Configuration config)
      {
          Iterator it = config.getKeys();
          while (it.hasNext())
          {
              String key = (String)it.next();
              System.out.println("key = " + key + ", value = " + 
config.getProperty(key));
          }
          System.out.println("*** roots = " + config.getString("roots"));        
      }
  }
  
  
  
  1.1                  
jakarta-jetspeed-2/cps/src/java/org/apache/jetspeed/components/ContainerManagement.java
  
  Index: ContainerManagement.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2000-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 Jetspeed" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Jetspeed", 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.jetspeed.components;
  
  import java.util.Collection;
  
  import org.picocontainer.MutablePicoContainer;
  
  /**
   * ContainerManagement
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">David Sean Taylor</a>
   * @version $Id: ContainerManagement.java,v 1.1 2004/02/18 09:14:14 taylor Exp $
   */
  public interface ContainerManagement
  {
      // TODO: GENERAL: build in hierachies (parents) of containers
      
      // TODO: RESOLVE: NanoContainer doesn't share the same base class or any common 
interfaces with PicoContainer
      MutablePicoContainer getContainer(String containerName);
      
      MutablePicoContainer getDefaultContainer();
      
      Collection getContainers();
      
      // void addContainer(String containerName, MutablePicoContainer container);
      
      // void removeContainer(String containerName);
      
  }
  
  
  
  1.1                  
jakarta-jetspeed-2/cps/src/java/org/apache/jetspeed/components/InterceptorAdapter.java
  
  Index: InterceptorAdapter.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2000-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 Jetspeed" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Jetspeed", 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.jetspeed.components;
  
  import org.picocontainer.ComponentAdapter;
  import org.picocontainer.PicoInitializationException;
  import org.picocontainer.PicoIntrospectionException;
  import org.picocontainer.defaults.AssignabilityRegistrationException;
  import org.picocontainer.defaults.DecoratingComponentAdapterFactory;
  import org.picocontainer.defaults.ImplementationHidingComponentAdapter;
  import org.picocontainer.defaults.InterfaceFinder;
  import org.picocontainer.defaults.NotConcreteRegistrationException;
  import org.picocontainer.defaults.Swappable;
  
  import java.lang.reflect.InvocationHandler;
  import java.lang.reflect.Method;
  import java.lang.reflect.Proxy;
  
  /**
   * InterceptorAdaptor
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">David Sean Taylor</a>
   * @version $Id: InterceptorAdapter.java,v 1.1 2004/02/18 09:14:14 taylor Exp $
   */
  public class InterceptorAdapter extends ImplementationHidingComponentAdapter // 
DecoratingComponentAdapterFactory
  {
      public InterceptorAdapter(ComponentAdapter delegate)
      {
          super(delegate);
      }
      private final InterfaceFinder interfaceFinder = new InterfaceFinder();
      public Object getComponentInstance()
          throws
              PicoInitializationException,
              PicoIntrospectionException,
              AssignabilityRegistrationException,
              NotConcreteRegistrationException
      {
          Class[] interfaces;
          if (getDelegate().getComponentKey() instanceof Class
              && ((Class) getDelegate().getComponentKey()).isInterface())
          {
              // If the compo
              interfaces = new Class[] {(Class) getDelegate().getComponentKey()};
          }
          else
          {
              interfaces =
                  interfaceFinder.getInterfaces(
                      getDelegate().getComponentImplementation());
          }
          Class[] swappableAugmentedInterfaces = new Class[interfaces.length + 1];
          swappableAugmentedInterfaces[interfaces.length] = Swappable.class;
          System.arraycopy(
              interfaces,
              0,
              swappableAugmentedInterfaces,
              0,
              interfaces.length);
          if (interfaces.length == 0)
          {
              throw new PicoIntrospectionException(
                  "Can't hide implementation for "
                      + getDelegate().getComponentImplementation().getName()
                      + ". It doesn't implement any interfaces.");
          }
          final DelegatingInvocationHandler delegatingInvocationHandler =
              new DelegatingInvocationHandler(this);
          return Proxy.newProxyInstance(
              getClass().getClassLoader(),
              swappableAugmentedInterfaces,
              delegatingInvocationHandler);
      }
      private Object getDelegatedComponentInstance()
      {
          return super.getComponentInstance();
      }
      private class DelegatingInvocationHandler
          implements InvocationHandler, Swappable
      {
          private final InterceptorAdapter adapter;
          private Object delegatedInstance;
          public DelegatingInvocationHandler(InterceptorAdapter adapter)
          {
              this.adapter = adapter;
          }
          public Object invoke(Object proxy, Method method, Object[] args)
              throws Throwable
          {
              System.out.println("Invoking method: " + method);
              Class declaringClass = method.getDeclaringClass();
              if (declaringClass.equals(Object.class))
              {
                  if (method.equals(InterfaceFinder.hashCode))
                  {
                      // Return the hashCode of ourself, as Proxy.newProxyInstance() 
may
                      // return cached proxies. We want a unique hashCode for each 
created proxy!
                      return new Integer(
                          System.identityHashCode(
                              DelegatingInvocationHandler.this));
                  }
                  if (method.equals(InterfaceFinder.equals))
                  {
                      return new Boolean(proxy == args[0]);
                  }
                  // If it's any other method defined by Object, call on ourself.
                  return method.invoke(DelegatingInvocationHandler.this, args);
              }
              else
                  if (declaringClass.equals(Swappable.class))
                  {
                      return method.invoke(this, args);
                  }
                  else
                  {
                      if (delegatedInstance == null)
                      {
                          delegatedInstance = adapter.getDelegatedComponentInstance();
                      }
                      return method.invoke(delegatedInstance, args);
                  }
          }
          public Object __hotSwap(Object newSubject)
          {
              Object result = delegatedInstance;
              delegatedInstance = newSubject;
              return result;
          }
      }
  }
  
  
  
  1.1                  
jakarta-jetspeed-2/cps/src/java/org/apache/jetspeed/components/InterceptorAdapterFactory.java
  
  Index: InterceptorAdapterFactory.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2000-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 Jetspeed" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Jetspeed", 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.jetspeed.components;
  
  import org.picocontainer.defaults.DecoratingComponentAdapterFactory;
  import org.picocontainer.defaults.DefaultComponentAdapterFactory;
  import org.picocontainer.ComponentAdapter;
  import org.picocontainer.Parameter;
  import org.picocontainer.PicoIntrospectionException;
  import org.picocontainer.defaults.*;
  
  /**
   * InterceptorAdapterFactory
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">David Sean Taylor</a>
   * @version $Id: InterceptorAdapterFactory.java,v 1.1 2004/02/18 09:14:14 taylor Exp 
$
   */
  public class InterceptorAdapterFactory
      extends DecoratingComponentAdapterFactory
  {
      public InterceptorAdapterFactory() {
          this(new DefaultComponentAdapterFactory());
      }
  
      public InterceptorAdapterFactory(ComponentAdapterFactory delegate) {
          super(delegate);
      }
  
      public ComponentAdapter createComponentAdapter(Object componentKey,
                                                     Class componentImplementation,
                                                     Parameter[] parameters)
              throws PicoIntrospectionException, AssignabilityRegistrationException, 
NotConcreteRegistrationException {
          return new InterceptorAdapter(super.createComponentAdapter(componentKey, 
componentImplementation, parameters));
      }
      
  }
  
  
  
  1.6       +1 -25     
jakarta-jetspeed-2/cps/src/java/org/apache/jetspeed/cps/CommonPortletServices.java
  
  Index: CommonPortletServices.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jetspeed-2/cps/src/java/org/apache/jetspeed/cps/CommonPortletServices.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- CommonPortletServices.java        13 Feb 2004 03:48:27 -0000      1.5
  +++ CommonPortletServices.java        18 Feb 2004 09:14:14 -0000      1.6
  @@ -53,16 +53,8 @@
    */
   package org.apache.jetspeed.cps;
   
  -import java.util.Enumeration;
  -import java.util.Hashtable;
   import java.util.Properties;
   import java.io.FileInputStream;
  -import java.io.IOException;
  -import java.net.URL;
  -
  -import javax.naming.Context;
  -import javax.naming.InitialContext;
  -import javax.naming.NamingException;
   
   import org.apache.commons.logging.Log;
   import org.apache.commons.logging.LogFactory;
  @@ -235,20 +227,4 @@
           return initialized;
       }
       
  -    /**
  -     * Load all CPS component descriptors from the class path
  -     * 
  -     * @throws IOException
  -     */
  -    public static void loadServiceDescriptors()
  -    throws IOException
  -    {
  -        ClassLoader cl = Thread.currentThread().getContextClassLoader() ;    
  -        Enumeration e = cl.getResources("META-INF/component.properties") ;
  -        while(e.hasMoreElements()) 
  -        {
  -            URL url = (URL)e.nextElement();                    
  -            System.out.println("url = " + url);
  -        }        
  -    }
   }
  
  
  
  1.1                  
jakarta-jetspeed-2/cps/src/test/org/apache/jetspeed/components/TestComponentManager.java
  
  Index: TestComponentManager.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2000-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 Jetspeed" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Jetspeed", 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.jetspeed.components;
  
  import java.io.File;
  import java.util.Iterator;
  
  import junit.framework.Test;
  import junit.framework.TestCase;
  import junit.framework.TestSuite;
  
  import org.apache.commons.configuration.Configuration;
  import org.apache.commons.configuration.PropertiesConfiguration;
  import org.apache.commons.configuration.DOM4JConfiguration;
  import org.apache.jetspeed.cps.template.TemplateLocatorComponent;
  import org.picocontainer.MutablePicoContainer;
  import org.picocontainer.defaults.CachingComponentAdapter;
  import org.picocontainer.defaults.CachingComponentAdapterFactory;
  import org.picocontainer.defaults.ComponentAdapterFactory;
  import org.picocontainer.defaults.DefaultComponentAdapterFactory;
  import org.picocontainer.defaults.DefaultPicoContainer;
  
  /**
   * TestComponentManager
   *
   * @author <a href="mailto:[EMAIL PROTECTED]">David Sean Taylor</a>
   * @version $Id: TestComponentManager.java,v 1.1 2004/02/18 09:14:14 taylor Exp $
   */
  public class TestComponentManager extends TestCase
  {
      public TestComponentManager(String name) 
      {
          super( name );
      }
  
      /**
       * Start the tests.
       *
       * @param args the arguments. Not used
       */
      public static void main(String args[]) 
      {
          junit.awtui.TestRunner.main( new String[] { 
TestComponentManager.class.getName() } );
      }
  
      public void setup() 
      {
          System.out.println("Setup: Testing Email");
      }
  
      public static Test suite()
      {
          // All methods starting with "test" will be executed in the test suite.
          return new TestSuite(TestComponentManager.class);
      }
      
      public void testManager()
            throws Exception
      {
          Configuration config = getConfiguration();
          ComponentManager cm = new ComponentManager(config);
          
          cm.start();
          
          int count = 0;   
          Iterator containers = cm.getContainers().iterator();
          while (containers.hasNext())
          {
              MutablePicoContainer container = (MutablePicoContainer)containers.next();
              System.out.println("container = " + container);
              count++;                                        
          }
          assertTrue("count = 2 " + count, count == 2);
  
          MutablePicoContainer container = cm.getContainer("default");
          assertNotNull("default container is null", container);
          
          container = cm.getContainer("persistence");
          assertNotNull("persistence container is null", container);
          
          TemplateLocatorComponent locator1 = 
(TemplateLocatorComponent)cm.getComponent("locator");
          assertNotNull("locator1 is null", locator1);
          
          TemplateLocatorComponent locator2 = 
(TemplateLocatorComponent)cm.getComponent("persistence", "locator2");
          assertNotNull("locator2 is null", locator2);
  
          cm.stop();                
                  
          System.out.println("Component Manager Test completed");                      
         
      }
  
      public Configuration getConfiguration()
      throws Exception
      {        
          String filename = getConfigurationFile();
          // DOM4JConfiguration configuration = new DOM4JConfiguration();
          PropertiesConfiguration configuration = new PropertiesConfiguration();       
          
          configuration.setFileName(filename);
          configuration.load();
          
          return configuration;
      }
      
      public String getConfigurationFile()
      {
          // return getApplicationRoot() + "/WEB-INF/conf/components.xml";
          return getApplicationRoot() + "/WEB-INF/conf/components.properties";
      }
  
          public String getApplicationRoot()
      {
          String applicationRoot = "test";
          File testPath = new File(applicationRoot);
          if (!testPath.exists())
          {
              testPath = new File( "cps" + File.separator + applicationRoot);
              if (testPath.exists())
              {
                  applicationRoot = testPath.getAbsolutePath();
              }
          }
          return applicationRoot;
      }
  
      public void testInterceptorAdapter()
          throws Exception
      {
          InterceptorAdapterFactory adapterFactory 
                      = new InterceptorAdapterFactory(new 
DefaultComponentAdapterFactory());
          CachingComponentAdapterFactory cachingComponentAdapterFactory  
                      = new CachingComponentAdapterFactory(adapterFactory);
          ComponentAdapterFactory caf = cachingComponentAdapterFactory;
          DefaultPicoContainer pico = new DefaultPicoContainer(caf);
  
          CachingComponentAdapter dumbAdapter = (CachingComponentAdapter) 
caf.createComponentAdapter("dumb", DumbImpl.class, null);
          
          pico.registerComponent(dumbAdapter);
  
          Dumb dumb = (Dumb) dumbAdapter.getComponentInstance();
          System.out.println("dumb = " + dumb);
          dumb.test();
          Dumb dumb2 = (Dumb) dumbAdapter.getComponentInstance();
          System.out.println("dumb2 = " + dumb2);
                      
      }
      
      public static interface Dumb 
      {
          void test();
      }
      
      public static class DumbImpl implements Dumb
      {
          public DumbImpl()
          {
              System.out.println("Constructing Dumb");
          }
          
          public void test()
          {
              System.out.println("calling test");
          }
      }
      
      
  }
  
  
  
  1.1                  jakarta-jetspeed-2/cps/test/WEB-INF/conf/components.properties
  
  Index: components.properties
  ===================================================================
  # this should be implemented in XML
  containers = default, persistence
  default.container = default
  
  container.default.classname = org.picocontainer.defaults.DefaultPicoContainer
  container.default.adapter = unknown
  container.persistence.classname = org.picocontainer.defaults.DefaultPicoContainer
  container.persistence.adapter = unknown
  
  
  
  1.1                  jakarta-jetspeed-2/cps/test/WEB-INF/conf/components.xml
  
  Index: components.xml
  ===================================================================
  <config>
  <version>2.0</version>
  <container>
      <name>default</name>
      <class>org.picocontainer.defaults.DefaultPicoContainer</class>
      <type>pico</type>
      <default>true</default>
      <component>
          <name>template-locator</name>
          <class>org.apache.jetspeed.cps.template.TemplateLocatorComponentImpl</class>
      </component>
      <component>
          <name>template-locator2</name>
          <class>org.apache.jetspeed.cps.template.TemplateLocatorComponentImpl</class>
      </component>
  </container>
  <container>
      <name>persistence</name>
      <class>org.picocontainer.defaults.DefaultPicoContainer</class>
      <type>pico</type>
      <default>true</default>
      <component>
          <name>whatever</name>
          <class>org.apache.jetspeed.cps.template.TemplateLocatorComponentImpl</class>
      </component>
  </container>
  
  </config>
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to