[exo-jcr-commits] exo-jcr SVN: r2364 - in kernel/trunk/exo.kernel.container/src: main/java/org/exoplatform/container/jmx and 7 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Wed May 12 04:54:04 EDT 2010


Author: nfilotto
Date: 2010-05-12 04:54:02 -0400 (Wed, 12 May 2010)
New Revision: 2364

Modified:
   kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ConcurrentPicoContainer.java
   kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ExoContainer.java
   kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/PortalContainer.java
   kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/RootContainer.java
   kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/StandaloneContainer.java
   kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/MX4JComponentAdapter.java
   kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/util/ContainerUtil.java
   kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/Component.java
   kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/ComponentPlugin.java
   kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/Configuration.java
   kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/ContainerLifecyclePlugin.java
   kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/ExternalComponentPlugins.java
   kernel/trunk/exo.kernel.container/src/main/resources/org/exoplatform/container/configuration/kernel-configuration_1_2.xsd
   kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/TestExoContainer.java
   kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/xml/test/TestConfigurationXML.java
   kernel/trunk/exo.kernel.container/src/test/resources/conf/test-configuration.xml
   kernel/trunk/exo.kernel.container/src/test/resources/org/exoplatform/container/test-exo-container.xml
Log:
EXOJCR-718:
1. For this feature, it was required to review the sorts of plugins, now the ComponentPlugin and ContainerLifecyclePlugin are comparable and the sort is done by the class that owns the plugins (i.e. Component and ExternalComponentPlugins for the ComponentPlugin and Configuration for the ContainerLifecyclePlugin)
2. The unit tests that check that the plugins are properly sorted, have been reviewed since they passed even without sorting them
3. The field priority is now defined as an integer in the classes ComponentPlugin and ContainerLifecyclePlugin, and into the version 1.2 of the xsd
4. In ConcurrentPicoContainer, no IlleagalStateException are thrown when we try to start, stop or dispose the container in an invalid state, now it is silently ignored
5. The method getConfigurationXML has been added to the Standalone, Root and Portal containers. This method is exposed through JMX at the container level.
6. The object configuration is now cloneable and the methods toXML and merge have been added.

Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ConcurrentPicoContainer.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ConcurrentPicoContainer.java	2010-05-12 06:50:23 UTC (rev 2363)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ConcurrentPicoContainer.java	2010-05-12 08:54:02 UTC (rev 2364)
@@ -448,10 +448,8 @@
     */
    public void start()
    {
-      if (disposed.get())
-         throw new IllegalStateException("Already disposed");
-      if (started.get())
-         throw new IllegalStateException("Already started");
+      if (disposed.get() || started.get())
+         return;
       LifecycleVisitor.start(this);
       started.set(true);
    }
@@ -465,10 +463,8 @@
     */
    public void stop()
    {
-      if (disposed.get())
-         throw new IllegalStateException("Already disposed");
-      if (!started.get())
-         throw new IllegalStateException("Not started");
+      if (disposed.get() || !started.get())
+         return;
       LifecycleVisitor.stop(this);
       started.set(false);
    }
@@ -483,7 +479,7 @@
    public void dispose()
    {
       if (disposed.get())
-         throw new IllegalStateException("Already disposed");
+         return;
       LifecycleVisitor.dispose(this);
       disposed.set(true);
    }

Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ExoContainer.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ExoContainer.java	2010-05-12 06:50:23 UTC (rev 2363)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/ExoContainer.java	2010-05-12 08:54:02 UTC (rev 2364)
@@ -23,6 +23,7 @@
 import org.exoplatform.container.configuration.ConfigurationManager;
 import org.exoplatform.container.management.ManageableContainer;
 import org.exoplatform.container.util.ContainerUtil;
+import org.exoplatform.container.xml.Configuration;
 import org.exoplatform.container.xml.InitParams;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
@@ -321,4 +322,14 @@
       }
       throw new Exception("Cannot find a satisfying constructor for " + clazz + " with parameter " + unknownParameter);
    }
+   
+   /**
+    * Gets the {@link ConfigurationManager} from the given {@link ExoContainer} if it exists, 
+    * then returns the nested {@link Configuration} otherwise it returns <code>null</code>
+    */
+   protected Configuration getConfiguration()
+   {
+      ConfigurationManager cm = (ConfigurationManager)getComponentInstanceOfType(ConfigurationManager.class);
+      return cm == null ? null : cm.getConfiguration();
+   }
 }

Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/PortalContainer.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/PortalContainer.java	2010-05-12 06:50:23 UTC (rev 2363)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/PortalContainer.java	2010-05-12 08:54:02 UTC (rev 2364)
@@ -21,6 +21,7 @@
 import org.exoplatform.container.RootContainer.PortalContainerInitTask;
 import org.exoplatform.container.definition.PortalContainerConfig;
 import org.exoplatform.container.jmx.MX4JComponentAdapterFactory;
+import org.exoplatform.container.xml.Configuration;
 import org.exoplatform.container.xml.PortalContainerInfo;
 import org.exoplatform.management.annotations.Managed;
 import org.exoplatform.management.annotations.ManagedDescription;
@@ -50,6 +51,11 @@
 {
 
    /**
+    * Serial Version UID
+    */
+   private static final long serialVersionUID = -9110532469581690803L;
+
+   /**
     * The default name of the portal container
     */
    public static final String DEFAULT_PORTAL_CONTAINER_NAME;
@@ -271,6 +277,25 @@
       return name;
    }
 
+   @Managed
+   @ManagedDescription("The configuration of the container in XML format.")
+   public String getConfigurationXML()
+   {
+      Configuration conf = getConfiguration();
+      if (conf == null)
+      {
+         log.warn("The configuration of the PortalContainer could not be found");
+         return null;
+      }
+      Configuration result = Configuration.merge(((ExoContainer)parent).getConfiguration(), conf);
+      if (result == null)
+      {
+         log.warn("The configurations could not be merged");
+         return null;         
+      }
+      return result.toXML();
+   }
+   
    public SessionContainer createSessionContainer(String id, String owner)
    {
       SessionContainer scontainer = getSessionManager().getSessionContainer(id);

Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/RootContainer.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/RootContainer.java	2010-05-12 06:50:23 UTC (rev 2363)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/RootContainer.java	2010-05-12 08:54:02 UTC (rev 2364)
@@ -26,7 +26,9 @@
 import org.exoplatform.container.monitor.jvm.J2EEServerInfo;
 import org.exoplatform.container.monitor.jvm.OperatingSystemInfo;
 import org.exoplatform.container.util.ContainerUtil;
+import org.exoplatform.container.xml.Configuration;
 import org.exoplatform.management.annotations.Managed;
+import org.exoplatform.management.annotations.ManagedDescription;
 import org.exoplatform.management.jmx.annotations.NamingContext;
 import org.exoplatform.management.jmx.annotations.Property;
 import org.exoplatform.services.log.ExoLogger;
@@ -56,6 +58,11 @@
 public class RootContainer extends ExoContainer
 {
 
+   /**
+    * Serial Version UID
+    */
+   private static final long serialVersionUID = 812448359436635438L;
+
    /** The field is volatile to properly implement the double checked locking pattern. */
    private static volatile RootContainer singleton_;
 
@@ -101,7 +108,7 @@
 
       //
       Runtime.getRuntime().addShutdownHook(new ShutdownThread(this));
-      this.profiles= profiles;
+      this.profiles = profiles;
       this.registerComponentInstance(J2EEServerInfo.class, serverenv_);
    }
 
@@ -461,6 +468,19 @@
       singleton_ = rcontainer;
    }
 
+   @Managed
+   @ManagedDescription("The configuration of the container in XML format.")
+   public String getConfigurationXML()
+   {
+      Configuration config = getConfiguration();
+      if (config == null)
+      {
+         log.warn("The configuration of the RootContainer could not be found");
+         return null;
+      }
+      return config.toXML();
+   }
+
    /**
     * Calls the other method <code>addInitTask</code> with <code>ServletContext.getServletContextName()</code>
     * as portal container name

Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/StandaloneContainer.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/StandaloneContainer.java	2010-05-12 06:50:23 UTC (rev 2363)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/StandaloneContainer.java	2010-05-12 08:54:02 UTC (rev 2364)
@@ -18,20 +18,22 @@
  */
 package org.exoplatform.container;
 
-import org.exoplatform.commons.utils.PropertyManager;
 import org.exoplatform.container.configuration.ConfigurationException;
 import org.exoplatform.container.configuration.ConfigurationManager;
 import org.exoplatform.container.configuration.ConfigurationManagerImpl;
 import org.exoplatform.container.jmx.MX4JComponentAdapterFactory;
 import org.exoplatform.container.monitor.jvm.J2EEServerInfo;
 import org.exoplatform.container.util.ContainerUtil;
+import org.exoplatform.container.xml.Configuration;
+import org.exoplatform.management.annotations.Managed;
+import org.exoplatform.management.annotations.ManagedDescription;
+import org.exoplatform.management.jmx.annotations.NamingContext;
+import org.exoplatform.management.jmx.annotations.Property;
 
 import java.io.File;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
 /**
  * Created by The eXo Platform SAS .
@@ -47,14 +49,13 @@
  *          it is AS server home in a case of AS env or just current directory
  *          (from where JVM is started) for standalone. See
  */
-
+ at Managed
+ at NamingContext(@Property(key = "container", value = "standalone"))
 public class StandaloneContainer extends ExoContainer implements SessionManagerContainer
 {
 
    private static final long serialVersionUID = 12L;
 
-   private static final String CONFIGURATION_URL_ATTR = "configurationURL";
-
    private static StandaloneContainer container;
 
    // TODO use ONLY attribute from context instead
@@ -199,7 +200,7 @@
    {
       if ((path == null) || (path.length() == 0))
          return;
-      URL confURL = new File(path).getAbsoluteFile().toURL();
+      URL confURL = new File(path).toURI().toURL();
       configurationURL = fileExists(confURL) ? confURL : null;
    }
 
@@ -266,6 +267,19 @@
       return configurationURL;
    }
 
+   @Managed
+   @ManagedDescription("The configuration of the container in XML format.")
+   public String getConfigurationXML()
+   {
+      Configuration config = getConfiguration();
+      if (config == null)
+      {
+         log.warn("The configuration of the StandaloneContainer could not be found");
+         return null;
+      }
+      return config.toXML();
+   }
+   
    /**
     * {@inheritDoc}
     */

Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/MX4JComponentAdapter.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/MX4JComponentAdapter.java	2010-05-12 06:50:23 UTC (rev 2363)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/jmx/MX4JComponentAdapter.java	2010-05-12 08:54:02 UTC (rev 2364)
@@ -31,8 +31,6 @@
 import org.picocontainer.defaults.AbstractComponentAdapter;
 
 import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 
 /**
@@ -129,30 +127,11 @@
       return instance_;
    }
 
-   private static final Comparator<org.exoplatform.container.xml.ComponentPlugin> COMPARATOR =
-      new Comparator<org.exoplatform.container.xml.ComponentPlugin>()
-      {
-
-         public int compare(org.exoplatform.container.xml.ComponentPlugin o1,
-            org.exoplatform.container.xml.ComponentPlugin o2)
-         {
-            return getPriority(o1) - getPriority(o2);
-         }
-
-         private int getPriority(org.exoplatform.container.xml.ComponentPlugin p)
-         {
-            //      return p.getPriority() == null ? Integer.MAX_VALUE : Integer.parseInt(p.getPriority());
-            return p.getPriority() == null ? 0 : Integer.parseInt(p.getPriority());
-         }
-
-      };
-
    private void addComponentPlugin(boolean debug, Object component,
       List<org.exoplatform.container.xml.ComponentPlugin> plugins, ExoContainer container) throws Exception
    {
       if (plugins == null)
          return;
-      Collections.sort(plugins, COMPARATOR);
       for (org.exoplatform.container.xml.ComponentPlugin plugin : plugins)
       {
 

Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/util/ContainerUtil.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/util/ContainerUtil.java	2010-05-12 06:50:23 UTC (rev 2363)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/util/ContainerUtil.java	2010-05-12 08:54:02 UTC (rev 2364)
@@ -34,14 +34,11 @@
 import java.io.InputStream;
 import java.lang.reflect.Constructor;
 import java.net.URL;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -106,32 +103,13 @@
 
    static public void addContainerLifecyclePlugin(ExoContainer container, ConfigurationManager conf)
    {
-      List plugins = new ArrayList(conf.getConfiguration().getContainerLifecyclePlugins());
-      Collections.sort(plugins, COMPARATOR_CONTAINER_PLUGIN);
-      Iterator i = plugins.iterator();
+      Iterator i = conf.getConfiguration().getContainerLifecyclePluginIterator();
       while (i.hasNext())
       {
          ContainerLifecyclePlugin plugin = (ContainerLifecyclePlugin)i.next();
          addContainerLifecyclePlugin(container, plugin);
       }
    }
-   
-   private static final Comparator<org.exoplatform.container.xml.ContainerLifecyclePlugin> COMPARATOR_CONTAINER_PLUGIN =
-      new Comparator<org.exoplatform.container.xml.ContainerLifecyclePlugin>()
-      {
-
-         public int compare(org.exoplatform.container.xml.ContainerLifecyclePlugin o1,
-            org.exoplatform.container.xml.ContainerLifecyclePlugin o2)
-         {
-            return getPriority(o1) - getPriority(o2);
-         }
-
-         private int getPriority(org.exoplatform.container.xml.ContainerLifecyclePlugin p)
-         {
-            return p.getPriority() == null ? 0 : Integer.parseInt(p.getPriority());
-         }
-
-      };
       
    private static void addContainerLifecyclePlugin(ExoContainer container, ContainerLifecyclePlugin plugin)
    {
@@ -178,8 +156,6 @@
       Collection components = conf.getComponents();
       if (components == null)
          return;
-      if (components == null)
-         return;
       Iterator i = components.iterator();
       ClassLoader loader = Thread.currentThread().getContextClassLoader();
       while (i.hasNext())

Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/Component.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/Component.java	2010-05-12 06:50:23 UTC (rev 2363)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/Component.java	2010-05-12 08:54:02 UTC (rev 2364)
@@ -22,6 +22,7 @@
 
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -44,7 +45,7 @@
 
    ArrayList plugins;
 
-   ArrayList<ComponentPlugin> componentPlugins;
+   private ArrayList<ComponentPlugin> componentPlugins;
 
    ArrayList listeners;
 
@@ -114,13 +115,18 @@
       plugins = list;
    }
 
-   public List getComponentPlugins()
+   public List<ComponentPlugin> getComponentPlugins()
    {
       return componentPlugins;
    }
 
-   public void setComponentPlugins(ArrayList list)
+   public void setComponentPlugins(ArrayList<ComponentPlugin> list)
    {
+      if (list != null)
+      {
+         // Sort the list of component plugins first
+         Collections.sort(list);
+      }
       componentPlugins = list;
    }
 

Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/ComponentPlugin.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/ComponentPlugin.java	2010-05-12 06:50:23 UTC (rev 2363)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/ComponentPlugin.java	2010-05-12 08:54:02 UTC (rev 2364)
@@ -23,7 +23,7 @@
  * @since Apr 18, 2005
  * @version $Id: ComponentPlugin.java 5799 2006-05-28 17:55:42Z geaz $
  */
-public class ComponentPlugin
+public class ComponentPlugin implements Comparable<ComponentPlugin>
 {
    String name;
 
@@ -35,7 +35,7 @@
 
    InitParams initParams;
 
-   String priority;
+   int priority;
 
    public String getName()
    {
@@ -87,13 +87,21 @@
       this.initParams = ips;
    }
 
-   public String getPriority()
+   public int getPriority()
    {
       return priority;
    }
 
-   public void setPriority(String priority)
+   public void setPriority(int priority)
    {
       this.priority = priority;
    }
+
+   /**
+    * {@inheritDoc}
+    */
+   public int compareTo(ComponentPlugin o)
+   {
+      return getPriority() - o.getPriority();
+   }
 }

Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/Configuration.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/Configuration.java	2010-05-12 06:50:23 UTC (rev 2363)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/Configuration.java	2010-05-12 08:54:02 UTC (rev 2364)
@@ -18,8 +18,18 @@
  */
 package org.exoplatform.container.xml;
 
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.jibx.runtime.BindingDirectory;
+import org.jibx.runtime.IBindingFactory;
+import org.jibx.runtime.IMarshallingContext;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -32,11 +42,13 @@
  * @email: tuan08 at users.sourceforge.net
  * @version: $Id: Configuration.java 5799 2006-05-28 17:55:42Z geaz $
  */
-public class Configuration
+public class Configuration implements Cloneable
 {
 
    public static final String KERNEL_CONFIGURATION_1_0_URI = "http://www.exoplaform.org/xml/ns/kernel_1_0.xsd";
 
+   private static final Log log = ExoLogger.getLogger("exo.kernel.container.Configuration");
+
    private Map<String, ContainerLifecyclePlugin> containerLifecyclePlugin_ =
       new HashMap<String, ContainerLifecyclePlugin>();
 
@@ -52,9 +64,12 @@
 
    private ArrayList<String> removeConfiguration_;
 
-   public Collection getContainerLifecyclePlugins()
+   public Collection<ContainerLifecyclePlugin> getContainerLifecyclePlugins()
    {
-      return containerLifecyclePlugin_.values();
+      List<ContainerLifecyclePlugin> plugins =
+         new ArrayList<ContainerLifecyclePlugin>(containerLifecyclePlugin_.values());
+      Collections.sort(plugins);
+      return plugins;
    }
 
    public void addContainerLifecyclePlugin(Object object)
@@ -64,9 +79,9 @@
       containerLifecyclePlugin_.put(key, plugin);
    }
 
-   public Iterator getContainerLifecyclePluginIterator()
+   public Iterator<ContainerLifecyclePlugin> getContainerLifecyclePluginIterator()
    {
-      return containerLifecyclePlugin_.values().iterator();
+      return getContainerLifecyclePlugins().iterator();
    }
 
    public boolean hasContainerLifecyclePlugin()
@@ -135,8 +150,7 @@
 
    public void addExternalComponentPlugins(Object o)
    {
-
-      if (o != null)
+      if (o instanceof ExternalComponentPlugins)
       {
          ExternalComponentPlugins eps = (ExternalComponentPlugins)o;
 
@@ -211,19 +225,8 @@
       Iterator i = other.externalComponentPlugins_.values().iterator();
       while (i.hasNext())
       {
-         ExternalComponentPlugins eplugins = (ExternalComponentPlugins)i.next();
-         ExternalComponentPlugins foundExternalComponentPlugins =
-            externalComponentPlugins_.get(eplugins.getTargetComponent());
-         if (foundExternalComponentPlugins == null)
-         {
-            externalComponentPlugins_.put(eplugins.getTargetComponent(), eplugins);
-         }
-         else
-         {
-            foundExternalComponentPlugins.merge(eplugins);
-         }
+         addExternalComponentPlugins(i.next());
       }
-      // externalListeners_.putAll(other.externalListeners_) ;
 
       if (other.getRemoveConfiguration() == null)
          return;
@@ -231,4 +234,93 @@
          removeConfiguration_ = new ArrayList<String>();
       removeConfiguration_.addAll(other.getRemoveConfiguration());
    }
+
+   /**
+    * Merge all the given configurations and return a safe copy of the result
+    * @param configs the list of configurations to merge ordered by priority, the second
+    * configuration will override the configuration of the first one and so on.
+    * @return the merged configuration
+    */
+   public static Configuration merge(Configuration... configs)
+   {
+      if (configs == null || configs.length == 0)
+      {
+         return null;
+      }
+      Configuration result = null;
+      for (Configuration conf : configs)
+      {
+         if (conf == null)
+         {
+            // Ignore the null configuration
+            continue;
+         }
+         else if (result == null)
+         {
+            try
+            {
+               // Initialize with the clone of the first non null configuration 
+               result = (Configuration)conf.clone();
+            }
+            catch (CloneNotSupportedException e)
+            {
+               log.warn("Could not clone the configuration", e);
+               break;
+            }
+         }
+         else
+         {
+            // The merge the current configuration with this new configuration
+            result.mergeConfiguration(conf);
+         }
+      }
+      return result;
+   }
+
+   /**
+    * Dumps the configuration in XML format into the given {@link Writer}
+    */
+   public void toXML(Writer w)
+   {
+      try
+      {
+         IBindingFactory bfact = BindingDirectory.getFactory(Configuration.class);
+         IMarshallingContext mctx = bfact.createMarshallingContext();
+         mctx.setIndent(2);
+         mctx.marshalDocument(this, "UTF-8", null, w);
+      }
+      catch (Exception e)
+      {
+         log.warn("Couldn't dump the runtime configuration in XML Format", e);
+      }
+   }
+
+   /**
+    * Dumps the configuration in XML format into a {@link StringWriter} and 
+    * returns the content
+    */
+   public String toXML()
+   {
+      StringWriter sw = new StringWriter();
+      try
+      {
+         toXML(sw);
+      }
+      catch (Exception e)
+      {
+         log.warn("Cannot convert the configuration to XML format", e);
+         return null;
+      }
+      finally
+      {
+         try
+         {
+            sw.close();
+         }
+         catch (IOException ignore)
+         {
+         }            
+      }
+      return sw.toString();
+   }
 }

Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/ContainerLifecyclePlugin.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/ContainerLifecyclePlugin.java	2010-05-12 06:50:23 UTC (rev 2363)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/ContainerLifecyclePlugin.java	2010-05-12 08:54:02 UTC (rev 2364)
@@ -22,7 +22,7 @@
  * Created by The eXo Platform SAS Author : Tuan Nguyen
  * tuan08 at users.sourceforge.net Sep 8, 2005
  */
-public class ContainerLifecyclePlugin
+public class ContainerLifecyclePlugin implements Comparable<ContainerLifecyclePlugin>
 {
    private String name;
    
@@ -30,7 +30,7 @@
    
    private String description;
    
-   private String priority;
+   private int priority;
 
    private InitParams initParams;
    
@@ -64,12 +64,12 @@
       this.description = desc;
    }
 
-   public String getPriority()
+   public int getPriority()
    {
       return priority;
    }
 
-   public void setPriority(String priority)
+   public void setPriority(int priority)
    {
       this.priority = priority;
    }
@@ -83,4 +83,9 @@
    {
       this.initParams = initParams;
    }
+
+   public int compareTo(ContainerLifecyclePlugin o)
+   {
+      return getPriority() - o.getPriority();
+   }
 }

Modified: kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/ExternalComponentPlugins.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/ExternalComponentPlugins.java	2010-05-12 06:50:23 UTC (rev 2363)
+++ kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/xml/ExternalComponentPlugins.java	2010-05-12 08:54:02 UTC (rev 2364)
@@ -19,6 +19,7 @@
 package org.exoplatform.container.xml;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -30,7 +31,12 @@
 {
    String targetComponent;
 
-   ArrayList<ComponentPlugin> componentPlugins;
+   /**
+    * Indicates whether it has to be sorted or not
+    */
+   private boolean dirty;
+   
+   private ArrayList<ComponentPlugin> componentPlugins;
 
    public String getTargetComponent()
    {
@@ -42,25 +48,33 @@
       targetComponent = s;
    }
 
-   public List getComponentPlugins()
+   public List<ComponentPlugin> getComponentPlugins()
    {
+      if (dirty && componentPlugins != null)
+      {
+         // Sort the list of component plugins first
+         Collections.sort(componentPlugins);
+         dirty = false;
+      }
       return componentPlugins;
    }
 
    public void setComponentPlugins(ArrayList<ComponentPlugin> list)
    {
       componentPlugins = list;
+      dirty = true;
    }
 
    public void merge(ExternalComponentPlugins other)
    {
       if (other == null)
          return;
-      List otherPlugins = other.getComponentPlugins();
+      List<ComponentPlugin> otherPlugins = other.getComponentPlugins();
       if (otherPlugins == null)
          return;
       if (componentPlugins == null)
-         componentPlugins = new ArrayList();
+         componentPlugins = new ArrayList<ComponentPlugin>();
       componentPlugins.addAll(otherPlugins);
+      dirty = true;
    }
 }

Modified: kernel/trunk/exo.kernel.container/src/main/resources/org/exoplatform/container/configuration/kernel-configuration_1_2.xsd
===================================================================
--- kernel/trunk/exo.kernel.container/src/main/resources/org/exoplatform/container/configuration/kernel-configuration_1_2.xsd	2010-05-12 06:50:23 UTC (rev 2363)
+++ kernel/trunk/exo.kernel.container/src/main/resources/org/exoplatform/container/configuration/kernel-configuration_1_2.xsd	2010-05-12 08:54:02 UTC (rev 2364)
@@ -160,7 +160,7 @@
             <xsd:element name="set-method" type="xsd:string" minOccurs="1" maxOccurs="1"/>
             <xsd:element name="type" type="xsd:string" minOccurs="1" maxOccurs="1"/>
             <xsd:element name="description" type="xsd:string" minOccurs="0" maxOccurs="1"/>
-            <xsd:element name="priority" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+            <xsd:element name="priority" type="xsd:int" minOccurs="0" maxOccurs="1"/>
             <xsd:element name="init-params" type="initParamsType" minOccurs="0" maxOccurs="1"/>
         </xsd:sequence>
         <xsd:attribute name="profiles" type="xsd:string"/>
@@ -178,7 +178,7 @@
             <xsd:element name="name" type="xsd:string" minOccurs="0" maxOccurs="1"/>
             <xsd:element name="type" type="xsd:string" minOccurs="1" maxOccurs="1"/>
             <xsd:element name="description" type="xsd:string" minOccurs="0" maxOccurs="1"/>
-            <xsd:element name="priority" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+            <xsd:element name="priority" type="xsd:int" minOccurs="0" maxOccurs="1"/>
             <xsd:element name="init-params" type="initParamsType" minOccurs="0" maxOccurs="1"/>
         </xsd:sequence>
     </xsd:complexType>

Modified: kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/TestExoContainer.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/TestExoContainer.java	2010-05-12 06:50:23 UTC (rev 2363)
+++ kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/container/TestExoContainer.java	2010-05-12 08:54:02 UTC (rev 2364)
@@ -49,18 +49,20 @@
       final RootContainer container = createRootContainer("test-exo-container.xml");
       MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class);
       assertNotNull(counter);
-      assertEquals(2, counter.init.size());
-      assertEquals(2, counter.start.size());
+      assertEquals(3, counter.init.size());
+      assertEquals(3, counter.start.size());
       container.stop();
-      assertEquals(2, counter.stop.size());
+      assertEquals(3, counter.stop.size());
       container.dispose();
-      assertEquals(2, counter.destroy.size());
+      assertEquals(3, counter.destroy.size());
       // Check order
       assertTrue(counter.init.get(0) instanceof MyContainerLifecyclePlugin2);
       MyContainerLifecyclePlugin2 plugin = (MyContainerLifecyclePlugin2)counter.init.get(0);
       assertNotNull(plugin.getName());
       assertNotNull(plugin.getDescription());
       assertNotNull(plugin.param);
+      assertTrue(counter.init.get(1) instanceof MyContainerLifecyclePlugin3);
+      assertTrue(counter.init.get(2) instanceof MyContainerLifecyclePlugin1);
    }
    
    public void testStackOverFlow()
@@ -421,4 +423,42 @@
          if (counter != null) counter.stop.add(this);
       }   
    }
+   
+   
+   public static class MyContainerLifecyclePlugin3 extends BaseContainerLifecyclePlugin
+   {
+      
+      public MyContainerLifecyclePlugin3()
+      {
+      }
+      
+      @Override
+      public void destroyContainer(ExoContainer container) throws Exception
+      {
+         MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class);
+         if (counter != null) counter.destroy.add(this);
+      }
+
+      @Override
+      public void initContainer(ExoContainer container) throws Exception
+      {
+         MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class);
+         if (counter != null) counter.init.add(this);
+      }
+
+      @Override
+      public void startContainer(ExoContainer container) throws Exception
+      {
+         MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class);
+         if (counter != null) counter.start.add(this);
+      }
+
+      @Override
+      public void stopContainer(ExoContainer container) throws Exception
+      {
+         MyCounter counter = (MyCounter)container.getComponentInstanceOfType(MyCounter.class);
+         if (counter != null) counter.stop.add(this);
+      }
+      
+   }
 }
\ No newline at end of file

Modified: kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/xml/test/TestConfigurationXML.java
===================================================================
--- kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/xml/test/TestConfigurationXML.java	2010-05-12 06:50:23 UTC (rev 2363)
+++ kernel/trunk/exo.kernel.container/src/test/java/org/exoplatform/xml/test/TestConfigurationXML.java	2010-05-12 08:54:02 UTC (rev 2364)
@@ -113,7 +113,7 @@
          assertEquals("component-plugins-name", cp.getName());
          assertEquals("set-method-name", cp.getSetMethod());
          assertEquals("component-plugins-type", cp.getType());
-         assertEquals("1", cp.getPriority());
+         assertEquals(1, cp.getPriority());
          it = conf.getExternalComponentPluginsIterator();
          assertNotNull(it);
          assertTrue(it.hasNext());         
@@ -126,7 +126,7 @@
          assertEquals("component-plugins-name", cp.getName());
          assertEquals("set-method-name", cp.getSetMethod());
          assertEquals("component-plugins-type", cp.getType());
-         assertEquals("1", cp.getPriority());
+         assertEquals(1, cp.getPriority());
          list = conf.getImports();
          assertNotNull(list);
          assertFalse(list.isEmpty());

Modified: kernel/trunk/exo.kernel.container/src/test/resources/conf/test-configuration.xml
===================================================================
--- kernel/trunk/exo.kernel.container/src/test/resources/conf/test-configuration.xml	2010-05-12 06:50:23 UTC (rev 2363)
+++ kernel/trunk/exo.kernel.container/src/test/resources/conf/test-configuration.xml	2010-05-12 08:54:02 UTC (rev 2364)
@@ -92,10 +92,11 @@
    <external-component-plugins>
       <target-component>org.exoplatform.mocks.PriorityService</target-component>
       <component-plugin>
-         <name>PluginPriority3</name>
+         <name>PluginPriority2</name>
          <set-method>addPlugin</set-method>
-         <type>org.exoplatform.mocks.PluginPriority3</type>
-         <description>PluginPriority3 description</description>
+         <type>org.exoplatform.mocks.PluginPriority2</type>
+         <description>PluginPriority2 description</description>
+         <priority>2</priority>
       </component-plugin>
    </external-component-plugins>
    <external-component-plugins>
@@ -108,11 +109,10 @@
          <priority>1</priority>
       </component-plugin>
       <component-plugin>
-         <name>PluginPriority2</name>
+         <name>PluginPriority3</name>
          <set-method>addPlugin</set-method>
-         <type>org.exoplatform.mocks.PluginPriority2</type>
-         <description>PluginPriority2 description</description>
-         <priority>2</priority>
+         <type>org.exoplatform.mocks.PluginPriority3</type>
+         <description>PluginPriority3 description</description>
       </component-plugin>
    </external-component-plugins>
 

Modified: kernel/trunk/exo.kernel.container/src/test/resources/org/exoplatform/container/test-exo-container.xml
===================================================================
--- kernel/trunk/exo.kernel.container/src/test/resources/org/exoplatform/container/test-exo-container.xml	2010-05-12 06:50:23 UTC (rev 2363)
+++ kernel/trunk/exo.kernel.container/src/test/resources/org/exoplatform/container/test-exo-container.xml	2010-05-12 08:54:02 UTC (rev 2364)
@@ -25,6 +25,10 @@
 			</value-param>
 		</init-params>
 	</container-lifecycle-plugin>
+	<container-lifecycle-plugin>
+		<type>org.exoplatform.container.TestExoContainer$MyContainerLifecyclePlugin3</type>
+		<priority>-5</priority>
+	</container-lifecycle-plugin>
 	<component>
 		<type>org.exoplatform.container.TestExoContainer$MyCounter</type>
 	</component>



More information about the exo-jcr-commits mailing list