Author: mstruk
Date: 2009-11-27 18:21:52 -0500 (Fri, 27 Nov 2009)
New Revision: 902
Added:
kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegrationInvoker.java
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/AOPInterceptor.java
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/MissingNoArgsConstructorBean.java
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/PrivateNoArgsConstructorBean.java
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/ProtectedNoArgsConstructorBean.java
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/conf/mc-beans.xml
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/conf/mc-int-beans.xml
kernel/branches/mc-int-branch/exo.kernel.mc-int/
kernel/branches/mc-int-branch/exo.kernel.mc-int/pom.xml
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/GenericWrapperUtil.java
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/InterceptMC.java
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/JavassistAOPClassLoader.java
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCComponentAdapter.java
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCComponentInfo.java
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCInjectionMode.java
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCIntConfig.java
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCIntegrationImpl.java
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCInterceptProxy.java
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/RootContainerVDFDecoratorInjector.java
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/WrapperMethodComposer.java
kernel/branches/mc-int-branch/exo.kernel.mc-kernel-extras/
kernel/branches/mc-int-branch/exo.kernel.tests/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/pom.xml
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest.java
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest2.java
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest3.java
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest4.java
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest5.java
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/tests/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/tests/JUnitInvokerServlet.java
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/tests/LogOutputStream.java
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/tests/TeeOutputStream.java
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/webapp/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/webapp/WEB-INF/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/webapp/WEB-INF/web.xml
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/CopiedException.java
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/FailuresParser.java
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/LineReader.java
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration.java
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration2.java
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration3.java
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration4.java
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration5.java
kernel/branches/mc-int-branch/exo.kernel.tests/pom.xml
Removed:
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/MCInjectionMode.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/WrapperMethodComposer.java
kernel/branches/mc-int-branch/exo.kernel.mc-kernel-extras/pom.xml
kernel/branches/mc-int-branch/exo.kernel.mc-kernel-extras/src/
kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/
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/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/util/JBossEnv.java
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/pom.xml
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/META-INF/jboss-beans.xml
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/pom.xml
Log:
Removed mc-kernel artifact dependencies from exo.kernel.container - moved integration impl
code to exo.kernel.mc-int module, AOP demo, integration tests
Modified: kernel/branches/mc-int-branch/exo.kernel.container/pom.xml
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.container/pom.xml 2009-11-27 11:53:44 UTC
(rev 901)
+++ kernel/branches/mc-int-branch/exo.kernel.container/pom.xml 2009-11-27 23:21:52 UTC
(rev 902)
@@ -86,32 +86,7 @@
<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>
Deleted:
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 2009-11-27
11:53:44 UTC (rev 901)
+++
kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/GenericWrapperUtil.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -1,165 +0,0 @@
-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
Deleted:
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 2009-11-27
11:53:44 UTC (rev 901)
+++
kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/InterceptMC.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -1,31 +0,0 @@
-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;
-
- /**
- * Injection mode
- *
- * @return MCInjectionMode enumeration constant representing injection mode
- */
- MCInjectionMode injectionMode() default MCInjectionMode.STANDARD;
-}
Deleted:
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 2009-11-27
11:53:44 UTC (rev 901)
+++
kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/JavassistAOPClassLoader.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -1,61 +0,0 @@
-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;
- }
- }
-}
Deleted:
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 2009-11-27
11:53:44 UTC (rev 901)
+++
kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCComponentAdapter.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -1,142 +0,0 @@
-package org.exoplatform.container.mc;
-
-import java.lang.ref.WeakReference;
-
-import org.jboss.beans.info.spi.BeanAccessMode;
-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();
- builder.setAccessMode(getInjectionMode(interceptMC));
-
- 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);
- }
- }
-
- private BeanAccessMode getInjectionMode(InterceptMC interceptMC)
- {
- MCInjectionMode mode = interceptMC.injectionMode();
-
- switch(mode)
- {
- case ALL:
- return BeanAccessMode.ALL;
- case FIELDS:
- return BeanAccessMode.FIELDS;
- default:
- return BeanAccessMode.STANDARD;
- }
- }
-
- 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
Deleted:
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 2009-11-27
11:53:44 UTC (rev 901)
+++
kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCComponentInfo.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -1,26 +0,0 @@
-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;
- }
-}
Deleted:
kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCInjectionMode.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCInjectionMode.java 2009-11-27
11:53:44 UTC (rev 901)
+++
kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCInjectionMode.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -1,16 +0,0 @@
-package org.exoplatform.container.mc;
-
-/**
- * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
- */
-public enum MCInjectionMode
-{
- /** Field and method injections */
- ALL,
-
- /** Disable field injections (default) */
- FIELDS,
-
- /** Try setter injection first, if no setter found, fallback to field */
- STANDARD
-}
Modified:
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 2009-11-27
11:53:44 UTC (rev 901)
+++
kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegration.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -1,95 +1,16 @@
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;
+import javax.servlet.ServletContext;
/**
* @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
*/
-public class MCIntegration
+public interface 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;
- }
+ ComponentAdapter getMCAdapter(ComponentAdapter componentAdapter);
+ boolean hasMCKernel(ComponentAdapter adapter);
+ void initThreadCtx(ServletContext ctx);
+ void resetThreadCtx(ServletContext ctx);
}
Modified:
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 2009-11-27
11:53:44 UTC (rev 901)
+++
kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegrationContainer.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -7,9 +7,6 @@
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>
*/
@@ -38,17 +35,20 @@
public ComponentAdapter registerComponent(ComponentAdapter componentAdapter)
{
- Class<?> clazz = componentAdapter.getComponentImplementation();
- InterceptMC interceptAnnotation = clazz.getAnnotation(InterceptMC.class);
-
ComponentAdapter adapter = componentAdapter;
- if (interceptAnnotation != null)
+ if (hasMCKernel(componentAdapter))
{
- if (hasMCKernel(componentAdapter))
+ try
{
- adapter = MCIntegration.getInstance().getMCAdapter(componentAdapter,
interceptAnnotation);
+ adapter = MCIntegrationInvoker.getMCAdapter(componentAdapter);
}
+ catch(Exception ignored)
+ {
+ log.warn("MC integration failed - maybe not supported in this
environment (component: "
+ + componentAdapter.getComponentKey() + ")", ignored);
+ }
}
+
super.registerComponent(adapter);
return adapter;
}
@@ -57,39 +57,13 @@
{
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;
+ return MCIntegrationInvoker.hasMCKernel(componentAdapter);
}
- catch (ClassNotFoundException ignored)
+ catch (Exception ignored)
{
- log.warn("@InterceptMC not supported in this environment (component: "
+ componentAdapter.getComponentKey() + ") - necessary classes are missing: " +
ignored);
- return false;
+ log.warn("MC integration failed - maybe not supported in this environment
(component: "
+ + componentAdapter.getComponentKey() + ")", ignored);
}
- catch (NoSuchMethodException e)
- {
- throw new RuntimeException(e);
- }
- catch (InvocationTargetException e)
- {
- throw new RuntimeException(e);
- }
- catch (IllegalAccessException e)
- {
- throw new RuntimeException(e);
- }
+ return false;
}
}
Added:
kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegrationInvoker.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegrationInvoker.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegrationInvoker.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,106 @@
+package org.exoplatform.container.mc;
+
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.picocontainer.ComponentAdapter;
+
+import javax.servlet.ServletContext;
+import java.lang.reflect.Method;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class MCIntegrationInvoker
+{
+ private static Log log = ExoLogger.getLogger(MCIntegrationInvoker.class);
+
+ private static MCIntegration mcInt;
+ private static boolean permFailure;
+
+ public static synchronized ComponentAdapter getMCAdapter(ComponentAdapter
componentAdapter)
+ {
+ MCIntegration mcInt = getMCIntegration();
+ if (mcInt == null)
+ {
+ return componentAdapter;
+ }
+
+ return mcInt.getMCAdapter(componentAdapter);
+ }
+
+ public static synchronized boolean hasMCKernel(ComponentAdapter adapter)
+ {
+ MCIntegration mcInt = getMCIntegration();
+ if (mcInt == null)
+ {
+ return false;
+ }
+ return mcInt.hasMCKernel(adapter);
+ }
+
+ public static synchronized void initThreadCtx(ServletContext ctx)
+ {
+ MCIntegration mcInt = getMCIntegration();
+ if (mcInt == null)
+ {
+ return;
+ }
+ mcInt.initThreadCtx(ctx);
+ }
+
+ public static synchronized void resetThreadCtx(ServletContext ctx)
+ {
+ MCIntegration mcInt = getMCIntegration();
+ if (mcInt == null)
+ {
+ return;
+ }
+ mcInt.resetThreadCtx(ctx);
+ }
+
+ private static MCIntegration getMCIntegration()
+ {
+ if (mcInt == null && permFailure == false)
+ {
+ Class clazz = null;
+ try
+ {
+ clazz =
loadClass("org.exoplatform.container.mc.impl.MCIntegrationImpl");
+ Method m = clazz.getMethod("getInstance");
+ mcInt = (MCIntegration) m.invoke(null);
+ }
+ catch (ClassNotFoundException ignored)
+ {
+ permFailure = true;
+ log.info("MC integration not available in this environment (missing
class: "
+ + ignored.getMessage() + ")");
+
+ return null;
+ }
+ catch (Exception e)
+ {
+ permFailure = true;
+ throw new RuntimeException("MC Integration initialization error",
e);
+ }
+ }
+ return mcInt;
+ }
+
+ static Class loadClass(String name) throws ClassNotFoundException
+ {
+ Class clazz = null;
+ try
+ {
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ if (cl != null)
+ {
+ clazz = cl.loadClass(name);
+ }
+ }
+ catch (ClassNotFoundException ignored)
+ {
+ clazz = Class.forName(name);
+ }
+ return clazz;
+ }
+}
Deleted:
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 2009-11-27
11:53:44 UTC (rev 901)
+++
kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCInterceptProxy.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -1,16 +0,0 @@
-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());
- }
-}
Deleted:
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 2009-11-27
11:53:44 UTC (rev 901)
+++
kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/mc/WrapperMethodComposer.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -1,126 +0,0 @@
-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);
- }
-}
Modified:
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 2009-11-27
11:53:44 UTC (rev 901)
+++
kernel/branches/mc-int-branch/exo.kernel.container/src/main/java/org/exoplatform/container/util/JBossEnv.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -1,10 +1,8 @@
package org.exoplatform.container.util;
import javax.servlet.ServletContext;
+import org.exoplatform.container.mc.MCIntegrationInvoker;
-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
*
@@ -12,6 +10,9 @@
*/
public class JBossEnv
{
+ /** This value is equal to
org.jboss.kernel.plugins.bootstrap.basic.KernelConstants.KERNEL_NAME */
+ private static final String MC_KERNEL_NAME = "jboss.kernel:service=Kernel";
+
/**
* Check if MC Kernel is available
*
@@ -20,7 +21,7 @@
*/
public static boolean isAvailable(ServletContext ctx)
{
- return ctx.getAttribute(KernelConstants.KERNEL_NAME) != null;
+ return ctx.getAttribute(MC_KERNEL_NAME) != null;
}
/**
@@ -30,7 +31,7 @@
*/
public static void initThreadEnv(ServletContext ctx)
{
- org.jboss.mc.servlet.vdf.api.VDFThreadLocalUtils.init(ctx);
+ MCIntegrationInvoker.initThreadCtx(ctx);
}
/**
@@ -40,6 +41,6 @@
*/
public static void cleanupThreadEnv(ServletContext ctx)
{
- org.jboss.mc.servlet.vdf.api.VDFThreadLocalUtils.reset();
+ MCIntegrationInvoker.resetThreadCtx(ctx);
}
}
\ No newline at end of file
Modified: kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/pom.xml
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/pom.xml 2009-11-27
11:53:44 UTC (rev 901)
+++ kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/pom.xml 2009-11-27
23:21:52 UTC (rev 902)
@@ -4,19 +4,23 @@
<parent>
<groupId>org.exoplatform.kernel.demos</groupId>
- <artifactId>exo.kernel.demos</artifactId>
+ <artifactId>demos-parent</artifactId>
<version>2.2.0-Beta04-SNAPSHOT</version>
</parent>
- <artifactId>exo.mc-int.mc-injection</artifactId>
+ <artifactId>exo.kernel.demos.mc-injection</artifactId>
- <name>eXo Kernel Demo - MC Injection</name>
+ <name>eXo Kernel :: Demos :: MC Injection</name>
<description>MC Integration Demo - MC Injection</description>
<dependencies>
<dependency>
+ <groupId>picocontainer</groupId>
+ <artifactId>picocontainer</artifactId>
+ </dependency>
+ <dependency>
<groupId>org.exoplatform.kernel</groupId>
- <artifactId>exo.kernel.container</artifactId>
+ <artifactId>exo.kernel.mc-int</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.microcontainer</groupId>
Added:
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/AOPInterceptor.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/AOPInterceptor.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/AOPInterceptor.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,52 @@
+package org.exoplatform.kernel.demos.mc;
+
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.jboss.aop.advice.Interceptor;
+import org.jboss.aop.joinpoint.Invocation;
+import org.jboss.aop.proxy.container.ContainerProxyMethodInvocation;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class AOPInterceptor implements Interceptor
+{
+ private static Log log = ExoLogger.getLogger(AOPInterceptor.class);
+ private static LinkedList<Invocation> invocations = new
LinkedList<Invocation>();
+
+ public String getName()
+ {
+ return getClass().getName();
+ }
+
+ public Object invoke(Invocation invocation) throws Throwable
+ {
+ StringBuilder sb = new StringBuilder();
+ if (invocation instanceof ContainerProxyMethodInvocation)
+ {
+ ContainerProxyMethodInvocation methodInvocation =
(ContainerProxyMethodInvocation) invocation;
+ sb.append("Method: " + methodInvocation.getActualMethod().getName());
+ sb.append(", Args:\n");
+ Object[] args = methodInvocation.getArguments();
+ for (int i = 0; i < args.length; i++)
+ {
+ sb.append(" " + i + ") " + args[i] + "\n");
+ }
+ }
+ else
+ {
+ sb.append(invocation);
+ }
+ log.info("Interceptor: " + this + ", Target object: " +
invocation.getTargetObject() + ", " + sb);
+ invocations.add(invocation);
+ return invocation.invokeNext();
+ }
+
+ public static List<Invocation> getInvocations()
+ {
+ return invocations;
+ }
+}
Modified:
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 2009-11-27
11:53:44 UTC (rev 901)
+++
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/InjectedBean.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -1,14 +1,17 @@
package org.exoplatform.kernel.demos.mc;
-import org.jboss.logging.Logger;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
/**
* @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
*/
public class InjectedBean
{
- private static final Logger log = Logger.getLogger(InjectedBean.class);
+ private static final Log log = ExoLogger.getLogger(InjectedBean.class);
+ public static final String SOME_PROPERTY_VALUE = "[This is some property
value]";
+
//static
//{
// System.out.println("InjectedBean class loaded !!!");
@@ -21,7 +24,7 @@
public String getSomeString()
{
- return "[This is some property value]";
+ return SOME_PROPERTY_VALUE;
}
public void start()
Modified:
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 2009-11-27
11:53:44 UTC (rev 901)
+++
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/InjectingBean.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -1,7 +1,9 @@
package org.exoplatform.kernel.demos.mc;
-import org.exoplatform.container.mc.InterceptMC;
-import org.exoplatform.container.mc.MCInjectionMode;
+import org.exoplatform.container.mc.impl.InterceptMC;
+import org.exoplatform.container.mc.impl.MCInjectionMode;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
import org.jboss.beans.metadata.api.annotations.EntryValue;
import org.jboss.beans.metadata.api.annotations.Inject;
import org.jboss.beans.metadata.api.annotations.MapValue;
@@ -9,7 +11,6 @@
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;
@@ -22,31 +23,44 @@
* @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
*/
// Enable field injection by setting injectionMode
-@InterceptMC(injectionMode= MCInjectionMode.ALL)
+@InterceptMC(injectionMode = MCInjectionMode.ALL)
public class InjectingBean implements org.picocontainer.Startable
{
- private static final Logger log = Logger.getLogger(InjectingBean.class);
+ private static final Log log = ExoLogger.getLogger(InjectingBean.class);
- private InjectedBean bean1;
+ private InjectedBean bean;
private KernelConfigurator configurator;
// Avoid using field injection, it's an anti-pattern
@Inject(bean = "InjectedBean")
private InjectedBean injectedBean;
+ private Map bindingsMap;
+ private String stringValue;
+ private boolean started;
public InjectingBean()
{
log.info("Injecting bean instantiated");
}
+ public InjectedBean getBean()
+ {
+ return bean;
+ }
+
@Inject
public void setBean(InjectedBean bean)
{
- this.bean1 = bean;
+ this.bean = bean;
log.info("Received InjectedBean: " + bean);
}
+ public KernelConfigurator getConfigurator()
+ {
+ return configurator;
+ }
+
@Inject(bean = KernelConstants.KERNEL_CONFIGURATOR_NAME)
public void setConfigurator(KernelConfigurator configurator)
{
@@ -54,6 +68,11 @@
log.info("InjectingBean Received KernelConfigurator: " + configurator);
}
+ public Map getBindings()
+ {
+ return bindingsMap;
+ }
+
@MapValue(
value = {
@EntryValue(
@@ -85,21 +104,39 @@
public void setBindings(Map<Class<?>, Object> bindings)
{
log.info("Received a map with bindings: " + bindings);
+ this.bindingsMap = bindings;
}
+ public String getSomeStringProperty()
+ {
+ return stringValue;
+ }
+
@Inject(bean = "InjectedBean", property = "someString")
public void setSomeStringProperty(String value)
{
log.info("Received SomeStringProperty value: " + value);
+ this.stringValue = value;
}
public void start()
{
log.warn("start() called (injectedBean is set to: " + injectedBean +
")");
+ this.started = true;
}
public void stop()
{
log.info("stop() called");
}
+
+ public InjectedBean getInjectedBean()
+ {
+ return injectedBean;
+ }
+
+ public boolean isStarted()
+ {
+ return started;
+ }
}
Added:
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/MissingNoArgsConstructorBean.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/MissingNoArgsConstructorBean.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/MissingNoArgsConstructorBean.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,42 @@
+package org.exoplatform.kernel.demos.mc;
+
+import org.exoplatform.container.xml.InitParams;
+import org.exoplatform.container.xml.ValueParam;
+import org.picocontainer.Startable;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class MissingNoArgsConstructorBean implements Startable
+{
+ private String name;
+ private boolean started;
+
+ public MissingNoArgsConstructorBean(InitParams params)
+ {
+ if (params == null)
+ {
+ return;
+ }
+ ValueParam val = params.getValueParam("name");
+ if (val != null)
+ {
+ name = val.getValue();
+ }
+ }
+
+ public String method01()
+ {
+ return "method01";
+ }
+
+ public void start()
+ {
+ started = true;
+ }
+
+ public void stop()
+ {
+ started = false;
+ }
+}
Added:
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/PrivateNoArgsConstructorBean.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/PrivateNoArgsConstructorBean.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/PrivateNoArgsConstructorBean.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,38 @@
+package org.exoplatform.kernel.demos.mc;
+
+import org.exoplatform.container.xml.InitParams;
+import org.jboss.beans.metadata.api.annotations.Inject;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class PrivateNoArgsConstructorBean extends MissingNoArgsConstructorBean
+{
+ private InjectedBean injectedBean;
+
+ private PrivateNoArgsConstructorBean()
+ {
+ super(null);
+ }
+
+ public PrivateNoArgsConstructorBean(InitParams params)
+ {
+ super(params);
+ }
+
+ public String method12()
+ {
+ return "method12";
+ }
+
+ @Inject
+ public void setInjectedBean(InjectedBean bean)
+ {
+ this.injectedBean = bean;
+ }
+
+ public InjectedBean getInjectedBean()
+ {
+ return injectedBean;
+ }
+}
Added:
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/ProtectedNoArgsConstructorBean.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/ProtectedNoArgsConstructorBean.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/java/org/exoplatform/kernel/demos/mc/ProtectedNoArgsConstructorBean.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,38 @@
+package org.exoplatform.kernel.demos.mc;
+
+import org.exoplatform.container.xml.InitParams;
+import org.jboss.beans.metadata.api.annotations.Inject;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class ProtectedNoArgsConstructorBean extends MissingNoArgsConstructorBean
+{
+ private InjectedBean injectedBean;
+
+ protected ProtectedNoArgsConstructorBean()
+ {
+ super(null);
+ }
+
+ public ProtectedNoArgsConstructorBean(InitParams params)
+ {
+ super(params);
+ }
+
+ public String method11()
+ {
+ return "method11";
+ }
+
+ @Inject
+ public void setInjectedBean(InjectedBean bean)
+ {
+ this.injectedBean = bean;
+ }
+
+ public InjectedBean getInjectedBean()
+ {
+ return injectedBean;
+ }
+}
Modified:
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 2009-11-27
11:53:44 UTC (rev 901)
+++
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/META-INF/jboss-beans.xml 2009-11-27
23:21:52 UTC (rev 902)
@@ -1,3 +1,3 @@
<deployment xmlns="urn:jboss:bean-deployer:2.0">
- <bean name="InjectedBean"
class="org.exoplatform.kernel.demos.mc.InjectedBean" />
+ <bean name="InjectedBean"
class="org.exoplatform.kernel.demos.mc.InjectedBean"/>
</deployment>
\ No newline at end of file
Modified:
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 2009-11-27
11:53:44 UTC (rev 901)
+++
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/conf/configuration.xml 2009-11-27
23:21:52 UTC (rev 902)
@@ -1,12 +1,37 @@
<?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">
+
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>
-
+ <component>
+ <key>InjectingBean</key>
+ <type>org.exoplatform.kernel.demos.mc.InjectingBean</type>
+ </component>
+ <component>
+ <key>InjectingBean2</key>
+ <type>org.exoplatform.kernel.demos.mc.InjectingBean</type>
+ </component>
+ <component>
+ <key>InjectingBean3</key>
+ <type>org.exoplatform.kernel.demos.mc.InjectingBean</type>
+ </component>
+ <component>
+ <key>InjectingBean4</key>
+ <type>org.exoplatform.kernel.demos.mc.InjectingBean</type>
+ </component>
+ <component>
+ <key>InjectingBean5</key>
+ <type>org.exoplatform.kernel.demos.mc.InjectingBean</type>
+ </component>
+ <component>
+ <key>ProtectedNoArgsConstructorBean</key>
+
<type>org.exoplatform.kernel.demos.mc.ProtectedNoArgsConstructorBean</type>
+ <init-params>
+ <value-param>
+ <name>name</name>
+ <value>Some value</value>
+ </value-param>
+ </init-params>
+ </component>
</configuration>
Added:
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/conf/mc-beans.xml
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/conf/mc-beans.xml
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/conf/mc-beans.xml 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd"
+ xmlns="urn:jboss:bean-deployer">
+
+ <interceptor xmlns="urn:jboss:aop-beans:1.0"
name="DemoAOPInterceptor"
+ class="org.exoplatform.kernel.demos.mc.AOPInterceptor"/>
+
+ <!-- Matching by exact type will not work, because of the mechanics of
MC-integration AOP -->
+ <!-- Use $instanceof instead -->
+ <bind xmlns="urn:jboss:aop-beans:1.0"
+ pointcut="execution(*
$instanceof{org.exoplatform.kernel.demos.mc.MissingNoArgsConstructorBean}->*(..))">
+ <interceptor-ref name="DemoAOPInterceptor"/>
+ </bind>
+
+ <bind xmlns="urn:jboss:aop-beans:1.0"
+ pointcut="execution(*
$instanceof{org.exoplatform.kernel.demos.mc.InjectingBean}->*(..))">
+ <interceptor-ref name="DemoAOPInterceptor"/>
+ </bind>
+
+</deployment>
\ No newline at end of file
Added:
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/conf/mc-int-beans.xml
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/conf/mc-int-beans.xml
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.demos/mc-injection/src/main/resources/conf/mc-int-beans.xml 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns="urn:jboss:bean-deployer:2.0">
+ <bean
class="org.exoplatform.container.definition.PortalContainerConfig">
+
<annotation>(a)org.exoplatform.container.mc.impl.InterceptMC(enableAOP=true)</annotation>
+ </bean>
+ <bean name="InjectingBean2">
+ <annotation>
+
@org.exoplatform.container.mc.impl.InterceptMC(injectionMode=org.exoplatform.container.mc.impl.MCInjectionMode.STANDARD)
+ </annotation>
+ </bean>
+ <bean name="InjectingBean3">
+ <annotation>
+
@org.exoplatform.container.mc.impl.InterceptMC(enableAOP=true,injectionMode=org.exoplatform.container.mc.impl.MCInjectionMode.ALL)
+ </annotation>
+ </bean>
+ <bean name="InjectingBean4">
+
<annotation>(a)org.exoplatform.container.mc.impl.InterceptMC(enableAOP=true)</annotation>
+ </bean>
+ <bean name="InjectingBean5"
class="org.exoplatform.kernel.demos.mc.InjectingBean">
+ <!-- NO ANNOTATION -->
+ </bean>
+ <bean name="ProtectedNoArgsConstructorBean">
+
<annotation>(a)org.exoplatform.container.mc.impl.InterceptMC(enableAOP=true)</annotation>
+ </bean>
+
+</deployment>
\ No newline at end of file
Modified: kernel/branches/mc-int-branch/exo.kernel.demos/pom.xml
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.demos/pom.xml 2009-11-27 11:53:44 UTC (rev
901)
+++ kernel/branches/mc-int-branch/exo.kernel.demos/pom.xml 2009-11-27 23:21:52 UTC (rev
902)
@@ -9,10 +9,10 @@
</parent>
<groupId>org.exoplatform.kernel.demos</groupId>
- <artifactId>exo.kernel.demos</artifactId>
+ <artifactId>demos-parent</artifactId>
<packaging>pom</packaging>
- <name>eXo Kernel Demos</name>
+ <name>eXo Kernel :: Demos</name>
<modules>
<module>mc-injection</module>
Added: kernel/branches/mc-int-branch/exo.kernel.mc-int/pom.xml
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.mc-int/pom.xml (rev
0)
+++ kernel/branches/mc-int-branch/exo.kernel.mc-int/pom.xml 2009-11-27 23:21:52 UTC (rev
902)
@@ -0,0 +1,69 @@
+
+<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-Beta04-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>exo.kernel.mc-int</artifactId>
+
+ <name>eXo Kernel :: MC Kernel Integration</name>
+ <description>MC Kernel Integration</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.exoplatform.kernel</groupId>
+ <artifactId>exo.kernel.commons</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.exoplatform.kernel</groupId>
+ <artifactId>exo.kernel.container</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>picocontainer</groupId>
+ <artifactId>picocontainer</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.microcontainer</groupId>
+ <artifactId>jboss-kernel</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>exo.kernel.mc-kernel-extras</artifactId>
+ </dependency>
+
+ </dependencies>
+</project>
Added:
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/GenericWrapperUtil.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/GenericWrapperUtil.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/GenericWrapperUtil.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,177 @@
+package org.exoplatform.container.mc.impl;
+
+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 (AnnotationsAttribute) aa.copy(cpool, null);
+ }
+ }
+ 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.getDeclaredConstructors();
+ boolean found = false;
+ for (CtConstructor cons : ctors)
+ {
+ if (cons.getParameterTypes().length == 0
+ && (cons.getModifiers() & (Modifier.PUBLIC |
Modifier.PROTECTED)) > 0)
+ {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ {
+ throw new RuntimeException("Class can not be AOP instrumented - it has no
zero-arguments public/protected constructor: " + c.getClass());
+ }
+ }
+}
\ No newline at end of file
Added:
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/InterceptMC.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/InterceptMC.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/InterceptMC.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,31 @@
+package org.exoplatform.container.mc.impl;
+
+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;
+
+ /**
+ * Injection mode
+ *
+ * @return MCInjectionMode enumeration constant representing injection mode
+ */
+ MCInjectionMode injectionMode() default MCInjectionMode.STANDARD;
+}
Added:
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/JavassistAOPClassLoader.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/JavassistAOPClassLoader.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/JavassistAOPClassLoader.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,67 @@
+package org.exoplatform.container.mc.impl;
+
+import javassist.ClassPool;
+import javassist.Loader;
+
+/**
+ * @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.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCComponentAdapter.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCComponentAdapter.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCComponentAdapter.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,141 @@
+package org.exoplatform.container.mc.impl;
+
+import org.jboss.beans.info.spi.BeanAccessMode;
+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 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 = lastComponentInstance;
+ if (target != null)
+ {
+ return target;
+ }
+
+ String key = delegate.getComponentKey().toString();
+ Object instance = delegate.getComponentInstance(container);
+ try
+ {
+ 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();
+ builder.setAccessMode(getInjectionMode(interceptMC));
+
+ 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 = target;
+ return target;
+ }
+ finally
+ {
+ GenericWrapperUtil.postInstallCleanup();
+ }
+ }
+ catch (Throwable ex)
+ {
+ throw new RuntimeException("Failed to perform MC interception on component:
" + delegate.getComponentImplementation(), ex);
+ }
+ }
+
+ private BeanAccessMode getInjectionMode(InterceptMC interceptMC)
+ {
+ MCInjectionMode mode = interceptMC.injectionMode();
+
+ switch (mode)
+ {
+ case ALL:
+ return BeanAccessMode.ALL;
+ case FIELDS:
+ return BeanAccessMode.FIELDS;
+ default:
+ return BeanAccessMode.STANDARD;
+ }
+ }
+
+ public void verify(PicoContainer container) throws PicoIntrospectionException
+ {
+ delegate.verify(container);
+ }
+
+ public void accept(PicoVisitor visitor)
+ {
+ delegate.accept(visitor);
+ }
+}
\ No newline at end of file
Added:
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCComponentInfo.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCComponentInfo.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCComponentInfo.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,26 @@
+package org.exoplatform.container.mc.impl;
+
+/**
+ * @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.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCInjectionMode.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCInjectionMode.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCInjectionMode.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,22 @@
+package org.exoplatform.container.mc.impl;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public enum MCInjectionMode
+{
+ /**
+ * Field and method injections
+ */
+ ALL,
+
+ /**
+ * Disable field injections (default)
+ */
+ FIELDS,
+
+ /**
+ * Try setter injection first, if no setter found, fallback to field
+ */
+ STANDARD
+}
Added:
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCIntConfig.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCIntConfig.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCIntConfig.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,171 @@
+package org.exoplatform.container.mc.impl;
+
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.kernel.spi.deployment.KernelDeployment;
+import org.jboss.xb.binding.Unmarshaller;
+import org.jboss.xb.binding.UnmarshallerFactory;
+import org.jboss.xb.binding.resolver.MutableSchemaResolver;
+import org.jboss.xb.binding.sunday.unmarshalling.SingletonSchemaResolverFactory;
+import org.picocontainer.ComponentAdapter;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class MCIntConfig
+{
+ private static final Log log = ExoLogger.getLogger(MCIntConfig.class);
+
+ private Map<String, DeploymentData> confByKey = new HashMap<String,
DeploymentData>();
+
+ private Map<String, DeploymentData> confByBean = new HashMap<String,
DeploymentData>();
+
+ MCIntConfig()
+ {
+ Enumeration<URL> urls = null;
+ try
+ {
+ urls =
Thread.currentThread().getContextClassLoader().getResources("conf/mc-int-beans.xml");
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException("Failed to get resources:
conf/mc-int-beans.xml", e);
+ }
+
+ UnmarshallerFactory factory = UnmarshallerFactory.newInstance();
+ MutableSchemaResolver resolver =
SingletonSchemaResolverFactory.getInstance().getSchemaBindingResolver();
+
+ while (urls.hasMoreElements())
+ {
+ URL url = urls.nextElement();
+
+ KernelDeployment deployment = parseConfigURL(factory, resolver, url);
+
+ List<BeanMetaData> beans = deployment.getBeans();
+ for (BeanMetaData mdata : beans)
+ {
+ String name = mdata.getName();
+ DeploymentData data = confByKey.get(name);
+ if (data == null)
+ {
+ String bean = mdata.getBean();
+ data = confByBean.get(bean);
+ }
+ if (data != null)
+ {
+ log.warn("Overriding existing mc-int-beans configuration for bean:
" + data.data
+ + " from " + data.deployment.getName() + " with one
from " + deployment.getName());
+ }
+ addConf(new DeploymentData(deployment, mdata));
+ }
+ }
+ }
+
+ public BeanMetaData getByKey(String key)
+ {
+ DeploymentData dd = confByKey.get(key);
+ if (dd == null)
+ {
+ return null;
+ }
+ return dd.data;
+ }
+
+ public BeanMetaData getByBean(String bean)
+ {
+ DeploymentData dd = confByBean.get(bean);
+ if (dd == null)
+ {
+ return null;
+ }
+ return dd.data;
+ }
+
+ public BeanMetaData getByAdapter(ComponentAdapter adapter)
+ {
+ Object key = adapter.getComponentKey();
+ String strKey = key instanceof Class ? ((Class) key).getName() :
String.valueOf(key);
+ BeanMetaData ret = getByKey(strKey);
+ if (ret != null)
+ {
+ return ret;
+ }
+
+ ret = getByBean(strKey);
+ return ret;
+ }
+
+ private void addConf(DeploymentData deploymentData)
+ {
+ String name = deploymentData.data.getName();
+ if (name != null)
+ {
+ confByKey.put(name, deploymentData);
+ }
+ String bean = deploymentData.data.getBean();
+ if (bean != null)
+ {
+ confByBean.put(bean, deploymentData);
+ }
+ if (name == null && bean == null)
+ {
+ throw new RuntimeException("Configuration error: bean found with no name
and no class in "
+ + deploymentData.deployment.getName());
+ }
+ }
+
+ private KernelDeployment parseConfigURL(UnmarshallerFactory factory,
MutableSchemaResolver resolver, URL url)
+ {
+ final boolean trace = log.isTraceEnabled();
+ if (trace)
+ {
+ log.trace("Parsing " + url);
+ }
+ long start = System.currentTimeMillis();
+
+ Unmarshaller unmarshaller = factory.newUnmarshaller();
+ KernelDeployment deployment = null;
+ try
+ {
+ deployment = (KernelDeployment) unmarshaller.unmarshal(url.toString(),
resolver);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException("Failed to parse xml " + url, e);
+ }
+
+ if (deployment == null)
+ {
+ throw new RuntimeException("The xml " + url + " is not well
formed!");
+ }
+ deployment.setName(url.toString());
+
+ if (trace)
+ {
+ long now = System.currentTimeMillis();
+ log.trace("Parsing " + url + " took " + (now - start) +
" milliseconds");
+ }
+
+ return deployment;
+ }
+
+ static class DeploymentData
+ {
+ KernelDeployment deployment;
+ BeanMetaData data;
+
+ public DeploymentData(KernelDeployment deployment, BeanMetaData data)
+ {
+ this.deployment = deployment;
+ this.data = data;
+ }
+ }
+}
Added:
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCIntegrationImpl.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCIntegrationImpl.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCIntegrationImpl.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,153 @@
+package org.exoplatform.container.mc.impl;
+
+import org.exoplatform.container.mc.MCIntegration;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.jboss.beans.metadata.spi.AnnotationMetaData;
+import org.jboss.beans.metadata.spi.BeanMetaData;
+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.jboss.mc.servlet.vdf.api.VDFThreadLocalUtils;
+import org.picocontainer.ComponentAdapter;
+
+import javax.servlet.ServletContext;
+import java.io.IOException;
+import java.lang.annotation.Annotation;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class MCIntegrationImpl implements MCIntegration
+{
+ private static Log log = ExoLogger.getLogger(MCIntegrationImpl.class);
+ private static MCIntegration mcint;
+
+ private AbstractKernelController rootController;
+ private List<KernelDeployment> deployments = new
LinkedList<KernelDeployment>();
+ private MCIntConfig conf;
+
+ public synchronized static MCIntegration getInstance()
+ {
+ if (mcint == null)
+ {
+ mcint = new MCIntegrationImpl();
+ }
+ return mcint;
+ }
+
+ private MCIntegrationImpl()
+ {
+ // load mc-int-beans.xml
+ conf = new MCIntConfig();
+ }
+
+ 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));
+ log.debug("Deployed mc-kernel configuration: " + confUrl);
+ }
+ catch (Throwable ex)
+ {
+ throw new RuntimeException("Failed to deploy: " + confUrl, ex);
+ }
+ }
+ }
+
+ public ComponentAdapter getMCAdapter(ComponentAdapter adapter)
+ {
+ InterceptMC interceptAnnotation = null;
+
+ BeanMetaData data = conf.getByAdapter(adapter);
+ if (data != null)
+ {
+ Set<AnnotationMetaData> annotationMetaData = data.getAnnotations();
+ if (annotationMetaData != null)
+ {
+ for (AnnotationMetaData annMeta : annotationMetaData)
+ {
+ Annotation ann = annMeta.getAnnotationInstance();
+ if (ann.annotationType() == InterceptMC.class)
+ {
+ interceptAnnotation = (InterceptMC) ann;
+ }
+ }
+ }
+ }
+ else
+ {
+ Class<?> clazz = adapter.getComponentImplementation();
+ interceptAnnotation = clazz.getAnnotation(InterceptMC.class);
+ }
+
+ if (interceptAnnotation == null)
+ {
+ return adapter;
+ }
+
+ AbstractKernelController controller = getRootController();
+ if (controller != null)
+ {
+ adapter = new MCComponentAdapter(controller, adapter, interceptAnnotation);
+ }
+ return adapter;
+ }
+
+ public boolean hasMCKernel(ComponentAdapter adapter)
+ {
+ return ThreadLocalUtils.getKernel() != null;
+ }
+
+ public void initThreadCtx(ServletContext ctx)
+ {
+ VDFThreadLocalUtils.init(ctx);
+ }
+
+ public void resetThreadCtx(ServletContext ctx)
+ {
+ VDFThreadLocalUtils.reset();
+ }
+}
Added:
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCInterceptProxy.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCInterceptProxy.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCInterceptProxy.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,23 @@
+package org.exoplatform.container.mc.impl;
+
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class MCInterceptProxy
+{
+ private static final Log __log = ExoLogger.getLogger(MCInterceptProxy.class);
+ public static final String DELEGATE = "__delegate";
+ private Object __delegate;
+
+ public MCInterceptProxy(Object delegate)
+ {
+ this.__delegate = delegate;
+ if (__log.isDebugEnabled())
+ {
+ __log.debug("MCInterceptProxy<init> - CL: " +
delegate.getClass().getClassLoader());
+ }
+ }
+}
Added:
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/RootContainerVDFDecoratorInjector.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/RootContainerVDFDecoratorInjector.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/RootContainerVDFDecoratorInjector.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,71 @@
+package org.exoplatform.container.mc.impl;
+
+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.mc.common.ThreadLocalUtils;
+import org.jboss.util.loading.Translator;
+
+import java.security.ProtectionDomain;
+
+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(ClassLoader cl) throws Exception
+ {
+ ClassPool pool = ClassPool.getDefault();
+ pool.insertClassPath(new LoaderClassPath(cl));
+ 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(classLoader);
+ }
+ 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.mc-int/src/main/java/org/exoplatform/container/mc/impl/WrapperMethodComposer.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/WrapperMethodComposer.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/WrapperMethodComposer.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,158 @@
+package org.exoplatform.container.mc.impl;
+
+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);
+ }
+ }
+}
Copied: kernel/branches/mc-int-branch/exo.kernel.mc-kernel-extras (from rev 901,
kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras)
Deleted: kernel/branches/mc-int-branch/exo.kernel.mc-kernel-extras/pom.xml
===================================================================
--- kernel/branches/mc-int-branch/org.jboss.mc-kernel-extras/pom.xml 2009-11-27 11:53:44
UTC (rev 901)
+++ kernel/branches/mc-int-branch/exo.kernel.mc-kernel-extras/pom.xml 2009-11-27 23:21:52
UTC (rev 902)
@@ -1,57 +0,0 @@
-
-<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-Beta04-SNAPSHOT</version>
- </parent>
-
- <artifactId>mc-kernel-extras</artifactId>
-
- <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/exo.kernel.tests/integration-tests/pom.xml
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/pom.xml
(rev 0)
+++ kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/pom.xml 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,98 @@
+<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.tests</groupId>
+ <artifactId>tests-parent</artifactId>
+ <version>2.2.0-Beta04-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>exo.kernel.integration-tests</artifactId>
+ <packaging>war</packaging>
+
+ <name>eXo Kernel :: Tests :: Integration Tests</name>
+ <description>MC Integration Tests</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.7</version>
+ </dependency>
+ <dependency>
+ <groupId>org.exoplatform.kernel</groupId>
+ <artifactId>exo.kernel.container</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.exoplatform.kernel.demos</groupId>
+ <artifactId>exo.kernel.demos.mc-injection</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-war-plugin</artifactId>
+ <configuration>
+ <!-- In version 2.1-alpha-1, this was incorrectly named
warSourceExcludes -->
+ <!--packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes-->
+
<packagingIncludes>WEB-INF/lib/junit-*.jar,WEB-INF/classes/**</packagingIncludes>
+ <archive>
+ <manifest>
+ <addClasspath>false</addClasspath>
+ <!-- Doesn't seem to be working: -->
+ <!--classpathPrefix>gatein.ear/lib/</classpathPrefix-->
+ </manifest>
+ </archive>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>tests</id>
+ <build>
+
<finalName>eXo-kernel-integration-tests-${project.version}</finalName>
+ <defaultGoal>integration-test</defaultGoal>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <excludes>
+ <exclude>**/it/Test*.java</exclude>
+ </excludes>
+ </configuration>
+ <executions>
+ <execution>
+ <id>integration-tests</id>
+ <phase>integration-test</phase>
+ <goals>
+ <goal>test</goal>
+ </goals>
+ <configuration>
+ <skip>false</skip>
+ <excludes>
+ <exclude>none</exclude>
+ </excludes>
+ <includes>
+ <include>**/it/Test*.java</include>
+ </includes>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+</project>
Added:
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,247 @@
+package org.exoplatform.kernel.it;
+
+import org.exoplatform.commons.Environment;
+import org.exoplatform.container.RootContainer;
+import org.exoplatform.kernel.demos.mc.AOPInterceptor;
+import org.exoplatform.kernel.demos.mc.InjectedBean;
+import org.exoplatform.kernel.demos.mc.InjectingBean;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.jboss.aop.joinpoint.Invocation;
+import org.jboss.aop.proxy.container.ContainerProxyMethodInvocation;
+import org.jboss.dependency.spi.Controller;
+import org.jboss.kernel.Kernel;
+import org.jboss.kernel.spi.config.KernelConfigurator;
+import org.jboss.kernel.spi.dependency.KernelController;
+import org.jboss.kernel.spi.registry.KernelBus;
+import org.jboss.kernel.spi.registry.KernelRegistry;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Presumption when running this test from within servlet container is that
+ * org.exoplatform.kernel.demos:exo.kernel.demos.mc-injection jar has been deployed
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class MCInjectionTest
+{
+ protected Log log = ExoLogger.getLogger(getClass());
+
+ protected String beanName;
+ protected InjectingBean bean;
+ protected boolean inJboss;
+ protected boolean mcIntActive = true;
+ protected boolean aopIntActive = false;
+ protected Map<String, Integer> expectedAOPResults;
+
+ public MCInjectionTest()
+ {
+ beanName = "InjectingBean";
+ }
+
+ protected void init()
+ {
+ log.info("init() method called");
+ RootContainer rootContainer = RootContainer.getInstance();
+ bean = (InjectingBean) rootContainer.getComponentInstance(beanName);
+ log.info("Retrieved " + beanName + ": " + bean);
+ Assert.assertNotNull(beanName + " not installed", bean);
+ inJboss = Environment.getInstance().getPlatform() == Environment.JBOSS_PLATFORM;
+ log.info("Running inside JBoss? " + inJboss);
+ }
+
+ @Test
+ public void test()
+ {
+ init();
+ // AOP tests first
+ testAOP();
+ tests();
+ }
+
+ protected void testAOP()
+ {
+ String className;
+ Method m = null;
+ try
+ {
+ m = bean.getClass().getDeclaredMethod("getDelegate");
+ }
+ catch (Exception ignored)
+ {
+ }
+ catch (Error ignored)
+ {
+ }
+
+ if (inJboss == false || aopIntActive == false)
+ {
+ Assert.assertNull("AOP Proxy should not be present", m);
+ return;
+ }
+ Assert.assertNotNull("AOP Proxy should be present", m);
+ try
+ {
+ Object delegate = m.invoke(bean);
+ className = delegate.getClass().getName();
+ }
+ catch (Exception ex)
+ {
+ throw new RuntimeException("AOP Proxy getDelegate() filed");
+ }
+ CallCounter counter = new CallCounter();
+ List<Invocation> invocations = AOPInterceptor.getInvocations();
+ for (Invocation iv : invocations)
+ {
+ if (iv instanceof ContainerProxyMethodInvocation)
+ {
+ if (iv.getTargetObject().getClass().getName().startsWith(className))
+ {
+ counter.add(((ContainerProxyMethodInvocation) iv).getMethod().getName());
+ }
+ }
+ }
+
+ Map<String, Integer> called = counter.getCallMap();
+ if (expectedAOPResults == null)
+ {
+ throw new IllegalArgumentException("expectedAOPResults == null");
+ }
+ if (expectedAOPResults.size() == 0)
+ {
+ throw new IllegalArgumentException("expectedAOPResults.size() == 0");
+ }
+ for (Map.Entry<String, Integer> ent : expectedAOPResults.entrySet())
+ {
+ Integer callCount = called.get(ent.getKey());
+ if (callCount == null)
+ {
+ callCount = Integer.valueOf(0);
+ }
+ junit.framework.Assert.assertEquals(ent.getKey() + "() not called through
AOP as expected",
+ ent.getValue(), callCount);
+ }
+ }
+
+ protected void tests()
+ {
+ testFieldInjection();
+ testTypeMatchingMethodInjection();
+ testNameLookupMethodInjection();
+ testNameLookupMapInjection();
+ testPropertyValueMethodInjection();
+ testStarted();
+ }
+
+ protected void testFieldInjection()
+ {
+ boolean found = bean.getInjectedBean() != null;
+ if (inJboss && mcIntActive)
+ {
+ Assert.assertTrue("Field injection not executed", found);
+ }
+ else
+ {
+ Assert.assertFalse("Field injection should not have worked", found);
+ }
+ log.info("testFieldInjection passed");
+ }
+
+ protected void testTypeMatchingMethodInjection()
+ {
+ boolean found = bean.getBean() != null;
+ if (inJboss && mcIntActive)
+ {
+ Assert.assertTrue("Method injection by type matching not executed",
found);
+ }
+ else
+ {
+ Assert.assertFalse("Method injection by type matching should not have
worked", found);
+ }
+ log.info("testTypeMatchingMethodInjection passed");
+ }
+
+ protected void testNameLookupMethodInjection()
+ {
+ boolean found = bean.getConfigurator() != null;
+ if (inJboss && mcIntActive)
+ {
+ Assert.assertTrue("Method injection by name lookup not executed",
found);
+ }
+ else
+ {
+ Assert.assertFalse("Method injection by name lookup should not have
worked", found);
+ }
+ log.info("testNameLookupMethodInjection passed");
+ }
+
+ protected void testNameLookupMapInjection()
+ {
+ Map bindings = bean.getBindings();
+ boolean found = bindings != null;
+ if (inJboss && mcIntActive)
+ {
+ Assert.assertTrue("Name lookup Map injection not executed", found);
+ Assert.assertEquals("Bindings size", bindings.size(), 6);
+ Assert.assertTrue("Controller not bound",
bindings.get(Controller.class) instanceof Controller);
+ Assert.assertTrue("Kernel not bound", bindings.get(Kernel.class)
instanceof Kernel);
+ Assert.assertTrue("KernelController not bound",
bindings.get(KernelController.class) instanceof KernelController);
+ Assert.assertTrue("KernelBus not bound", bindings.get(KernelBus.class)
instanceof KernelBus);
+ Assert.assertTrue("KernelRegistry not bound",
bindings.get(KernelRegistry.class) instanceof KernelRegistry);
+ Assert.assertTrue("KernelConfigurator not bound",
bindings.get(KernelConfigurator.class) instanceof KernelConfigurator);
+ }
+ else
+ {
+ Assert.assertFalse("Name lookup Map injection should not have worked",
found);
+ }
+ log.info("testNameLookupMapInjection passed");
+ }
+
+ protected void testPropertyValueMethodInjection()
+ {
+ String propertyValue = bean.getSomeStringProperty();
+ boolean found = propertyValue != null;
+ if (inJboss && mcIntActive)
+ {
+ Assert.assertTrue("Property value method injection not executed",
found);
+ Assert.assertEquals("Invalid injected value", propertyValue,
InjectedBean.SOME_PROPERTY_VALUE);
+ }
+ else
+ {
+ Assert.assertFalse("Property value method injection should not have
worked", found);
+ }
+ log.info("testPropertyValueMethodInjection passed");
+ }
+
+ protected void testStarted()
+ {
+ Assert.assertTrue("start() method not called", bean.isStarted());
+ log.info("testStarted passed");
+ }
+
+ static class CallCounter
+ {
+ private Map<String, Integer> called = new HashMap<String, Integer>();
+
+ public void add(String name)
+ {
+ Integer count = called.get(name);
+ if (count == null)
+ {
+ count = 0;
+ }
+ called.put(name, 1 + count);
+ }
+
+ public Map<String, Integer> getCallMap()
+ {
+ return called;
+ }
+ }
+}
Added:
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest2.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest2.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest2.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,23 @@
+package org.exoplatform.kernel.it;
+
+import org.junit.Assert;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class MCInjectionTest2 extends MCInjectionTest
+{
+ public MCInjectionTest2()
+ {
+ super();
+ beanName = "InjectingBean2";
+ }
+
+ @Override
+ protected void testFieldInjection()
+ {
+ boolean found = bean.getInjectedBean() != null;
+ Assert.assertFalse("Field injection should not have worked", found);
+ log.info("testFieldInjection passed");
+ }
+}
Added:
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest3.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest3.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest3.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,22 @@
+package org.exoplatform.kernel.it;
+
+import java.util.HashMap;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class MCInjectionTest3 extends MCInjectionTest2
+{
+ public MCInjectionTest3()
+ {
+ super();
+ beanName = "InjectingBean3";
+ expectedAOPResults = new HashMap<String, Integer>();
+ expectedAOPResults.put("setBindings", 1);
+ expectedAOPResults.put("setSomeStringProperty", 1);
+ expectedAOPResults.put("setBean", 1);
+ expectedAOPResults.put("setConfigurator", 1);
+ expectedAOPResults.put("start", 1);
+ aopIntActive = true;
+ }
+}
\ No newline at end of file
Added:
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest4.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest4.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest4.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,13 @@
+package org.exoplatform.kernel.it;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class MCInjectionTest4 extends MCInjectionTest3
+{
+ public MCInjectionTest4()
+ {
+ super();
+ beanName = "InjectingBean4";
+ }
+}
\ No newline at end of file
Added:
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest5.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest5.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest5.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,14 @@
+package org.exoplatform.kernel.it;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class MCInjectionTest5 extends MCInjectionTest
+{
+ public MCInjectionTest5()
+ {
+ super();
+ beanName = "InjectingBean5";
+ mcIntActive = false;
+ }
+}
\ No newline at end of file
Added:
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/tests/JUnitInvokerServlet.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/tests/JUnitInvokerServlet.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/tests/JUnitInvokerServlet.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,43 @@
+package org.exoplatform.tests;
+
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.junit.internal.JUnitSystem;
+import org.junit.runner.JUnitCore;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+
+public class JUnitInvokerServlet extends HttpServlet
+{
+ private static final Log log = ExoLogger.getLogger(JUnitInvokerServlet.class);
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException
+ {
+ String className = request.getParameter("class");
+ response.setContentType("text/plain");
+ OutputStream out = response.getOutputStream();
+ final PrintStream fOut = new PrintStream(new TeeOutputStream(out, new
LogOutputStream(log)));
+ //final PrintStream fOut = new PrintStream(out);
+ JUnitSystem sys = new JUnitSystem()
+ {
+ public PrintStream out()
+ {
+ return fOut;
+ }
+
+ public void exit(int arg)
+ {
+ }
+ };
+
+ new JUnitCore().runMain(sys, className);
+ out.close();
+ }
+}
\ No newline at end of file
Added:
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/tests/LogOutputStream.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/tests/LogOutputStream.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/tests/LogOutputStream.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,54 @@
+package org.exoplatform.tests;
+
+import org.exoplatform.services.log.Log;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+class LogOutputStream extends OutputStream
+{
+ private Log log;
+
+ private ByteArrayOutputStream buf = new ByteArrayOutputStream();
+
+ private boolean eol;
+
+ LogOutputStream(Log log)
+ {
+ this.log = log;
+ }
+
+ @Override
+ public void write(int b) throws IOException
+ {
+ if (b == '\n' || b == '\r')
+ {
+ eol = true;
+ return;
+ }
+ flush();
+ if (b != -1)
+ {
+ buf.write(b);
+ }
+ }
+
+ public void flush()
+ {
+ if (eol)
+ {
+ eol = false;
+ log.info(new String(buf.toByteArray()));
+ buf.reset();
+ }
+ }
+
+ public void close()
+ {
+ flush();
+ }
+}
Added:
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/tests/TeeOutputStream.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/tests/TeeOutputStream.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/java/org/exoplatform/tests/TeeOutputStream.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,53 @@
+package org.exoplatform.tests;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+class TeeOutputStream extends OutputStream
+{
+ private OutputStream out;
+ private OutputStream out2;
+
+ TeeOutputStream(OutputStream out, OutputStream out2)
+ {
+ this.out = out;
+ this.out2 = out2;
+ }
+
+ @Override
+ public void write(byte[] buf, int off, int len) throws IOException
+ {
+ out.write(buf, off, len);
+ out2.write(buf, off, len);
+ }
+
+ @Override
+ public void write(byte[] buf) throws IOException
+ {
+ write(buf, 0, buf.length);
+ }
+
+ @Override
+ public void write(int b) throws IOException
+ {
+ out.write(b);
+ out2.write(b);
+ }
+
+ @Override
+ public void flush() throws IOException
+ {
+ out.flush();
+ out2.flush();
+ }
+
+ @Override
+ public void close() throws IOException
+ {
+ out.close();
+ out2.close();
+ }
+}
Added:
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/webapp/WEB-INF/web.xml
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/webapp/WEB-INF/web.xml
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/main/webapp/WEB-INF/web.xml 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<web-app version="2.5"
+
xmlns="http://java.sun.com/xml/ns/javaee"
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
+
+ <servlet>
+ <servlet-name>JUnit Invoker Servlet</servlet-name>
+
<servlet-class>org.exoplatform.tests.JUnitInvokerServlet</servlet-class>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>JUnit Invoker Servlet</servlet-name>
+ <url-pattern>/integration-tests</url-pattern>
+ </servlet-mapping>
+
+</web-app>
\ No newline at end of file
Added:
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/CopiedException.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/CopiedException.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/CopiedException.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,70 @@
+package org.exoplatform.kernel.it;
+
+import java.io.BufferedReader;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.StringReader;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class CopiedException extends RuntimeException
+{
+ private String msg;
+ private String trace;
+
+ public CopiedException(String trace)
+ {
+ this.trace = trace;
+ try
+ {
+ final String EOL = System.getProperty("line.separator");
+ StringBuilder sb = new StringBuilder();
+ BufferedReader lineReader = new BufferedReader(new StringReader(trace));
+ String line = null;
+ while ((line = lineReader.readLine()) != null)
+ {
+ if (line.trim().startsWith("at "))
+ {
+ break;
+ }
+ sb.append(line).append(EOL);
+ }
+ msg = sb.toString();
+ }
+ catch (Exception ex)
+ {
+ throw new RuntimeException("Failed to initialize from stacktrace: ",
ex);
+ }
+ }
+
+ @Override
+ public String getMessage()
+ {
+ return msg;
+ }
+
+ @Override
+ public String toString()
+ {
+ return msg;
+ }
+
+ @Override
+ public void printStackTrace()
+ {
+ System.out.println(trace);
+ }
+
+ @Override
+ public void printStackTrace(PrintStream s)
+ {
+ s.println(trace);
+ }
+
+ @Override
+ public void printStackTrace(PrintWriter s)
+ {
+ s.println(trace);
+ }
+}
Added:
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/FailuresParser.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/FailuresParser.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/FailuresParser.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,111 @@
+package org.exoplatform.kernel.it;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class FailuresParser
+{
+ private static final String END_OF_REPORT = "FAILURES!!!";
+ private Map<String, CopiedException> failures = new HashMap<String,
CopiedException>();
+
+ FailuresParser(LineReader lineReader)
+ {
+ try
+ {
+ String line = null;
+ while ((line = lineReader.readLine()) != null)
+ {
+ String testMethodName = getNameIfStartOfFailure(line);
+
+ if (testMethodName == END_OF_REPORT)
+ {
+ break;
+ }
+
+ if (testMethodName != null)
+ {
+ failures.put(testMethodName, new
CopiedException(readStackTrace(lineReader)));
+ lineReader.unreadLastLine();
+ }
+ }
+ }
+ catch (RuntimeException ex)
+ {
+ throw ex;
+ }
+ catch (Exception ex)
+ {
+ throw new RuntimeException("Failed to read response from server: ",
ex);
+ }
+ }
+
+ public Map<String, CopiedException> getFailures()
+ {
+ return failures;
+ }
+
+ private String getNameIfStartOfFailure(String line)
+ {
+ // Number + ") " + methodName + "(" + className +
")"
+ // Number + ") " + className
+ if (END_OF_REPORT.equals(line))
+ {
+ return END_OF_REPORT;
+ }
+
+ int max = line.length() > 4 ? 4 : line.length();
+ int pos = line.substring(0, max).indexOf(")");
+ if (pos == -1)
+ {
+ return null;
+ }
+
+ try
+ {
+ Integer.valueOf(line.substring(0, pos));
+ }
+ catch (NumberFormatException ignored)
+ {
+ return null;
+ }
+
+ int endOfMethodPos = line.lastIndexOf("(", line.length() - 1);
+ if (endOfMethodPos == -1)
+ {
+ endOfMethodPos = line.length();
+ }
+
+ String ret = line.substring(pos + 2, endOfMethodPos);
+ // it should not contain any spaces, tabs, newlines, colons ...
+ String[] split = ret.split("(\\s|:)");
+ if (split.length > 1)
+ {
+ return null;
+ }
+ return ret;
+ }
+
+ private String readStackTrace(BufferedReader lineReader) throws IOException
+ {
+ final String EOL = System.getProperty("line.separator");
+ StringBuilder sb = new StringBuilder();
+
+ // Read for as long as lines don't look like beginning of another failure
+ String line = null;
+ while ((line = lineReader.readLine()) != null)
+ {
+ String testMethodName = getNameIfStartOfFailure(line);
+ if (testMethodName != null)
+ {
+ break;
+ }
+ sb.append(line).append(EOL);
+ }
+ return sb.toString();
+ }
+}
Added:
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/LineReader.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/LineReader.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/LineReader.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,47 @@
+package org.exoplatform.kernel.it;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Reader;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class LineReader extends BufferedReader
+{
+ private String lastLine;
+ private String unreadLine;
+
+ public LineReader(Reader reader)
+ {
+ super(reader);
+ }
+
+ public LineReader(Reader reader, int size)
+ {
+ super(reader, size);
+ }
+
+ public String readLine() throws IOException
+ {
+ if (unreadLine != null)
+ {
+ lastLine = unreadLine;
+ unreadLine = null;
+ }
+ else
+ {
+ lastLine = super.readLine();
+ }
+ return lastLine;
+ }
+
+ public void unreadLastLine()
+ {
+ if (unreadLine != null)
+ {
+ throw new RuntimeException("Can't unread multiple lines!");
+ }
+ unreadLine = lastLine;
+ }
+}
Added:
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,79 @@
+package org.exoplatform.kernel.it;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This test needs to be executed in integration-test phase
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class TestMCInjectionIntegration
+{
+ protected String testClass;
+
+ protected Map<String, CopiedException> failures = new HashMap<String,
CopiedException>();
+
+
+ public TestMCInjectionIntegration()
+ {
+ testClass = MCInjectionTest.class.getName();
+ }
+
+ @Before
+ public void init()
+ {
+ URL url = null;
+ try
+ {
+ String host = System.getProperty("server.host");
+ if (host == null)
+ {
+ host = "localhost";
+ }
+ String port = System.getProperty("server.port");
+ if (port == null)
+ {
+ port = "8080";
+ }
+ // invoke servlet
+ url = new URL("http://" + host + ":" + port +
"/integration-tests/integration-tests?class=" + testClass);
+ System.out.println("Executing remote tests: " + url);
+ InputStream is = (InputStream) url.getContent();
+ LineReader lineReader = new LineReader(new InputStreamReader(is));
+ failures = new FailuresParser(lineReader).getFailures();
+ checkFailed(testClass);
+ }
+ catch (MalformedURLException ex)
+ {
+ throw new RuntimeException("Buggy test case", ex);
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException("Failed to retrieve response for url: " +
url, e);
+ }
+ }
+
+ private void checkFailed(String method)
+ {
+ RuntimeException ex = failures.get(method);
+ if (ex != null)
+ {
+ throw ex;
+ }
+ }
+
+ @Test
+ public void test()
+ {
+ checkFailed("test");
+ }
+}
Added:
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration2.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration2.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration2.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,12 @@
+package org.exoplatform.kernel.it;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class TestMCInjectionIntegration2 extends TestMCInjectionIntegration
+{
+ public TestMCInjectionIntegration2()
+ {
+ testClass = MCInjectionTest2.class.getName();
+ }
+}
Added:
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration3.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration3.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration3.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,12 @@
+package org.exoplatform.kernel.it;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class TestMCInjectionIntegration3 extends TestMCInjectionIntegration
+{
+ public TestMCInjectionIntegration3()
+ {
+ testClass = MCInjectionTest3.class.getName();
+ }
+}
\ No newline at end of file
Added:
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration4.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration4.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration4.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,12 @@
+package org.exoplatform.kernel.it;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class TestMCInjectionIntegration4 extends TestMCInjectionIntegration
+{
+ public TestMCInjectionIntegration4()
+ {
+ testClass = MCInjectionTest4.class.getName();
+ }
+}
\ No newline at end of file
Added:
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration5.java
===================================================================
---
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration5.java
(rev 0)
+++
kernel/branches/mc-int-branch/exo.kernel.tests/integration-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration5.java 2009-11-27
23:21:52 UTC (rev 902)
@@ -0,0 +1,12 @@
+package org.exoplatform.kernel.it;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class TestMCInjectionIntegration5 extends TestMCInjectionIntegration
+{
+ public TestMCInjectionIntegration5()
+ {
+ testClass = MCInjectionTest5.class.getName();
+ }
+}
\ No newline at end of file
Added: kernel/branches/mc-int-branch/exo.kernel.tests/pom.xml
===================================================================
--- kernel/branches/mc-int-branch/exo.kernel.tests/pom.xml (rev
0)
+++ kernel/branches/mc-int-branch/exo.kernel.tests/pom.xml 2009-11-27 23:21:52 UTC (rev
902)
@@ -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-Beta04-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.exoplatform.kernel.tests</groupId>
+ <artifactId>tests-parent</artifactId>
+ <packaging>pom</packaging>
+
+ <name>eXo Kernel :: Tests</name>
+
+ <modules>
+ <module>integration-tests</module>
+ </modules>
+
+</project>
Modified: kernel/branches/mc-int-branch/pom.xml
===================================================================
--- kernel/branches/mc-int-branch/pom.xml 2009-11-27 11:53:44 UTC (rev 901)
+++ kernel/branches/mc-int-branch/pom.xml 2009-11-27 23:21:52 UTC (rev 902)
@@ -57,8 +57,10 @@
<module>exo.kernel.component.remote</module>
<module>exo.kernel.component.cache</module>
<module>exo.kernel.component.command</module>
+ <module>exo.kernel.mc-int</module>
+ <module>exo.kernel.mc-kernel-extras</module>
<module>exo.kernel.demos</module>
- <module>org.jboss.mc-kernel-extras</module>
+ <module>exo.kernel.tests</module>
<module>packaging/module</module>
</modules>
@@ -91,11 +93,23 @@
<dependency>
<groupId>org.exoplatform.kernel</groupId>
- <artifactId>mc-kernel-extras</artifactId>
- <version>1.0.0-SNAPSHOT</version>
+ <artifactId>exo.kernel.mc-int</artifactId>
+ <version>${project.version}</version>
</dependency>
+
+ <dependency>
+ <groupId>org.exoplatform.kernel</groupId>
+ <artifactId>exo.kernel.mc-kernel-extras</artifactId>
+ <version>${project.version}</version>
+ </dependency>
<dependency>
+ <groupId>org.exoplatform.kernel.demos</groupId>
+ <artifactId>exo.kernel.demos.mc-injection</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
<groupId>org.exoplatform.tool</groupId>
<artifactId>exo.tool.framework.junit</artifactId>
<version>1.2.0</version>