[exo-jcr-commits] exo-jcr SVN: r634 - in kernel/branches/mc-int-branch: exo.kernel.container and 27 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Fri Nov 13 06:16:32 EST 2009


Author: mstruk
Date: 2009-11-13 06:16:31 -0500 (Fri, 13 Nov 2009)
New Revision: 634

Added:
   kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/
   kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/GenericWrapperUtil.java
   kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/InterceptMC.java
   kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/JavassistAOPClassLoader.java
   kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCComponentAdapter.java
   kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCComponentInfo.java
   kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegration.java
   kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegrationContainer.java
   kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCInterceptProxy.java
   kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/RootContainerVDFDecoratorInjector.java
   kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/WrapperMethodComposer.java
   kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/util/EnvSpecific.java
   kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/util/JBossEnv.java
   kernel/branches/mc-int-branch/exo.kernel.demos/
   kernel/branches/mc-int-branch/exo.kernel.demos/custom-pojo/
   kernel/branches/mc-int-branch/exo.kernel.demos/custom-pojo/pom.xml
   kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/
   kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/pom.xml
   kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/
   kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/
   kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/
   kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/
   kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/
   kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/
   kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/
   kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/
   kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/InjectedBean.java
   kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/InjectingBean.java
   kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/
   kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/META-INF/
   kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/META-INF/jboss-beans.xml
   kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/conf/
   kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/conf/configuration.xml
   kernel/branches/mc-int-branch/exo.kernel.demos/pom.xml
   kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/
   kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/pom.xml
   kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/src/
   kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/src/main/
   kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/src/main/java/
   kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/src/main/java/org/
   kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/src/main/java/org/jboss/
   kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/src/main/java/org/jboss/dependency/
   kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/src/main/java/org/jboss/dependency/plugins/
   kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/src/main/java/org/jboss/dependency/plugins/helpers/
   kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/src/main/java/org/jboss/dependency/plugins/helpers/StatelessController.java
Modified:
   kernel/branches/mc-int-branch/exo.kernel.container/pom.xml
   kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/CachingContainer.java
   kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/web/PortalContainerConfigOwner.java
   kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/web/PortalContainerCreator.java
   kernel/branches/mc-int-branch/pom.xml
Log:
MC integration - initial commit

Modified: kernel/branches/mc-int-branch/exo.kernel.container/pom.xml
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.container/pom.xml	2009-11-13 10:51:33 UTC (rev 633)
+++ kernel/branches/mc-int-branch/exo.kernel.container/pom.xml	2009-11-13 11:16:31 UTC (rev 634)
@@ -1,122 +1,148 @@
-<!--
-
-    Copyright (C) 2009 eXo Platform SAS.
-
-    This is free software; you can redistribute it and/or modify it
-    under the terms of the GNU Lesser General Public License as
-    published by the Free Software Foundation; either version 2.1 of
-    the License, or (at your option) any later version.
-
-    This software is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this software; if not, write to the Free
-    Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-    02110-1301 USA, or see the FSF site: http://www.fsf.org.
-
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-   <modelVersion>4.0.0</modelVersion>
-
-   <parent>
-      <groupId>org.exoplatform.kernel</groupId>
-      <artifactId>kernel-parent</artifactId>
-      <version>2.2.0-Beta03-SNAPSHOT</version>
-   </parent>
-
-   <artifactId>exo.kernel.container</artifactId>
-
-   <name>eXo Kernel :: Container</name>
-   <description>eXo Kernel Container</description>
-   
-   <dependencies>
-      <dependency>
-         <groupId>org.exoplatform.kernel</groupId>
-         <artifactId>exo.kernel.commons</artifactId>
-      </dependency>
-
-      <dependency>
-         <groupId>org.exoplatform.tool</groupId>
-         <artifactId>exo.tool.framework.junit</artifactId>
-         <scope>compile</scope>
-      </dependency>
-
-      <dependency>
-         <groupId>javax.servlet</groupId>
-         <artifactId>servlet-api</artifactId>
-      </dependency>
-
-      <dependency>
-         <groupId>picocontainer</groupId>
-         <artifactId>picocontainer</artifactId>
-      </dependency>
-
-      <dependency>
-         <groupId>commons-beanutils</groupId>
-         <artifactId>commons-beanutils</artifactId>
-      </dependency>
-
-      <dependency>
-         <groupId>org.jibx</groupId>
-         <artifactId>jibx-run</artifactId>
-         <exclusions>
-            <exclusion>
-               <groupId>org.codehaus.woodstox</groupId>
-               <artifactId>wstx-asl</artifactId>
-            </exclusion>
-         </exclusions>
-      </dependency>
-
-      <dependency>
-         <groupId>org.jibx</groupId>
-         <artifactId>jibx-bind</artifactId>
-         <exclusions>
-            <exclusion>
-               <groupId>org.codehaus.woodstox</groupId>
-               <artifactId>wstx-asl</artifactId>
-            </exclusion>
-         </exclusions>
-      </dependency>
-
-      <dependency>
-         <groupId>org.jibx</groupId>
-         <artifactId>jibx-extras</artifactId>
-      </dependency>
-   </dependencies>
-
-   <build>
-      <plugins>
-         <plugin>
-            <groupId>org.jibx</groupId>
-            <artifactId>maven-jibx-plugin</artifactId>
-            <configuration>
-               <directory>src/main/resources</directory>
-               <includes>
-                  <includes>binding.xml</includes>
-               </includes>
-            </configuration>
-            <executions>
-               <execution>
-                  <goals>
-                     <goal>bind</goal>
-                  </goals>
-               </execution>
-            </executions>
-         </plugin>
-
-         <!--
-         <plugin>
-            <groupId>org.codehaus.mojo</groupId>
-            <artifactId>apt-maven-plugin</artifactId>
-            <configuration>
-               <factory>org.exoplatform.management.apt.ManagementAPF</factory>
-            </configuration>
-         </plugin>
-         -->
-      </plugins>
-   </build>
-</project>
+<!--
+
+    Copyright (C) 2009 eXo Platform SAS.
+
+    This is free software; you can redistribute it and/or modify it
+    under the terms of the GNU Lesser General Public License as
+    published by the Free Software Foundation; either version 2.1 of
+    the License, or (at your option) any later version.
+
+    This software is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this software; if not, write to the Free
+    Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+    02110-1301 USA, or see the FSF site: http://www.fsf.org.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+   <modelVersion>4.0.0</modelVersion>
+
+   <parent>
+      <groupId>org.exoplatform.kernel</groupId>
+      <artifactId>kernel-parent</artifactId>
+      <version>2.2.0-Beta03-SNAPSHOT</version>
+   </parent>
+
+   <artifactId>exo.kernel.container</artifactId>
+
+   <name>eXo Kernel :: Container</name>
+   <description>eXo Kernel Container</description>
+   
+   <dependencies>
+      <dependency>
+         <groupId>org.exoplatform.kernel</groupId>
+         <artifactId>exo.kernel.commons</artifactId>
+      </dependency>
+
+      <dependency>
+         <groupId>org.exoplatform.tool</groupId>
+         <artifactId>exo.tool.framework.junit</artifactId>
+         <scope>compile</scope>
+      </dependency>
+
+      <dependency>
+         <groupId>javax.servlet</groupId>
+         <artifactId>servlet-api</artifactId>
+      </dependency>
+
+      <dependency>
+         <groupId>picocontainer</groupId>
+         <artifactId>picocontainer</artifactId>
+      </dependency>
+
+      <dependency>
+         <groupId>commons-beanutils</groupId>
+         <artifactId>commons-beanutils</artifactId>
+      </dependency>
+
+      <dependency>
+         <groupId>org.jibx</groupId>
+         <artifactId>jibx-run</artifactId>
+         <exclusions>
+            <exclusion>
+               <groupId>org.codehaus.woodstox</groupId>
+               <artifactId>wstx-asl</artifactId>
+            </exclusion>
+         </exclusions>
+      </dependency>
+
+      <dependency>
+         <groupId>org.jibx</groupId>
+         <artifactId>jibx-bind</artifactId>
+         <exclusions>
+            <exclusion>
+               <groupId>org.codehaus.woodstox</groupId>
+               <artifactId>wstx-asl</artifactId>
+            </exclusion>
+         </exclusions>
+      </dependency>
+
+      <dependency>
+         <groupId>org.jibx</groupId>
+         <artifactId>jibx-extras</artifactId>
+      </dependency>
+
+      <dependency>
+         <groupId>org.jboss.microcontainer</groupId>
+         <artifactId>jboss-aop-mc-int</artifactId>
+      </dependency>
+
+      <dependency>
+         <groupId>org.jboss.mc-int</groupId>
+         <artifactId>jboss-mc-int-common</artifactId>
+      </dependency>
+
+      <dependency>
+         <groupId>org.jboss.mc-int</groupId>
+         <artifactId>jboss-mc-int-servlet</artifactId>
+      </dependency>
+
+      <dependency>
+         <groupId>org.jboss.cl</groupId>
+         <artifactId>jboss-classloader</artifactId>
+      </dependency>
+
+      <dependency>
+         <groupId>org.exoplatform.kernel</groupId>
+         <artifactId>mc-kernel-extras</artifactId>
+      </dependency>
+
+   </dependencies>
+
+   <build>
+      <plugins>
+         <plugin>
+            <groupId>org.jibx</groupId>
+            <artifactId>maven-jibx-plugin</artifactId>
+            <configuration>
+               <directory>src/main/resources</directory>
+               <includes>
+                  <includes>binding.xml</includes>
+               </includes>
+            </configuration>
+            <executions>
+               <execution>
+                  <goals>
+                     <goal>bind</goal>
+                  </goals>
+               </execution>
+            </executions>
+         </plugin>
+
+         <!--
+         <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>apt-maven-plugin</artifactId>
+            <configuration>
+               <factory>org.exoplatform.management.apt.ManagementAPF</factory>
+            </configuration>
+         </plugin>
+         -->
+      </plugins>
+   </build>
+</project>

Modified: kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/CachingContainer.java
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/CachingContainer.java	2009-11-13 10:51:33 UTC (rev 633)
+++ kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/CachingContainer.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -18,6 +18,7 @@
  */
 package org.exoplatform.container;
 
+import org.exoplatform.container.mc.MCIntegrationContainer;
 import org.picocontainer.ComponentAdapter;
 import org.picocontainer.Parameter;
 import org.picocontainer.PicoContainer;
@@ -26,7 +27,6 @@
 import org.picocontainer.PicoVisitor;
 import org.picocontainer.defaults.AbstractPicoVisitor;
 import org.picocontainer.defaults.ComponentAdapterFactory;
-import org.picocontainer.defaults.DefaultPicoContainer;
 import org.picocontainer.defaults.DuplicateComponentKeyRegistrationException;
 
 import java.util.List;
@@ -37,7 +37,7 @@
  * @author <a href="mailto:julien.viet at exoplatform.com">Julien Viet</a>
  * @version $Revision$
  */
-public class CachingContainer extends DefaultPicoContainer
+public class CachingContainer extends MCIntegrationContainer
 {
 
    private final ConcurrentMap<Class, ComponentAdapter> adapterByType =

Added: kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/GenericWrapperUtil.java
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/GenericWrapperUtil.java	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/GenericWrapperUtil.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,165 @@
+package org.exoplatform.container.mc;
+
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.CtConstructor;
+import javassist.CtMethod;
+import javassist.CtNewMethod;
+import javassist.LoaderClassPath;
+import javassist.Modifier;
+import javassist.NotFoundException;
+import javassist.bytecode.AnnotationsAttribute;
+import javassist.bytecode.ClassFile;
+import javassist.bytecode.ConstPool;
+import javassist.bytecode.MethodInfo;
+import org.jboss.deployers.structure.spi.DeploymentUnit;
+import org.jboss.deployers.vfs.plugins.structure.AbstractVFSDeploymentUnit;
+import org.jboss.mc.common.ThreadLocalUtils;
+import org.jboss.virtual.MemoryFileFactory;
+import org.jboss.virtual.VirtualFile;
+
+import java.net.URL;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @author <a href="mailto:ajustin at redhat.com">Ales Justin</a>
+ * @author <a href="mailto:mstrukel at redhat.com">Marko Strukelj</a>
+ */
+final class GenericWrapperUtil
+{
+   private static AtomicInteger counter = new AtomicInteger(0);
+
+   static MCComponentInfo generateAndInstallWrapper(Object instance) throws Exception
+   {
+      ClassPool pool = ClassPool.getDefault();
+      pool.insertClassPath(new LoaderClassPath(Thread.currentThread().getContextClassLoader()));
+
+      CtClass cc = pool.get(MCInterceptProxy.class.getName());
+      CtClass pc = pool.get(instance.getClass().getName());
+
+      zeroArgConstructorCheck(pc, instance);
+
+      cc.setSuperclass(pc);
+      cc.setName(getPackage(cc.getName()) + ".MCInterceptProxy$" + counter.getAndIncrement());
+      WrapperMethodComposer composer = new WrapperMethodComposer(MCInterceptProxy.DELEGATE, pc.getName());
+
+      ClassFile cf = cc.getClassFile();
+      AnnotationsAttribute attr = setAnnotations(pc.getClassFile().getAttributes(), cf.getConstPool());
+      if (attr != null)
+         cf.addAttribute(attr);
+      cf.setVersionToJava5();
+
+      for (CtMethod m : pc.getMethods())
+      {
+         if (isMethodOverridable(m))
+         {
+            CtMethod method = CtNewMethod.make(composer.composeMethod(m), cc);
+            MethodInfo minf = method.getMethodInfo();
+            attr = setAnnotations(m.getMethodInfo().getAttributes(), minf.getConstPool());
+            if (attr != null)
+               minf.addAttribute(attr);
+            cc.addMethod(method);
+         }
+      }
+
+      installWrapper(cc);
+
+      MCComponentInfo mcinf = new MCComponentInfo(cc.getName(),
+            new JavassistAOPClassLoader(Thread.currentThread().getContextClassLoader(), cc.getClassPool()));
+      Thread.currentThread().setContextClassLoader(mcinf.getClassLoader());  // TODO: ensure symetry - reset old CL when done
+      return mcinf;
+   }
+
+   private static AnnotationsAttribute setAnnotations(List attrs, ConstPool cpool)
+   {
+      AnnotationsAttribute attr = new AnnotationsAttribute(cpool, AnnotationsAttribute.visibleTag);
+      for (Object a : attrs)
+      {
+         if (a instanceof AnnotationsAttribute)
+         {
+            AnnotationsAttribute aa = (AnnotationsAttribute) a;
+            if (AnnotationsAttribute.visibleTag.equals(aa.getName()) == false)
+               continue;
+            attr.setAnnotations(aa.getAnnotations());
+            return attr;
+         }
+      }
+      return null;
+   }
+
+   private static String getPackage(String name)
+   {
+      return name.substring(0, name.lastIndexOf("."));
+   }
+
+   private static void installWrapper(CtClass cc) throws Exception
+   {
+      // This is to make classloading work with jboss-aop and mc-classloading
+      // - third-party (Tomcat) can be enabled through context classloader
+      DeploymentUnit unit = ThreadLocalUtils.getUnit();
+      String host = getVFSMemoryHost(unit);
+      if (host != null)
+      {
+         URL vfsUrl = new URL("vfsmemory://" + host + "/" + getResourcePath(cc.getName()));
+         MemoryFileFactory.putFile(vfsUrl, cc.toBytecode());
+         return;
+      }
+   }
+
+   static void postInstallCleanup()
+   {
+      // TODO: symmetry not 100% assured here
+      ClassLoader cl = Thread.currentThread().getContextClassLoader();
+      if (cl instanceof JavassistAOPClassLoader)
+         Thread.currentThread().setContextClassLoader(cl.getParent());
+   }
+
+   private static String getResourcePath(String name)
+   {
+      return name.replace(".", "/") + ".class";
+   }
+
+   private static String getVFSMemoryHost(DeploymentUnit unit) throws Exception
+   {
+      if (unit instanceof AbstractVFSDeploymentUnit)
+      {
+         List<VirtualFile> classPath = ((AbstractVFSDeploymentUnit) unit).getClassPath();
+         for (VirtualFile vf : classPath)
+         {
+            URL url = vf.toURL();
+            if ("vfsmemory".equals(url.getProtocol()))
+            {
+               return url.getHost();
+            }
+         }
+         return getVFSMemoryHost(unit.getParent());
+      }
+
+      return null;
+   }
+
+   private static boolean isMethodOverridable(CtMethod m)
+   {
+      return (m.getModifiers() & Modifier.FINAL) == 0
+            && !"clone".equals(m.getName())
+            && !"finalize".equals(m.getName());
+   }
+
+   private static void zeroArgConstructorCheck(CtClass pc, Object c)
+         throws NotFoundException
+   {
+      CtConstructor[] ctors = pc.getConstructors();
+      boolean found = false;
+      for (CtConstructor cons : ctors)
+      {
+         if (cons.getParameterTypes().length == 0)
+         {
+            found = true;
+            break;
+         }
+      }
+      if (!found)
+         throw new RuntimeException("Class can not be AOP instrumented - it has no zero-arguments public constructor: " + c.getClass());
+   }
+}
\ No newline at end of file

Added: kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/InterceptMC.java
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/InterceptMC.java	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/InterceptMC.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,24 @@
+package org.exoplatform.container.mc;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Marks Gatein MC enabled component.
+ *
+ * @author <a href="mailto:mstrukel at redhat.com">Marko Strukelj</a>
+ * @author <a href="mailto:ales.justin at redhat.com">Ales Justin</a>
+ */
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target({ElementType.TYPE})
+public @interface InterceptMC
+{
+   /**
+    * Do we enable AOP for this component.
+    *
+    * @return true if we should enable AOP, false otherwise
+    */
+   boolean enableAOP() default false;
+}

Added: kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/JavassistAOPClassLoader.java
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/JavassistAOPClassLoader.java	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/JavassistAOPClassLoader.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,61 @@
+package org.exoplatform.container.mc;
+
+import javassist.Loader;
+import javassist.ClassPool;
+
+/**
+ * @author <a href="mailto:mstrukel at redhat.com">Marko Strukelj</a>
+ */
+public class JavassistAOPClassLoader extends Loader
+{
+   public JavassistAOPClassLoader()
+   {
+   }
+
+   public JavassistAOPClassLoader(ClassPool cp)
+   {
+      super(cp);
+   }
+
+   public JavassistAOPClassLoader(ClassLoader parent, ClassPool cp)
+   {
+      super(parent, cp);
+   }
+
+   @Override
+   protected Class loadClassByDelegation(String name) throws ClassNotFoundException
+   {
+      if (name.startsWith("org.jboss.aop."))
+         return delegateToParent(name);
+
+      return super.loadClassByDelegation(name);
+   }
+
+   protected Class loadClass(String name, boolean resolve)
+         throws ClassFormatError, ClassNotFoundException
+   {
+      name = name.intern();
+      synchronized (name)
+      {
+         Class c = findLoadedClass(name);
+         if (c == null)
+         {
+            try
+            {
+               c = delegateToParent(name);
+            }
+            catch (ClassNotFoundException ignored)
+            {
+            }
+         }
+
+         if (c == null)
+            c = findClass(name);
+
+         if (resolve)
+            resolveClass(c);
+
+         return c;
+      }
+   }
+}

Added: kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCComponentAdapter.java
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCComponentAdapter.java	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCComponentAdapter.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,125 @@
+package org.exoplatform.container.mc;
+
+import java.lang.ref.WeakReference;
+
+import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
+import org.jboss.dependency.plugins.helpers.StatelessController;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.kernel.plugins.dependency.AbstractKernelControllerContext;
+import org.jboss.kernel.spi.dependency.KernelController;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.picocontainer.ComponentAdapter;
+import org.picocontainer.PicoContainer;
+import org.picocontainer.PicoInitializationException;
+import org.picocontainer.PicoIntrospectionException;
+import org.picocontainer.PicoVisitor;
+
+/**
+ * @author <a href="mailto:ajustin at redhat.com">Ales Justin</a>
+ * @author <a href="mailto:mstrukel at redhat.com">Marko Strukelj</a>
+ */
+public class MCComponentAdapter implements ComponentAdapter
+{
+   private KernelController controller;
+   private ComponentAdapter delegate;
+   private InterceptMC interceptMC;
+   private WeakReference<Object> lastComponentInstance;
+
+   public MCComponentAdapter(KernelController controller, ComponentAdapter delegate, InterceptMC interceptMC)
+   {
+      if (controller == null)
+         throw new IllegalArgumentException("Null controller");
+      if (delegate == null)
+         throw new IllegalArgumentException("Null delegate");
+
+      if (controller instanceof StatelessController)
+         throw new IllegalArgumentException("controller is instanceof StatelessController");
+
+      this.controller = controller;
+      this.delegate = delegate;
+      this.interceptMC = interceptMC;
+   }
+
+   public Object getComponentKey()
+   {
+      return delegate.getComponentKey();
+   }
+
+   public Class getComponentImplementation()
+   {
+      return delegate.getComponentImplementation();
+   }
+
+   public Object getComponentInstance(PicoContainer container) throws PicoInitializationException, PicoIntrospectionException
+   {
+      Object target = getTargetFromRef();
+      if (target != null)
+         return target;
+
+      try
+      {
+         String key = delegate.getComponentKey().toString();
+         Object instance = delegate.getComponentInstance(container);
+         BeanMetaDataBuilder builder;
+         if (interceptMC != null && interceptMC.enableAOP())
+         {
+            MCComponentInfo mcinfo = GenericWrapperUtil.generateAndInstallWrapper(instance);
+            builder = BeanMetaDataBuilder.createBuilder(key, mcinfo.getWrapperClassName());
+            builder.addConstructorParameter(Object.class.getName(), instance);
+         }
+         else
+         {
+            builder = BeanMetaDataBuilder.createBuilder(key, instance.getClass().getName());
+            builder.setConstructorValue(instance);
+         }
+         builder.ignoreCreate();
+         builder.ignoreStart();
+         builder.ignoreStop();
+         builder.ignoreDestroy();
+
+         KernelControllerContext ctx = new AbstractKernelControllerContext(null, builder.getBeanMetaData(), null);
+         try
+         {
+            StatelessController ctrl = new StatelessController(controller);
+            ctrl.install(ctx);
+            if (ctx.getError() != null)
+               throw ctx.getError();
+            if (ctrl.getStates().isBeforeState(ctx.getState(), ControllerState.INSTALLED))
+               throw new IllegalArgumentException("Missing some dependency: " + ctx.getDependencyInfo().getUnresolvedDependencies(null));
+
+            target = ctx.getTarget();
+            lastComponentInstance = new WeakReference<Object>(target);
+            return target;
+         }
+         finally
+         {
+            GenericWrapperUtil.postInstallCleanup();
+         }
+      }
+      catch (Throwable ex)
+      {
+         throw new RuntimeException("Failed to perform MC interception on component: " + delegate.getComponentImplementation(), ex);
+      }
+   }
+
+   public void verify(PicoContainer container) throws PicoIntrospectionException
+   {
+      delegate.verify(container);
+   }
+
+   public void accept(PicoVisitor visitor)
+   {
+      delegate.accept(visitor);
+   }
+
+   private Object getTargetFromRef()
+   {
+      if (lastComponentInstance == null)
+         return null;
+
+      Object target = lastComponentInstance.get();
+      if (target == null)
+         return null;
+      return target;
+   }
+}
\ No newline at end of file

Added: kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCComponentInfo.java
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCComponentInfo.java	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCComponentInfo.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,26 @@
+package org.exoplatform.container.mc;
+
+/**
+ * @author <a href="mailto:mstrukel at redhat.com">Marko Strukelj</a>
+ */
+public class MCComponentInfo
+{
+   private String name;
+   private ClassLoader classLoader;
+
+   public MCComponentInfo(String wrapperClassName, ClassLoader classLoader)
+   {
+      this.name = wrapperClassName;
+      this.classLoader = classLoader;
+   }
+
+   public String getWrapperClassName()
+   {
+      return name;
+   }
+
+   public ClassLoader getClassLoader()
+   {
+      return classLoader;
+   }
+}

Added: kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegration.java
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegration.java	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegration.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,95 @@
+package org.exoplatform.container.mc;
+
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.jboss.kernel.Kernel;
+import org.jboss.kernel.plugins.dependency.AbstractKernelController;
+import org.jboss.kernel.plugins.deployment.xml.BasicXMLDeployer;
+import org.jboss.kernel.spi.deployment.KernelDeployment;
+import org.jboss.mc.common.ThreadLocalUtils;
+import org.picocontainer.ComponentAdapter;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:mstrukel at redhat.com">Marko Strukelj</a>
+ */
+public class MCIntegration
+{
+   private static Log log = ExoLogger.getLogger(MCIntegration.class);
+   private static MCIntegration mcint;
+
+   private AbstractKernelController rootController;
+   private List<KernelDeployment> deployments = new LinkedList<KernelDeployment>();
+
+   public synchronized static MCIntegration getInstance()
+   {
+      if (mcint == null)
+         mcint = new MCIntegration();
+      return mcint;
+   }
+
+   public synchronized AbstractKernelController getRootController()
+   {
+      if (rootController == null)
+      {
+         Kernel kernel = ThreadLocalUtils.getKernel();
+         if (kernel != null)
+         {
+            rootController = (AbstractKernelController) kernel.getController();
+         }
+         else
+         {
+            log.warn("GateIn - MC integration not available");
+            return null;
+         }
+         processDeployments();
+      }
+      return rootController;
+   }
+
+   private void processDeployments()
+   {
+      // Now deploy any AOP configuration - instantiates lifecycle callbacks
+      BasicXMLDeployer deployer = new BasicXMLDeployer(rootController.getKernel());
+      Enumeration<URL> urls = null;
+      try
+      {
+         urls = Thread.currentThread().getContextClassLoader().getResources("conf/mc-beans.xml");
+      }
+      catch (IOException e)
+      {
+         throw new RuntimeException("Failed to load resources: conf/mc-beans.xml", e);
+      }
+
+      while (urls.hasMoreElements())
+      {
+         URL confUrl = urls.nextElement();
+         try
+         {
+            deployments.add(deployer.deploy(confUrl));
+         }
+         catch (Throwable ex)
+         {
+            throw new RuntimeException("Failed to deploy: " + confUrl, ex);
+         }
+      }
+
+      if (deployments.size() == 0)
+      {
+         log.debug("No conf/mc-beans.xml found. MC integration disabled.");
+      }
+   }
+
+   public ComponentAdapter getMCAdapter(ComponentAdapter adapter, InterceptMC interceptAnnotation)
+   {
+      AbstractKernelController controller = getRootController();
+      if (controller != null)
+         adapter = new MCComponentAdapter(controller, adapter, interceptAnnotation);
+      return adapter;
+   }
+}

Added: kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegrationContainer.java
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegrationContainer.java	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegrationContainer.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,95 @@
+package org.exoplatform.container.mc;
+
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.picocontainer.ComponentAdapter;
+import org.picocontainer.PicoContainer;
+import org.picocontainer.defaults.ComponentAdapterFactory;
+import org.picocontainer.defaults.DefaultPicoContainer;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * @author <a href="mailto:mstrukel at redhat.com">Marko Strukelj</a>
+ */
+public class MCIntegrationContainer extends DefaultPicoContainer
+{
+   private static Log log = ExoLogger.getLogger(MCIntegrationContainer.class);
+
+   public MCIntegrationContainer(ComponentAdapterFactory componentAdapterFactory, PicoContainer parent)
+   {
+      super(componentAdapterFactory, parent);
+   }
+
+   public MCIntegrationContainer(PicoContainer parent)
+   {
+      super(parent);
+   }
+
+   public MCIntegrationContainer(ComponentAdapterFactory componentAdapterFactory)
+   {
+      super(componentAdapterFactory);
+   }
+
+   public MCIntegrationContainer()
+   {
+   }
+
+   public ComponentAdapter registerComponent(ComponentAdapter componentAdapter)
+   {
+      Class<?> clazz = componentAdapter.getComponentImplementation();
+      InterceptMC interceptAnnotation = clazz.getAnnotation(InterceptMC.class);
+
+      ComponentAdapter adapter = componentAdapter;
+      if (interceptAnnotation != null)
+      {
+         if (hasMCKernel(componentAdapter))
+         {
+            adapter = MCIntegration.getInstance().getMCAdapter(componentAdapter, interceptAnnotation);
+         }
+      }
+      super.registerComponent(adapter);
+      return adapter;
+   }
+
+   public static boolean hasMCKernel(ComponentAdapter componentAdapter)
+   {
+      try
+      {
+         Class tlu = null;
+         String name = "org.jboss.mc.common.ThreadLocalUtils";
+         try
+         {
+            ClassLoader cl = Thread.currentThread().getContextClassLoader();
+            if (cl != null)
+               tlu = cl.loadClass(name);
+         }
+         catch (ClassNotFoundException ignored)
+         {
+            tlu = Class.forName(name);
+         }
+
+         Method m = tlu.getMethod("getKernel");
+         Object ret = m.invoke(null);
+         return ret != null;
+      }
+      catch (ClassNotFoundException ignored)
+      {
+         log.warn("@InterceptMC not supported in this environment (component: " + componentAdapter.getComponentKey() + ") - necessary classes are missing: ", ignored);
+         return false;
+      }
+      catch (NoSuchMethodException e)
+      {
+         throw new RuntimeException(e);
+      }
+      catch (InvocationTargetException e)
+      {
+         throw new RuntimeException(e);
+      }
+      catch (IllegalAccessException e)
+      {
+         throw new RuntimeException(e);
+      }
+   }
+}

Added: kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCInterceptProxy.java
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCInterceptProxy.java	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCInterceptProxy.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,16 @@
+package org.exoplatform.container.mc;
+
+/**
+ * @author <a href="mailto:mstrukel at redhat.com">Marko Strukelj</a>
+ */
+public class MCInterceptProxy
+{
+   public static final String DELEGATE = "__delegate";
+   private Object __delegate;
+
+   public MCInterceptProxy(Object delegate)
+   {
+      this.__delegate = delegate;
+      System.out.println("MCInterceptProxy<init>  -  CL: " + delegate.getClass().getClassLoader());
+   }
+}

Added: kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/RootContainerVDFDecoratorInjector.java
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/RootContainerVDFDecoratorInjector.java	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/RootContainerVDFDecoratorInjector.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,71 @@
+package org.exoplatform.container.mc;
+
+import java.security.ProtectionDomain;
+
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.CtMethod;
+import javassist.LoaderClassPath;
+import org.jboss.beans.metadata.api.annotations.Inject;
+import org.jboss.classloader.spi.ClassLoaderSystem;
+import org.jboss.kernel.Kernel;
+import org.jboss.kernel.plugins.bootstrap.basic.KernelConstants;
+import org.jboss.util.loading.Translator;
+import org.jboss.mc.common.ThreadLocalUtils;
+
+public class RootContainerVDFDecoratorInjector implements Translator
+{
+   @SuppressWarnings({"UnusedDeclaration"})
+   private Kernel kernel;
+   private ClassLoaderSystem system;
+
+   private static final String RC_CLASSNAME = "org.exoplatform.container.RootContainer";
+   private boolean found;
+
+   public void start()
+   {
+      system.addTranslator(this);
+   }
+
+   public void stop()
+   {
+      system.removeTranslator(this);
+   }
+
+   protected byte[] decorate() throws Exception
+   {
+      ClassPool pool = ClassPool.getDefault();
+      pool.insertClassPath(new LoaderClassPath(Thread.currentThread().getContextClassLoader()));
+      CtClass cc = pool.get(RC_CLASSNAME);
+      CtMethod m = cc.getDeclaredMethod("getInstance");
+      m.insertBefore(ThreadLocalUtils.class.getName() + ".putKernel(kernel);\ntry {\n");
+      m.insertAfter("\n } finally { \n" + ThreadLocalUtils.class.getName() + ".removeKernel();\n }");
+      return cc.toBytecode();
+   }
+
+   public byte[] transform(ClassLoader classLoader, String s, Class<?> aClass, ProtectionDomain protectionDomain, byte[] bytes) throws Exception
+   {
+      if (found == false && RC_CLASSNAME.equals(s))
+      {
+         found = true;
+         return decorate();
+      }
+      return bytes;
+   }
+
+   public void unregisterClassLoader(ClassLoader classLoader)
+   {
+   }
+
+   @Inject(bean = KernelConstants.KERNEL_NAME)
+   public void setKernel(Kernel kernel)
+   {
+      this.kernel = kernel;
+   }
+
+   @Inject
+   public void setSystem(ClassLoaderSystem system)
+   {
+      this.system = system;
+   }
+}

Added: kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/WrapperMethodComposer.java
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/WrapperMethodComposer.java	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/WrapperMethodComposer.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,126 @@
+package org.exoplatform.container.mc;
+
+import javassist.CtClass;
+import javassist.CtMethod;
+import javassist.NotFoundException;
+import javassist.bytecode.AccessFlag;
+
+/**
+ * @author <a href="mailto:mstrukel at redhat.com">Marko Strukelj</a>
+ */
+public class WrapperMethodComposer
+{
+   private String delegate;
+   private String type;
+
+   public WrapperMethodComposer(String delegateFldName, String type)
+   {
+      delegate = delegateFldName;
+      this.type = type;
+   }
+
+   public String composeMethod(CtMethod method) throws NotFoundException
+   {
+      StringBuilder sb = new StringBuilder();
+
+      String next = addModifiers(method.getModifiers());
+      sb.append(next);
+      if (next.length() > 0)
+         sb.append(" ");
+
+      CtClass ret = method.getReturnType();
+      next = addReturnType(ret);
+      sb.append(next).append(" ");
+
+      sb.append(method.getName()).append("(");
+      next = addParams(method.getParameterTypes());
+      sb.append(next);
+      sb.append(") ");
+
+      next = addExceptions(method.getExceptionTypes());
+      sb.append(next);
+      if (next.length() > 0)
+         sb.append(" ");
+
+      sb.append("{ ");
+      sb.append(delegateCall(method.getName(), method.getParameterTypes(), method.getReturnType()));
+      sb.append("}");
+
+      return sb.toString();
+   }
+
+   private String delegateCall(String name, CtClass[] parameterTypes, CtClass returnType)
+   {
+      StringBuilder sb = new StringBuilder();
+      if (returnType != null)
+         sb.append("return ");
+      sb.append("((").append(type).append(")");
+      sb.append(delegate).append(")").append(".").append(name).append("(");
+      for (int i = 0; i < parameterTypes.length; i++)
+      {
+         if (i > 0)
+            sb.append(",");
+         sb.append("a").append(i);
+      }
+      sb.append(");");
+
+      if (returnType == null)
+         sb.append("return;");
+
+      return sb.toString();
+   }
+
+
+   private String addParams(CtClass[] parameterTypes)
+   {
+      if (parameterTypes == null || parameterTypes.length == 0)
+         return "";
+
+      StringBuilder sb = new StringBuilder();
+      for (int i = 0; i < parameterTypes.length; i++)
+      {
+         if (i > 0)
+            sb.append(",");
+         sb.append(parameterTypes[i].getName()).append(" a").append(i);
+      }
+      return sb.toString();
+   }
+
+   private String addExceptions(CtClass[] exceptionTypes)
+   {
+      StringBuilder ret = new StringBuilder();
+      if (exceptionTypes == null || exceptionTypes.length == 0)
+         return "";
+
+      ret.append("throws ");
+      for (int i = 0; i < exceptionTypes.length; i++)
+      {
+         if (i > 0)
+            ret.append(",");
+         ret.append(exceptionTypes[i].getName());
+      }
+      return ret.toString();
+   }
+
+   private String addReturnType(CtClass ret)
+   {
+      if (ret == null)
+         return "void";
+      else
+         return ret.getName();
+   }
+
+   private String addModifiers(int modifiers)
+   {
+      if (AccessFlag.isPackage(modifiers))
+         return "";
+      else if (AccessFlag.isPrivate(modifiers))
+         return "private";
+      else if (AccessFlag.isPublic(modifiers))
+         return "public";
+      else if (AccessFlag.isProtected(modifiers))
+         return "protected";
+      else
+         throw new RuntimeException("Invalid modifiers: " + modifiers);
+   }
+}

Added: kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/util/EnvSpecific.java
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/util/EnvSpecific.java	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/util/EnvSpecific.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,31 @@
+package org.exoplatform.container.util;
+
+import javax.servlet.ServletContext;
+
+/**
+ * This class makes env specific thread context inits when GateIn runs inside JBossAS or MC
+ *
+ * @author <a href="mailto:mstrukel at redhat.com">Marko Strukelj</a>
+ */
+public class EnvSpecific {
+
+   /**
+    * Perform environment specific thread context initialization
+    *
+    * @param ctx ServletContext
+    */
+   public static void initThreadEnv(ServletContext ctx) {
+      if (JBossEnv.isAvailable(ctx))
+         JBossEnv.initThreadEnv(ctx);
+   }
+
+   /**
+    * Perform environment specific thread context cleanup
+    *
+    * @param ctx ServletContext
+    */
+   public static void cleanupThreadEnv(ServletContext ctx) {
+      if (JBossEnv.isAvailable(ctx))
+         JBossEnv.cleanupThreadEnv(ctx);
+   }
+}
\ No newline at end of file

Added: kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/util/JBossEnv.java
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/util/JBossEnv.java	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/util/JBossEnv.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,45 @@
+package org.exoplatform.container.util;
+
+import javax.servlet.ServletContext;
+
+import org.jboss.kernel.plugins.bootstrap.basic.KernelConstants;
+import org.jboss.mc.servlet.vdf.api.VDFThreadLocalUtils;
+
+/**
+ * This class makes env specific thread context inits when GateIn runs inside JBossAS or MC
+ *
+ * @author <a href="mailto:mstrukel at redhat.com">Marko Strukelj</a>
+ */
+public class JBossEnv
+{
+   /**
+    * Check if MC Kernel is available
+    *
+    * @param ctx ServletContext
+    * @return true if we're running within JBoss environment
+    */
+   public static boolean isAvailable(ServletContext ctx)
+   {
+      return ctx.getAttribute(KernelConstants.KERNEL_NAME) != null;
+   }
+
+   /**
+    * Use VDF to grab relevant information from ServletContext and store it in thread context
+    *
+    * @param ctx ServletContext
+    */
+   public static void initThreadEnv(ServletContext ctx)
+   {
+      org.jboss.mc.servlet.vdf.api.VDFThreadLocalUtils.init(ctx);
+   }
+
+   /**
+    * Perform thread context cleanup
+    *
+    * @param ctx ServletContext
+    */
+   public static void cleanupThreadEnv(ServletContext ctx)
+   {
+      org.jboss.mc.servlet.vdf.api.VDFThreadLocalUtils.reset();
+   }
+}
\ No newline at end of file

Modified: kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/web/PortalContainerConfigOwner.java
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/web/PortalContainerConfigOwner.java	2009-11-13 10:51:33 UTC (rev 633)
+++ kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/web/PortalContainerConfigOwner.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -19,6 +19,7 @@
 import org.exoplatform.container.PortalContainer;
 import org.exoplatform.container.RootContainer.PortalContainerPostInitTask;
 import org.exoplatform.container.RootContainer.PortalContainerPreInitTask;
+import org.exoplatform.container.util.EnvSpecific;
 
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
@@ -46,7 +47,17 @@
             portalContainer.registerContext(context);
          }
       };
-      PortalContainer.addInitTask(event.getServletContext(), task);
+
+      ServletContext ctx = event.getServletContext();
+      try
+      {
+         EnvSpecific.initThreadEnv(ctx);
+         PortalContainer.addInitTask(ctx, task);
+      }
+      finally
+      {
+         EnvSpecific.cleanupThreadEnv(ctx);
+      }
    }
 
    public void contextDestroyed(ServletContextEvent event)

Modified: kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/web/PortalContainerCreator.java
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/web/PortalContainerCreator.java	2009-11-13 10:51:33 UTC (rev 633)
+++ kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/web/PortalContainerCreator.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -17,7 +17,9 @@
 package org.exoplatform.container.web;
 
 import org.exoplatform.container.RootContainer;
+import org.exoplatform.container.util.EnvSpecific;
 
+import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
 
@@ -45,7 +47,16 @@
     */
    public void contextInitialized(ServletContextEvent event)
    {
-      RootContainer rootContainer = RootContainer.getInstance();
-      rootContainer.createPortalContainers();
+      ServletContext ctx = event.getServletContext();
+      try
+      {
+         EnvSpecific.initThreadEnv(ctx);
+         RootContainer rootContainer = RootContainer.getInstance();
+         rootContainer.createPortalContainers();
+      }
+      finally
+      {
+         EnvSpecific.cleanupThreadEnv(ctx);
+      }
    }
 }

Added: kernel/branches/mc-int-branch/exo.kernel.demos/custom-pojo/pom.xml
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.demos/custom-pojo/pom.xml	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.demos/custom-pojo/pom.xml	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,16 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+   <modelVersion>4.0.0</modelVersion>
+
+   <parent>
+      <groupId>org.exoplatform.kernel.demos</groupId>
+      <artifactId>exo.kernel.demos</artifactId>
+      <version>2.2.0-Beta03-SNAPSHOT</version>
+   </parent>
+
+   <artifactId>exo.mc-int.custom-pojo</artifactId>
+
+   <name>eXo Kernel Demo - Custom POJO</name>
+   <description>MC Integration Demo - MC Injection of Custom POJO</description>
+
+</project>

Added: kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/pom.xml
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/pom.xml	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/pom.xml	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,27 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+   <modelVersion>4.0.0</modelVersion>
+
+   <parent>
+      <groupId>org.exoplatform.kernel.demos</groupId>
+      <artifactId>exo.kernel.demos</artifactId>
+      <version>2.2.0-Beta03-SNAPSHOT</version>
+   </parent>
+
+   <artifactId>exo.mc-int.mc-injection</artifactId>
+
+   <name>eXo Kernel Demo - MC Injection</name>
+   <description>MC Integration Demo - MC Injection</description>
+
+   <dependencies>
+      <dependency>
+         <groupId>org.exoplatform.kernel</groupId>
+         <artifactId>exo.kernel.container</artifactId> 
+      </dependency>
+      <dependency>
+         <groupId>org.jboss.microcontainer</groupId>
+         <artifactId>jboss-kernel</artifactId>
+      </dependency>
+   </dependencies>
+    
+</project>

Added: kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/InjectedBean.java
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/InjectedBean.java	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/InjectedBean.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,31 @@
+package org.exoplatform.kernel.demos.mc;
+
+import org.jboss.logging.Logger;
+
+/**
+ * @author <a href="mailto:mstrukel at redhat.com">Marko Strukelj</a>
+ */
+public class InjectedBean
+{
+   private static final Logger log = Logger.getLogger(InjectedBean.class);
+
+   //static
+   //{
+   //   System.out.println("InjectedBean class loaded !!!");
+   //}
+
+   public InjectedBean()
+   {
+      log.info("InjectedBean instantiated :: " + this);
+   }
+
+   public String getSomeString()
+   {
+      return "[This is some property value]";
+   }
+
+   public void start()
+   {
+      log.info("Method start() called on InjectedBean");
+   }
+}

Added: kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/InjectingBean.java
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/InjectingBean.java	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/InjectingBean.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,102 @@
+package org.exoplatform.kernel.demos.mc;
+
+import org.exoplatform.container.mc.InterceptMC;
+import org.jboss.beans.metadata.api.annotations.EntryValue;
+import org.jboss.beans.metadata.api.annotations.Inject;
+import org.jboss.beans.metadata.api.annotations.MapValue;
+import org.jboss.beans.metadata.api.annotations.StringValue;
+import org.jboss.beans.metadata.api.annotations.Value;
+import org.jboss.kernel.plugins.bootstrap.basic.KernelConstants;
+import org.jboss.kernel.spi.config.KernelConfigurator;
+import org.jboss.logging.Logger;
+
+import java.util.Map;
+
+/**
+ * If we want our class to be instantiated at deploy time,
+ * it has to implement org.picocontainer.Startable, otherwise it will only
+ * be registered, but not instantiated. MC integration takes place
+ * at instantiation time.
+ *
+ * @author <a href="mailto:mstrukel at redhat.com">Marko Strukelj</a>
+ */
+ at InterceptMC
+public class InjectingBean implements org.picocontainer.Startable
+{
+   private static final Logger log = Logger.getLogger(InjectingBean.class);
+
+   private InjectedBean bean1;
+   private KernelConfigurator configurator;
+
+   @Inject(bean = "InjectedBean")
+   private InjectedBean injectedBean;
+
+
+   public InjectingBean()
+   {
+      log.info("Injecting bean instantiated");
+   }
+
+   @Inject
+   public void setBean(InjectedBean bean)
+   {
+      this.bean1 = bean;
+      log.info("Received InjectedBean: " + bean);
+   }
+
+   @Inject(bean = KernelConstants.KERNEL_CONFIGURATOR_NAME)
+   public void setConfigurator(KernelConfigurator configurator)
+   {
+      this.configurator = configurator;
+      log.info("InjectingBean Received KernelConfigurator: " + configurator);
+   }
+
+   @MapValue(
+         value = {
+               @EntryValue(
+                     key = @Value(type = Class.class, string = @StringValue(value = "org.jboss.dependency.spi.Controller", type = Class.class)),
+                     value = @Value(inject = @Inject(bean = KernelConstants.KERNEL_CONTROLLER_NAME))
+               ),
+               @EntryValue(
+                     key = @Value(type = Class.class, string = @StringValue(value = "org.jboss.kernel.Kernel", type = Class.class)),
+                     value = @Value(inject = @Inject(bean = KernelConstants.KERNEL_NAME))
+               ),
+               @EntryValue(
+                     key = @Value(type = Class.class, string = @StringValue(value = "org.jboss.kernel.spi.dependency.KernelController", type = Class.class)),
+                     value = @Value(inject = @Inject(bean = KernelConstants.KERNEL_CONTROLLER_NAME))
+               ),
+               @EntryValue(
+                     key = @Value(type = Class.class, string = @StringValue(value = "org.jboss.kernel.spi.registry.KernelBus", type = Class.class)),
+                     value = @Value(inject = @Inject(bean = KernelConstants.KERNEL_BUS_NAME))
+               ),
+               @EntryValue(
+                     key = @Value(type = Class.class, string = @StringValue(value = "org.jboss.kernel.spi.registry.KernelRegistry", type = Class.class)),
+                     value = @Value(inject = @Inject(bean = KernelConstants.KERNEL_REGISTRY_NAME))
+               ),
+               @EntryValue(
+                     key = @Value(type = Class.class, string = @StringValue(value = "org.jboss.kernel.spi.config.KernelConfigurator", type = Class.class)),
+                     value = @Value(inject = @Inject(bean = KernelConstants.KERNEL_CONFIGURATOR_NAME))
+               )
+         }
+   )
+   public void setBindings(Map<Class<?>, Object> bindings)
+   {
+      log.info("Received a map with bindings: " + bindings);
+   }
+
+   @Inject(bean = "InjectedBean", property = "someString")
+   public void setSomeStringProperty(String value)
+   {
+      log.info("Received SomeStringProperty value: " + value);
+   }
+
+   public void start()
+   {
+      log.warn("start() called (injectedBean is set to: " + injectedBean + ")");
+   }
+
+   public void stop()
+   {
+      log.info("stop() called");
+   }
+}

Added: kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/META-INF/jboss-beans.xml
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/META-INF/jboss-beans.xml	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/META-INF/jboss-beans.xml	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,3 @@
+<deployment xmlns="urn:jboss:bean-deployer:2.0">
+    <bean name="InjectedBean" class="org.exoplatform.kernel.demos.mc.InjectedBean" />
+</deployment>
\ No newline at end of file

Added: kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/conf/configuration.xml
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/conf/configuration.xml	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/conf/configuration.xml	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<configuration
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://www.exoplaform.org/xml/ns/kernel_1_0.xsd http://www.exoplaform.org/xml/ns/kernel_1_0.xsd"
+   xmlns="http://www.exoplaform.org/xml/ns/kernel_1_0.xsd">
+
+  <component>
+    <key>InjectingBean</key>
+    <type>org.exoplatform.kernel.demos.mc.InjectingBean</type>
+  </component>    
+
+</configuration>

Added: kernel/branches/mc-int-branch/exo.kernel.demos/pom.xml
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.demos/pom.xml	                        (rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.demos/pom.xml	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,21 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+   <modelVersion>4.0.0</modelVersion>
+
+   <parent>
+      <groupId>org.exoplatform.kernel</groupId>
+      <artifactId>kernel-parent</artifactId>
+      <version>2.2.0-Beta03-SNAPSHOT</version>
+   </parent>
+
+   <groupId>org.exoplatform.kernel.demos</groupId>
+   <artifactId>exo.kernel.demos</artifactId>
+   <packaging>pom</packaging>
+
+   <name>eXo Kernel Demos</name>
+
+   <modules>
+      <module>mc-injection</module>
+   </modules>
+
+</project>

Added: kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/pom.xml
===================================================================
--- kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/pom.xml	                        (rev 0)
+++ kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/pom.xml	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,58 @@
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+   <modelVersion>4.0.0</modelVersion>
+
+   <parent>
+      <groupId>org.exoplatform.kernel</groupId>
+      <artifactId>kernel-parent</artifactId>
+      <version>2.2.0-Beta03-SNAPSHOT</version>
+   </parent>
+
+   <artifactId>mc-kernel-extras</artifactId>
+   <version>1.0.0-SNAPSHOT</version>
+
+   <name>MC Kernel 2.2.0 Selected Classes</name>
+   <description>MC integration classes that aren't available in mc-kernel 2.0.6.GA</description>
+   
+   <!--build>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>2.0.2</version>
+          <configuration>
+            <source>1.5</source>
+            <target>1.5</target>
+            <showDeprecation>true</showDeprecation>
+            <showWarnings>true</showWarnings>
+            <optimize>true</optimize>
+          </configuration>
+        </plugin>
+
+        <plugin>
+          <artifactId>maven-source-plugin</artifactId>
+          <version>2.1</version>
+          <executions>
+            <execution>
+              <id>attach-sources</id>
+              <goals>
+                <goal>jar-no-fork</goal>
+              </goals>
+            </execution>
+          </executions>
+          <inherited>true</inherited>
+          <configuration>
+            <includePom>true</includePom>
+          </configuration>
+        </plugin>
+      </plugins>
+   </build-->
+
+   <dependencies>
+      <dependency>
+            <groupId>org.jboss.microcontainer</groupId>
+            <artifactId>jboss-kernel</artifactId>
+      </dependency>
+   </dependencies>
+</project>

Added: kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/src/main/java/org/jboss/dependency/plugins/helpers/StatelessController.java
===================================================================
--- kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/src/main/java/org/jboss/dependency/plugins/helpers/StatelessController.java	                        (rev 0)
+++ kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/src/main/java/org/jboss/dependency/plugins/helpers/StatelessController.java	2009-11-13 11:16:31 UTC (rev 634)
@@ -0,0 +1,167 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.dependency.plugins.helpers;
+
+import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.dependency.spi.Controller;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.dependency.plugins.AbstractController;
+import org.jboss.kernel.Kernel;
+import org.jboss.kernel.spi.dependency.KernelController;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.kernel.spi.event.KernelEvent;
+import org.jboss.kernel.spi.event.KernelEventFilter;
+import org.jboss.kernel.spi.event.KernelEventListener;
+
+import java.util.Set;
+
+/**
+ * Stateless controller.
+ *
+ * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ */
+public class StatelessController extends AbstractController implements KernelController
+{
+   private KernelController controller;
+
+   public StatelessController(KernelController controller)
+   {
+      if (controller == null)
+         throw new IllegalArgumentException("Null controller");
+
+      this.controller = controller;
+      for (ControllerState state : controller.getStates())
+         addState(state, null);
+   }
+
+   public void enableOnDemand(ControllerContext context) throws Throwable
+   {
+      // ignore
+   }
+
+   @Override
+   protected void registerControllerContext(ControllerContext context)
+   {
+      // do nothing
+   }
+
+   @Override
+   public void install(ControllerContext context) throws Throwable
+   {
+      super.install(context);
+   }
+
+   public ControllerContext uninstall(Object name)
+   {
+      return null;
+   }
+
+   public ControllerContext getContext(Object name, ControllerState state)
+   {
+      return controller.getContext(name, state);
+   }
+
+   public ControllerContext getInstalledContext(Object name)
+   {
+      return controller.getInstalledContext(name);
+   }
+
+   public boolean isShutdown()
+   {
+      return controller.isShutdown();
+   }
+
+   public void shutdown()
+   {
+   }
+
+   public Kernel getKernel()
+   {
+      return controller.getKernel();
+   }
+
+   public void setKernel(Kernel kernel) throws Throwable
+   {
+      controller.setKernel(kernel);
+   }
+
+   public KernelControllerContext install(BeanMetaData metaData) throws Throwable
+   {
+      return controller.install(metaData);
+   }
+
+   public KernelControllerContext install(BeanMetaData metaData, Object target) throws Throwable
+   {
+      return controller.install(metaData, target);
+   }
+
+   public void addSupplies(KernelControllerContext context)
+   {
+      controller.addSupplies(context);
+   }
+
+   public void removeSupplies(KernelControllerContext context)
+   {
+      controller.removeSupplies(context);
+   }
+
+   public Set<KernelControllerContext> getInstantiatedContexts(Class<?> clazz)
+   {
+      return controller.getInstantiatedContexts(clazz);
+   }
+
+   public Set<KernelControllerContext> getContexts(Class<?> clazz, ControllerState state)
+   {
+      return controller.getContexts(clazz, state);
+   }
+
+   public KernelControllerContext getContextByClass(Class<?> clazz)
+   {
+      return controller.getContextByClass(clazz);
+   }
+
+   public void addInstantiatedContext(KernelControllerContext context)
+   {
+      controller.addInstantiatedContext(context);
+   }
+
+   public void removeInstantiatedContext(KernelControllerContext context)
+   {
+      controller.removeInstantiatedContext(context);
+   }
+
+   public void registerListener(KernelEventListener listener, KernelEventFilter filter, Object handback) throws Throwable
+   {
+      controller.registerListener(listener, filter, handback);
+   }
+
+   public void unregisterListener(KernelEventListener listener, KernelEventFilter filter, Object handback) throws Throwable
+   {
+      controller.unregisterListener(listener, filter, handback);
+   }
+
+   public void fireKernelEvent(KernelEvent event)
+   {
+      controller.fireKernelEvent(event);
+   }
+}
\ No newline at end of file

Modified: kernel/branches/mc-int-branch/pom.xml
===================================================================
--- kernel/branches/mc-int-branch/pom.xml	2009-11-13 10:51:33 UTC (rev 633)
+++ kernel/branches/mc-int-branch/pom.xml	2009-11-13 11:16:31 UTC (rev 634)
@@ -38,6 +38,9 @@
    <properties>
       <exo.product.name>exo-kernel</exo.product.name>
       <exo.product.specification>2.2</exo.product.specification>
+      <org.jboss.mc>2.0.6.GA</org.jboss.mc>
+      <org.jboss.mc-int>2.2.0-SNAPSHOT</org.jboss.mc-int>
+      <version.jboss.classloader>2.0.7.GA</version.jboss.classloader>
       <forkMode>always</forkMode>
    </properties>
 
@@ -54,6 +57,8 @@
       <module>exo.kernel.component.remote</module>
       <module>exo.kernel.component.cache</module>
       <module>exo.kernel.component.command</module>
+      <module>exo.kernel.demos</module>
+      <module>org.jboss.mc-kernel-extras</module>
       <module>packaging/module</module>
    </modules>
 
@@ -85,6 +90,12 @@
          </dependency>
 
          <dependency>
+            <groupId>org.exoplatform.kernel</groupId>
+            <artifactId>mc-kernel-extras</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+         </dependency>
+
+         <dependency>
             <groupId>org.exoplatform.tool</groupId>
             <artifactId>exo.tool.framework.junit</artifactId>
             <version>1.2.0</version>
@@ -210,6 +221,43 @@
             <artifactId>jta</artifactId>
             <version>1.0.1B</version>
          </dependency>
+
+         <dependency>
+            <groupId>org.jboss.microcontainer</groupId>
+            <artifactId>jboss-dependency</artifactId>
+            <version>${org.jboss.mc}</version>
+         </dependency>
+
+         <dependency>
+            <groupId>org.jboss.microcontainer</groupId>
+            <artifactId>jboss-kernel</artifactId>
+            <version>${org.jboss.mc}</version>
+         </dependency>
+
+         <dependency>
+            <groupId>org.jboss.microcontainer</groupId>
+            <artifactId>jboss-aop-mc-int</artifactId>
+            <version>${org.jboss.mc}</version>
+         </dependency>
+
+         <dependency>
+            <groupId>org.jboss.mc-int</groupId>
+            <artifactId>jboss-mc-int-common</artifactId>
+            <version>${org.jboss.mc-int}</version>
+         </dependency>
+
+         <dependency>
+            <groupId>org.jboss.mc-int</groupId>
+            <artifactId>jboss-mc-int-servlet</artifactId>
+            <version>${org.jboss.mc-int}</version>
+         </dependency>
+
+        <dependency>
+          <groupId>org.jboss.cl</groupId>
+          <artifactId>jboss-classloader</artifactId>
+          <version>${version.jboss.classloader}</version>
+        </dependency>
+
       </dependencies>
    </dependencyManagement>
 



More information about the exo-jcr-commits mailing list