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@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@redhat.com">Ales Justin</a>
+ * @author <a href="mailto:mstrukel@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@redhat.com">Marko Strukelj</a>
+ * @author <a href="mailto:ales.justin@redhat.com">Ales Justin</a>
+ */
+(a)Retention(RetentionPolicy.RUNTIME)
+(a)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@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@redhat.com">Ales Justin</a>
+ * @author <a href="mailto:mstrukel@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@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@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@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@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@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@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@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@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@redhat.com">Marko Strukelj</a>
+ */
+@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(a)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>