Author: mstruk
Date: 2009-12-15 12:38:27 -0500 (Tue, 15 Dec 2009)
New Revision: 1074
Added:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/mc/
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegration.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegrationContainer.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegrationInvoker.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/util/EnvSpecific.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/util/JBossEnv.java
kernel/trunk/exo.kernel.mc-integration/
kernel/trunk/exo.kernel.mc-integration/README.txt
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/pom.xml
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/org/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/org/exoplatform/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/org/exoplatform/kernel/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/org/exoplatform/kernel/demos/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/org/exoplatform/kernel/demos/mc/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/org/exoplatform/kernel/demos/mc/ExternallyControlledInjectingBean.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/org/exoplatform/kernel/demos/mc/InjectedBean.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/org/exoplatform/kernel/demos/mc/InjectingBean.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/resources/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/resources/META-INF/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/resources/META-INF/jboss-beans.xml
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/resources/conf/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/resources/conf/configuration.xml
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/resources/conf/mc-int-config.xml
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/pom.xml
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/ExternalMCInjectionTest.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest2.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest3.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest4.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/tests/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/tests/JUnitInvokerServlet.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/tests/LogOutputStream.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/tests/TeeOutputStream.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/webapp/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/webapp/WEB-INF/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/webapp/WEB-INF/web.xml
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/CopiedException.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/FailuresParser.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/LineReader.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestExternalMCInjectionIntegration.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration2.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration3.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration4.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/pom.xml
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/InterceptMC.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCComponentAdapter.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCInjectionMode.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCIntConfig.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCIntegrationImpl.java
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/pom.xml
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/src/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/src/main/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/src/main/java/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/src/main/java/org/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/src/main/java/org/jboss/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/src/main/java/org/jboss/dependency/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/src/main/java/org/jboss/dependency/plugins/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/src/main/java/org/jboss/dependency/plugins/helpers/
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/src/main/java/org/jboss/dependency/plugins/helpers/StatelessController.java
kernel/trunk/exo.kernel.mc-integration/pom.xml
Modified:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/CachingContainer.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/web/PortalContainerConfigOwner.java
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/web/PortalContainerCreator.java
kernel/trunk/pom.xml
Log:
Merged mc-int-branch up to r1073
Modified:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/CachingContainer.java
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/CachingContainer.java 2009-12-15
17:28:17 UTC (rev 1073)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/CachingContainer.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -18,6 +18,7 @@
*/
package org.exoplatform.container;
+import org.exoplatform.container.mc.MCIntegrationContainer;
import org.picocontainer.ComponentAdapter;
import org.picocontainer.Parameter;
import org.picocontainer.PicoContainer;
@@ -26,7 +27,6 @@
import org.picocontainer.PicoVisitor;
import org.picocontainer.defaults.AbstractPicoVisitor;
import org.picocontainer.defaults.ComponentAdapterFactory;
-import org.picocontainer.defaults.DefaultPicoContainer;
import org.picocontainer.defaults.DuplicateComponentKeyRegistrationException;
import java.util.List;
@@ -37,7 +37,7 @@
* @author <a href="mailto:julien.viet@exoplatform.com">Julien
Viet</a>
* @version $Revision$
*/
-public class CachingContainer extends DefaultPicoContainer
+public class CachingContainer extends MCIntegrationContainer
{
private final ConcurrentMap<Class, ComponentAdapter> adapterByType =
Added:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegration.java
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegration.java
(rev 0)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegration.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,65 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.container.mc;
+
+import org.picocontainer.ComponentAdapter;
+
+import javax.servlet.ServletContext;
+
+/**
+ * The interface used to loosely couple mc-integration to exo-container
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public interface MCIntegration
+{
+ /**
+ * Apply mc-integration interception.
+ *
+ * @param componentAdapter the original component adapter
+ * @return appropriate compomnent adapter - either the original,
+ * or one wrapping the original with mc-integration wrapper
+ */
+ ComponentAdapter getMCAdapter(ComponentAdapter componentAdapter);
+
+ /**
+ * Check if JBoss MC Kernel is available.
+ *
+ * @param adapter
+ * @return true if mc kernel is available
+ */
+ boolean hasMCKernel(ComponentAdapter adapter);
+
+ /**
+ * Initialize thread context with mc kernel retrieved through ServletContext.
+ *
+ * @param ctx Servlet context
+ */
+ void initThreadCtx(ServletContext ctx);
+
+ /**
+ * Clean up any thread context data stored during initThreadCtx().
+ *
+ * @param ctx Servlet context
+ */
+ void resetThreadCtx(ServletContext ctx);
+}
Added:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegrationContainer.java
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegrationContainer.java
(rev 0)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegrationContainer.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,130 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.container.mc;
+
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.picocontainer.ComponentAdapter;
+import org.picocontainer.PicoContainer;
+import org.picocontainer.defaults.ComponentAdapterFactory;
+import org.picocontainer.defaults.DefaultPicoContainer;
+
+/**
+ * Container class that serves as an interception point for MC integration.
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class MCIntegrationContainer extends DefaultPicoContainer
+{
+ /**
+ * Logger
+ */
+ private static Log log = ExoLogger.getLogger(MCIntegrationContainer.class);
+
+ /**
+ * Constructor that exposes super constructor.
+ *
+ * @param componentAdapterFactory
+ * @param parent
+ */
+ public MCIntegrationContainer(ComponentAdapterFactory componentAdapterFactory,
PicoContainer parent)
+ {
+ super(componentAdapterFactory, parent);
+ }
+
+ /**
+ * Constructor that exposes super constructor.
+ *
+ * @param parent
+ */
+ public MCIntegrationContainer(PicoContainer parent)
+ {
+ super(parent);
+ }
+
+ /**
+ * Constructor that exposes super constructor.
+ *
+ * @param componentAdapterFactory
+ */
+ public MCIntegrationContainer(ComponentAdapterFactory componentAdapterFactory)
+ {
+ super(componentAdapterFactory);
+ }
+
+ /**
+ * Constructor that exposes super constructor.
+ */
+ public MCIntegrationContainer()
+ {
+ }
+
+ /**
+ * Method interception that swaps the original component adapter for intercepting one
+ * for components that require mc integration.
+ * If mc integration isn't available in the current runtime environment, then
interception
+ * simply delegates to parent without interfering.
+ *
+ * @param componentAdapter original component adapter
+ * @return the original component adapter, or the intercepting component adapter
+ * that takes care of mc integration
+ */
+ public ComponentAdapter registerComponent(ComponentAdapter componentAdapter)
+ {
+ ComponentAdapter adapter = componentAdapter;
+ if (hasMCKernel(componentAdapter))
+ {
+ try
+ {
+ 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;
+ }
+
+ /**
+ * Check if runtime environment supports mc integration.
+ *
+ * @param componentAdapter original component adapter
+ * @return true if mc integration is supported
+ */
+ public static boolean hasMCKernel(ComponentAdapter componentAdapter)
+ {
+ try
+ {
+ return MCIntegrationInvoker.hasMCKernel(componentAdapter);
+ }
+ catch (Exception ignored)
+ {
+ log.warn("MC integration failed - maybe not supported in this environment
(component: "
+ + componentAdapter.getComponentKey() + ")", ignored);
+ }
+ return false;
+ }
+}
Added:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegrationInvoker.java
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegrationInvoker.java
(rev 0)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/mc/MCIntegrationInvoker.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,164 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.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;
+
+/**
+ * This class performs a loosely coupled integration to mc-integration logic.
+ * MC integration provides the ability to inject JBoss MC configured beans into
+ * exo-kernel configured services.
+ *
+ * MC integration is only available when GateIn is running inside JBossAS or on top of
JBoss MC.
+ * When integration is not available the default behavior is used - as if this class was
never called.
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class MCIntegrationInvoker
+{
+ /**
+ * Logger
+ */
+ private static Log log = ExoLogger.getLogger(MCIntegrationInvoker.class);
+
+ /**
+ * Reference to actual implementation of mc-integration - the one with hard
dependencies on JBoss MC Kernel.
+ */
+ private static MCIntegration mcInt;
+
+ /**
+ * Error flag. When set it signals that MC integration is not available in current
runtime environment.
+ */
+ private static boolean permFailure;
+
+ /**
+ * @see MCIntegration#getMCAdapter(org.picocontainer.ComponentAdapter)
+ */
+ public static synchronized ComponentAdapter getMCAdapter(ComponentAdapter
componentAdapter)
+ {
+ MCIntegration mcInt = getMCIntegration();
+ if (mcInt == null)
+ {
+ return componentAdapter;
+ }
+
+ return mcInt.getMCAdapter(componentAdapter);
+ }
+
+ /**
+ * @see MCIntegration#hasMCKernel(org.picocontainer.ComponentAdapter)
+ */
+ public static synchronized boolean hasMCKernel(ComponentAdapter adapter)
+ {
+ MCIntegration mcInt = getMCIntegration();
+ if (mcInt == null)
+ {
+ return false;
+ }
+ return mcInt.hasMCKernel(adapter);
+ }
+
+ /**
+ * @see MCIntegration#initThreadCtx(javax.servlet.ServletContext)
+ */
+ public static synchronized void initThreadCtx(ServletContext ctx)
+ {
+ MCIntegration mcInt = getMCIntegration();
+ if (mcInt == null)
+ {
+ return;
+ }
+ mcInt.initThreadCtx(ctx);
+ }
+
+ /**
+ * @see MCIntegration#resetThreadCtx(javax.servlet.ServletContext)
+ */
+ public static synchronized void resetThreadCtx(ServletContext ctx)
+ {
+ MCIntegration mcInt = getMCIntegration();
+ if (mcInt == null)
+ {
+ return;
+ }
+ mcInt.resetThreadCtx(ctx);
+ }
+
+ /**
+ * Get a reference to actual implementation of MCIntegration if one is available.
+ * Log a warning if mc integration is not available.
+ * @return MCIntegration implementation
+ */
+ 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.warn("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;
+ }
+
+ /**
+ * Helper method for proper classloading fallback.
+ */
+ 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;
+ }
+}
Added:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/util/EnvSpecific.java
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/util/EnvSpecific.java
(rev 0)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/util/EnvSpecific.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,52 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.container.util;
+
+import javax.servlet.ServletContext;
+
+/**
+ * This class makes environment specific thread context initializations.
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class EnvSpecific {
+
+ /**
+ * Perform environment specific thread context initialization.
+ *
+ * @param ctx ServletContext
+ */
+ public static void initThreadEnv(ServletContext ctx) {
+ if (JBossEnv.isAvailable(ctx))
+ JBossEnv.initThreadEnv(ctx);
+ }
+
+ /**
+ * Perform environment specific thread context cleanup.
+ *
+ * @param ctx ServletContext
+ */
+ public static void cleanupThreadEnv(ServletContext ctx) {
+ if (JBossEnv.isAvailable(ctx))
+ JBossEnv.cleanupThreadEnv(ctx);
+ }
+}
\ No newline at end of file
Added:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/util/JBossEnv.java
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/util/JBossEnv.java
(rev 0)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/util/JBossEnv.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,70 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.container.util;
+
+import javax.servlet.ServletContext;
+import org.exoplatform.container.mc.MCIntegrationInvoker;
+
+/**
+ * This class makes thread context initialization when GateIn runs inside JBossAS or MC.
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class JBossEnv
+{
+ /**
+ * A servlet context attribute to check for mc kernel.
+ * The 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.
+ *
+ * @param ctx ServletContext
+ * @return true if we're running within JBoss MC environment
+ */
+ public static boolean isAvailable(ServletContext ctx)
+ {
+ return ctx.getAttribute(MC_KERNEL_NAME) != null;
+ }
+
+ /**
+ * Perform JBoss MC environment specific thread context initialization.
+ *
+ * @param ctx ServletContext
+ */
+ public static void initThreadEnv(ServletContext ctx)
+ {
+ MCIntegrationInvoker.initThreadCtx(ctx);
+ }
+
+ /**
+ * Perform thread context cleanup.
+ *
+ * @param ctx ServletContext
+ */
+ public static void cleanupThreadEnv(ServletContext ctx)
+ {
+ MCIntegrationInvoker.resetThreadCtx(ctx);
+ }
+}
\ No newline at end of file
Modified:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/web/PortalContainerConfigOwner.java
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/web/PortalContainerConfigOwner.java 2009-12-15
17:28:17 UTC (rev 1073)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/web/PortalContainerConfigOwner.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -19,6 +19,7 @@
import org.exoplatform.container.PortalContainer;
import org.exoplatform.container.RootContainer.PortalContainerPostInitTask;
import org.exoplatform.container.RootContainer.PortalContainerPreInitTask;
+import org.exoplatform.container.util.EnvSpecific;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
@@ -46,7 +47,17 @@
portalContainer.registerContext(context);
}
};
- PortalContainer.addInitTask(event.getServletContext(), task);
+
+ ServletContext ctx = event.getServletContext();
+ try
+ {
+ EnvSpecific.initThreadEnv(ctx);
+ PortalContainer.addInitTask(ctx, task);
+ }
+ finally
+ {
+ EnvSpecific.cleanupThreadEnv(ctx);
+ }
}
public void contextDestroyed(ServletContextEvent event)
Modified:
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/web/PortalContainerCreator.java
===================================================================
---
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/web/PortalContainerCreator.java 2009-12-15
17:28:17 UTC (rev 1073)
+++
kernel/trunk/exo.kernel.container/src/main/java/org/exoplatform/container/web/PortalContainerCreator.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -17,7 +17,9 @@
package org.exoplatform.container.web;
import org.exoplatform.container.RootContainer;
+import org.exoplatform.container.util.EnvSpecific;
+import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
@@ -45,7 +47,16 @@
*/
public void contextInitialized(ServletContextEvent event)
{
- RootContainer rootContainer = RootContainer.getInstance();
- rootContainer.createPortalContainers();
+ ServletContext ctx = event.getServletContext();
+ try
+ {
+ EnvSpecific.initThreadEnv(ctx);
+ RootContainer rootContainer = RootContainer.getInstance();
+ rootContainer.createPortalContainers();
+ }
+ finally
+ {
+ EnvSpecific.cleanupThreadEnv(ctx);
+ }
}
}
Added: kernel/trunk/exo.kernel.mc-integration/README.txt
===================================================================
--- kernel/trunk/exo.kernel.mc-integration/README.txt (rev 0)
+++ kernel/trunk/exo.kernel.mc-integration/README.txt 2009-12-15 17:38:27 UTC (rev 1074)
@@ -0,0 +1,144 @@
+
+JBoss Microcontainer Integration
+
+
+== What's it all about ==
+
+JBoss Microcontainer integration (MC integration for short) makes it possible to inject
components deployed as MC beans into components deployed as exo-kernel service components.
Exo-kernel is the bottom layer on top of which GateIn si built as a set of services.
Exo-kernel uses picocontainer as extremely lightweight dependency-injection (DI)
container. All eXo Platform and GateIn components are configured and deployed as
exo-kernel services. When deployed to JBossAS, there is another DI container available -
JBoss Microcontainer which is the bottom layer through which all JBossAS service
components are configured and deploy. MC Integration makes it possible apply JBoss
Microcontainer dependency-injection to GateIn components deployed through exo-kernel.
+
+There is no support for MC integration in Tomcat deployment. If a component annotated
with @InterceptMC is deployed, a warning is logged, but the component will be deployed
anyway - without injections being applied.
+
+
+== How to use ==
+
+
+There is an annotation @InterceptMC, that you annotate your service component with, to
turn on MC integration for that component. MC integration only works in JBossAS, so any
components that rely on it have to provide alternative injection mechanisms when deployed
in Tomcat or somewhere else (i.e. using exo-kernel configuration for injections), or wire
up components manually - hardcoded in a component that does just that.
+
+Sometimes you may want to inject JBossAS components per service instance. If you annotate
a class, then all instances of this class will share the same configuration, you can't
have one instance of the class having one configuration, and another instance of the same
class having a different configuration.
+
+There is an xml file based configuration mechanism that allows you to enable MC
integration for a service (per class, as well as per instance), and configure injection
points and injected values.
+
+For an example of MC integration by using annotations see:
http://anonsvn.jboss.org/repos/exo-jcr/kernel/branches/mc-int-branch/exo....
+
+For an example of MC integration by using external configuration see:
http://anonsvn.jboss.org/repos/exo-jcr/kernel/branches/mc-int-branch/exo....
+
+Both these examples use exo-kernel configuration file for creation of service instances:
http://anonsvn.jboss.org/repos/exo-jcr/kernel/branches/mc-int-branch/exo....
+
+That's eXo kernel configuration file, with eXo configurator specific syntax, used to
configure DI performed by eXo kernel when configuring and instantiating service
components. All GateIn services are configured through this.
+
+
+The external configuration example also uses injection configuration file:
http://anonsvn.jboss.org/repos/exo-jcr/kernel/branches/mc-int-branch/exo....
+
+The configuration format is the same as for jboss-beans.xml files. With a few exception:
+ - 'bean' element's 'name' attribute refers to configuration.xml
'component' element's 'key' attribute
+ - elements for aop configuration, constructor injections, and many others have no
effect
+
+Annotation configuration in mc-int-config.xml overrides any compiled annotations on
classes. That means, every instance of the same service class can be specifically targeted
for MC injections, and any existing hardwired class annotation can be nullified through
configuration.
+
+Only when a component is marked with @InterceptMC annotation, will it have its mc-kernel
injection annotations process by mc-kernel, as part of MC integration.
+
+
+== MC integration demo ==
+
+
+The demo demonstrates POJO creation via exo-kernel and use of MC injection annotations
(or xml configuration) to have some services injected into our exo-kernel-deployed POJO by
MC.
+
+We have three service objects - InjectedBean, InjectingBean, and
ExternallyControlledInjectingBean, packaged in a single jar.
+
+InjectedBeans gets instantiated by JBossAS deployer via META-INF/jboss-beans.xml.
InjectingBean and ExternallyControlledInjectingBean on the other hand gets instantiated by
exo-kernel via conf/configuration.xml.
+
+Exo-kernel knows nothing about InjectedBean, but because InjectingBean is annotated with
@InterceptMC it is processed by MC integration logic when instantiated by exo-kernel. The
processing pipes it through MC-kernel logic which processes MC-kernel injection
annotations, and performs injection of components. The same goes for
ExternallyControlledInjectingBean.
+
+Of course, MC-kernel knows nothing about exo-kernel service objects - it can only inject
components deployed through one of JBossAS deployers that use MC-kernel to instantiate -
or at least register - components.
+
+InjectingBean demonstrates several different ways in which you can perform injection of
JBoss services into a component. If instead of using exo-kernel to deploy InjectingBean,
you deploy it through JBossAS, these annotations will work just the same - JBossAS uses
MC-kernel, and MC-kernel will process the annotations.
+
+There are many annotations used in InjectingBean.java. Apart from @InterceptMC they are
all mc-kernel annotations used to configure injections.
+
+ExternallyControlledInjectingBean.java on the other hand contains no annotations at all.
All injections are configured externally in conf/mc-int-config.xml.
+
+@InterceptMC is introduced by MC integration to mark classes that should be integrated
with MC. Through it you can also control what kind of injections you want MC to perform.
By default, field injections are disabled by MC-kernel, as they are deemed an anti-pattern
for service objects - they may make your code more difficult to maintain in the long run,
as you are giving up the ability to intercept the setting of the field.
+
+Service objects instantiated through exo-kernel don't become part of MC-kernel object
repository. That means that dependency management can't be performed by MC-kernel,
which means that all the dependencies InjectingBean needs have to be fulfilled before
MC-kernel first learns about it. Usually MC-kernel makes several passes over the whole
deployment (all the deployment archives), first learning about services and their
dependencies, then starting up services that have no dependencies first, and services with
dependencies later - when their dependencies are fulfilled.
+
+When using MC integration, we need to make sure, that all the dependencies have already
been installed before exo-kernel bootstrap happens. This can be done by deploying all
jboss beans as .jars containing META-INF/jboss-beans.xml in deploy dir. JBossAS deploys
.jars before .wars and .ears.
+
+
+== Things to look out for ==
+
+There are several exo-kernel bootstrap points that may be used when creating your GateIn
portals:
+
+Always use either:
+
+exo-kernel/exo.kernel.container:
org.exoplatform.container.web.PortalContainerConfigOwner
+
+or
+
+gatein/portal/trunk/component/web: org.exoplatform.web.GenericHttpListener
+
+
+Never use PortalContainer or RootContainer before first making sure one of the above two
proper GateIn initialization points are invoked.
+
+
+
+== Building and deploying ==
+
+
+ === exo-kernel ===
+
+cd $REPO/exo-jcr/kernel/branches
+svn co
https://svn.jboss.org/repos/exo-jcr/kernel/branches/mc-int-branch
+cd mc-int-branch
+mvn install
+
+
+ === packager ===
+
+cd $REPO/gatein/tools/packager/branches
+svn co
https://svn.jboss.org/repos/gatein/tools/packager/branches/mc-integration
+cd mc-integration
+mvn install
+
+
+ === portal ===
+
+cd $REPO/gatein/portal/branches
+svn co
https://svn.jboss.org/repos/gatein/portal/branches/mc-integration
+cd mc-integration
+mvn install -Dmaven.test.skip=true
-Dgatein.checkout.dir=$REPO/gatein/portal/branches/mc-integration
+
+
+
+ === Packaging and running GateIn with demo and integration tests deployed ===
+
+cd $REPO/gatein/portal/branches/mc-integration/packaging/pkg
+
+FOR JBOSSAS:
+
+ mvn install -Ppkg-jbossas-tests
-Dexo.projects.directory.dependencies=REPLACE_WITH_YOUR_OWN_DIRECTORY
-Dgatein.checkout.dir=$REPO/gatein/portal/branches/mc-integration
+ cd $REPO/gatein/portal/branches/mc-integration/packaging/pkg/target/jboss/bin
+ run
+
+FOR TOMCAT (MC integration won't work, but integration tests should pass):
+
+ mvn install -Ppkg-tomcat-tests
-Dexo.projects.directory.dependencies=REPLACE_WITH_YOUR_OWN_DIRECTORY
-Dgatein.checkout.dir=$REPO/gatein/portal/branches/mc-integration
+ cd $REPO/gatein/portal/branches/mc-integration/packaging/pkg/target/tomcat/bin
+ gatein run
+
+
+
+ === Running the integration tests ===
+
+cd
$REPO/exo-jcr/kernel/branches/mc-int-branch/exo.kernel.mc-integration/exo.kernel.mc-int-tests/
+mvn -Ptests
+
+
+
+If you run your server on non-default IP:port use something like:
+mvn -Ptests -DforkMode=none -Dserver.host=127.0.0.1 -Dserver.port=8000
+
+(Don't forget -DforkMode=none otherwise system properties won't get propagated to
the test class)
+
+
+
+(eof)
Added: kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/pom.xml
(rev 0)
+++ kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/pom.xml 2009-12-15 17:38:27
UTC (rev 1074)
@@ -0,0 +1,59 @@
+
+<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>mc-integration-parent</artifactId>
+ <version>2.2.0-Beta05-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>exo.kernel.mc-int</artifactId>
+
+ <name>eXo Kernel :: MC Kernel Integration :: Implementation</name>
+ <description>MC Kernel Integration Implementation</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/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/InterceptMC.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/InterceptMC.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/InterceptMC.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,45 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.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
+{
+ /**
+ * Injection mode
+ *
+ * @return MCInjectionMode enumeration constant representing injection mode
+ */
+ MCInjectionMode injectionMode() default MCInjectionMode.STANDARD;
+}
Added:
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCComponentAdapter.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCComponentAdapter.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCComponentAdapter.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,220 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.container.mc.impl;
+
+import org.jboss.beans.info.spi.BeanAccessMode;
+import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
+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;
+
+/**
+ * A wrapping adapter, that takes care of mc integration at component instantiation
time.
+ *
+ * @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
+{
+ /**
+ * Kernel controller retrieved from associated mc kernel.
+ */
+ private KernelController controller;
+
+ /**
+ * Original component adapter.
+ */
+ private ComponentAdapter delegate;
+
+ /**
+ * Interception marking annotation, configured for the component.
+ */
+ private InterceptMC interceptMC;
+
+ /**
+ * A component instance handled by this component adapter.
+ */
+ private Object lastComponentInstance;
+
+ /**
+ * BeanMetaData parsed from mc-int-config.xml
+ */
+ private AbstractBeanMetaData metaData;
+
+ /**
+ * The only constructor.
+ *
+ * @param controller Kernel controller to use
+ * @param delegate original component adapter
+ * @param interceptMC mc-integration configuration in the form of annotation
+ */
+ public MCComponentAdapter(KernelController controller, ComponentAdapter delegate,
+ InterceptMC interceptMC, AbstractBeanMetaData data)
+ {
+ 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;
+ this.metaData = data;
+ }
+
+ /**
+ * Getter method for component key.
+ *
+ * @return String or Class representing a key
+ */
+ public Object getComponentKey()
+ {
+ return delegate.getComponentKey();
+ }
+
+ /**
+ * Getter for component implementation class.
+ *
+ * @return component implementation class
+ */
+ public Class getComponentImplementation()
+ {
+ return delegate.getComponentImplementation();
+ }
+
+ /**
+ * This is where mc integration happens.
+ * Instantiation is first delegated to original component adapter, the resulting
+ * instance is then sent through kernel controller to be injected by mc kernel.
+ *
+ * @param container pico container that holds this component adapter
+ * @return object with injections already performed on it
+ * @throws PicoInitializationException
+ * @throws PicoIntrospectionException
+ */
+ 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
+ {
+ if (metaData == null)
+ {
+ metaData = new AbstractBeanMetaData();
+ }
+ metaData.setName(key);
+ metaData.setBean(instance.getClass().getName());
+ BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder(metaData);
+ builder.setConstructorValue(instance);
+ builder.ignoreCreate();
+ builder.ignoreStart();
+ builder.ignoreStop();
+ builder.ignoreDestroy();
+ builder.setAccessMode(getInjectionMode(interceptMC));
+ KernelControllerContext ctx = new AbstractKernelControllerContext(null,
builder.getBeanMetaData(), null);
+
+ 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;
+ }
+ catch (Throwable ex)
+ {
+ throw new RuntimeException("Failed to perform MC interception on component:
" + delegate.getComponentImplementation(), ex);
+ }
+ }
+
+ /**
+ * Method to determine injection mode to be used by mc kernel.
+ *
+ * @param interceptMC configuration in form of InterceptMC annotation
+ * @return jboss-beans-info BeanAccessMode
+ */
+ 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;
+ }
+ }
+
+ /**
+ * Delegation-only method.
+ *
+ * @param container
+ * @throws PicoIntrospectionException
+ */
+ public void verify(PicoContainer container) throws PicoIntrospectionException
+ {
+ delegate.verify(container);
+ }
+
+ /**
+ * Delegation-only method.
+ *
+ * @param visitor
+ */
+ public void accept(PicoVisitor visitor)
+ {
+ delegate.accept(visitor);
+ }
+}
\ No newline at end of file
Added:
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCInjectionMode.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCInjectionMode.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCInjectionMode.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,46 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.container.mc.impl;
+
+/**
+ * Annotation that represents injection mode.
+ * One-to-one mapped to org.jboss.beans.info.spi.BeanAccessMode
+ *
+ * @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/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCIntConfig.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCIntConfig.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCIntConfig.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,269 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.container.mc.impl;
+
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
+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;
+
+/**
+ * Configuration reader and holder for conf/mc-int-config.xml
+ *
+ * mc-int-config.xml uses jboss bean deployer syntax (the one used in jboss-beans.xml).
+ * It is only interested in annotation and injection configuration though, and
doesn't treat <bean> element attributes
+ * as referring to mc bean declarations - it treats them as references to exo-kernel
components.
+ * <p>
+ * Example:
+ * <pre>
+ * <deployment xmlns="urn:jboss:bean-deployer:2.0">
+ * <bean
class="org.exoplatform.container.definition.PortalContainerConfig">
+ *
<annotation>(a)org.exoplatform.container.mc.impl.InterceptMC</annotation>
+ * </bean>
+ * <bean name="InjectingBean2">
+ *
<annotation>(a)org.exoplatform.container.mc.impl.InterceptMC(injectionMode=org.exoplatform.container.mc.impl.MCInjectionMode.STANDARD)</annotation>
+ * </bean>
+ * </pre>
+ * <p>
+ * In the above example the first <em>bean</em> declaration refers to
exo-kernel configured service that
+ * is returned by exo container when calling getComponentInstanceOfType(clazz).
+ *
+ * The second <em>bean</em> declaration refers to exo-kernel configured
service that is returned by exo
+ * container when calling getComponentInstance(name).
+ *
+ * This configuration makes it possible to activate injection outside of you classes.
When annotations are declared both
+ * inside the class, and in mc-int-config.xml, the latter completely overrides the
former.
+ * It is also possible to use mc-int-config.xml to nullify an existing annotation in your
service class.
+ *
+ * <em>Warning:</em> Make sure there are no leading or trailing white spaces
in the body of <em>annotation</em> element.
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class MCIntConfig
+{
+ /**
+ * Logger.
+ */
+ private static final Log log = ExoLogger.getLogger(MCIntConfig.class);
+
+ /**
+ * Configuration for <em>beans</em> specified with
<em>name</em>.
+ */
+ private Map<String, DeploymentData> confByKey = new HashMap<String,
DeploymentData>();
+
+ /**
+ * Configuration for <em>beans</em> specified with
<em>class</em>.
+ */
+ private Map<String, DeploymentData> confByBean = new HashMap<String,
DeploymentData>();
+
+ /**
+ * The only constructor.
+ */
+ MCIntConfig()
+ {
+ Enumeration<URL> urls = null;
+ try
+ {
+ urls =
Thread.currentThread().getContextClassLoader().getResources("conf/mc-int-config.xml");
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException("Failed to get resources:
conf/mc-int-config.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));
+ }
+ }
+ }
+
+ /**
+ * Retrieve configuration by component key.
+ *
+ * @param key component key
+ * @return configuration for specific component
+ */
+ public AbstractBeanMetaData getByKey(String key)
+ {
+ DeploymentData dd = confByKey.get(key);
+ if (dd == null)
+ {
+ return null;
+ }
+ return (AbstractBeanMetaData) dd.data;
+ }
+
+ /**
+ * Retrieve configuration by component type.
+ *
+ * @param bean component type
+ * @return configuration for specific component
+ */
+ public AbstractBeanMetaData getByBean(String bean)
+ {
+ DeploymentData dd = confByBean.get(bean);
+ if (dd == null)
+ {
+ return null;
+ }
+ return (AbstractBeanMetaData) dd.data;
+ }
+
+ /**
+ * Retrieve configuration for specific component adapter.
+ * First lookup by key, then by type.
+ *
+ * @param adapter component adapter
+ * @return configuration for specific component
+ */
+ public AbstractBeanMetaData 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 (AbstractBeanMetaData) ret;
+ }
+
+ ret = getByBean(strKey);
+ return (AbstractBeanMetaData) ret;
+ }
+
+ /**
+ * Add parsed configuration for one component.
+ *
+ * @param deploymentData confiuration for specific component
+ */
+ 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());
+ }
+ }
+
+ /**
+ * Parse the configuration.
+ *
+ * @param factory JBoss XB unmarshaller factory
+ * @param resolver JBoss XB schema resolver
+ * @param url Url pointing to mc-int-config.xml file
+ * @return JBoss XB bean representing a parsed configuration
+ */
+ 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;
+ }
+
+ /**
+ * Data structure that holds component configuration - deployment configuration
association.
+ */
+ static class DeploymentData
+ {
+ KernelDeployment deployment;
+ BeanMetaData data;
+
+ public DeploymentData(KernelDeployment deployment, BeanMetaData data)
+ {
+ this.deployment = deployment;
+ this.data = data;
+ }
+ }
+}
Added:
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCIntegrationImpl.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCIntegrationImpl.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int/src/main/java/org/exoplatform/container/mc/impl/MCIntegrationImpl.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,182 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.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.plugins.AbstractBeanMetaData;
+import org.jboss.beans.metadata.spi.AnnotationMetaData;
+import org.jboss.kernel.Kernel;
+import org.jboss.kernel.plugins.dependency.AbstractKernelController;
+import org.jboss.mc.common.ThreadLocalUtils;
+import org.jboss.mc.servlet.vdf.api.VDFThreadLocalUtils;
+import org.picocontainer.ComponentAdapter;
+
+import javax.servlet.ServletContext;
+import java.lang.annotation.Annotation;
+import java.util.Set;
+
+/**
+ * Implementation of MCIntegration that contains hard dependencies on JBoss
Microcontainer.
+ *
+ * There is a reflection style dependency on this class in
+ * {@link org.exoplatform.container.mc.MCIntegrationInvoker}.
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class MCIntegrationImpl implements MCIntegration
+{
+ /**
+ * Logger
+ */
+ private static Log log = ExoLogger.getLogger(MCIntegrationImpl.class);
+
+ /**
+ * A singleton MCIntegration implementation
+ */
+ private static MCIntegration mcint;
+
+ /**
+ * JBoss MC kernel controller that we use
+ */
+ private AbstractKernelController rootController;
+
+ /**
+ * Configuration parser and holder
+ */
+ private MCIntConfig conf;
+
+ /**
+ * A factory method. In principle can return different implementations based on the
running environment.
+ * Currently only one implementation exists.
+ */
+ public synchronized static MCIntegration getInstance()
+ {
+ if (mcint == null)
+ {
+ mcint = new MCIntegrationImpl();
+ }
+ return mcint;
+ }
+
+ /**
+ * Single constructor - private to force usage of factory method {@link
MCIntegrationImpl#getInstance()}.
+ */
+ private MCIntegrationImpl()
+ {
+ // load conf/mc-int-config.xml
+ conf = new MCIntConfig();
+ }
+
+ /**
+ * Get kernel controller associated with appropriate mc kernel
+ * @return kernel controller
+ */
+ 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;
+ }
+ }
+ return rootController;
+ }
+
+ /**
+ * Check if component should pass through mc kernel injection based on class
annotations,
+ * and mc-int-config.xml configuration.
+ * Wrap with intercepting component adapter (@link MCComponentAdapter} or return
original adapter.
+ *
+ * @see MCIntegration#getMCAdapter(org.picocontainer.ComponentAdapter)
+ */
+ public ComponentAdapter getMCAdapter(ComponentAdapter adapter)
+ {
+ InterceptMC interceptAnnotation = null;
+
+ AbstractBeanMetaData 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,
data);
+ }
+ return adapter;
+ }
+
+ /**
+ * @see MCIntegration#hasMCKernel(org.picocontainer.ComponentAdapter)
+ */
+ public boolean hasMCKernel(ComponentAdapter adapter)
+ {
+ return ThreadLocalUtils.getKernel() != null;
+ }
+
+ /**
+ * @see MCIntegration#initThreadCtx(javax.servlet.ServletContext)
+ */
+ public void initThreadCtx(ServletContext ctx)
+ {
+ VDFThreadLocalUtils.init(ctx);
+ }
+
+ /**
+ * @see MCIntegration#resetThreadCtx(javax.servlet.ServletContext)
+ */
+ public void resetThreadCtx(ServletContext ctx)
+ {
+ VDFThreadLocalUtils.reset();
+ }
+}
Added: kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/pom.xml
(rev 0)
+++ kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/pom.xml 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,36 @@
+<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>mc-integration-parent</artifactId>
+ <version>2.2.0-Beta05-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>exo.kernel.mc-int-demo</artifactId>
+
+ <name>eXo Kernel :: MC Kernel Integration :: Demo</name>
+ <description>MC Kernel Integration Demo</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>picocontainer</groupId>
+ <artifactId>picocontainer</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.exoplatform.kernel</groupId>
+ <artifactId>exo.kernel.mc-int</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.microcontainer</groupId>
+ <artifactId>jboss-kernel</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>javax.transaction</groupId>
+ <artifactId>jta</artifactId>
+ <version>1.0.1B</version>
+ </dependency>
+ </dependencies>
+
+</project>
Added:
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/org/exoplatform/kernel/demos/mc/ExternallyControlledInjectingBean.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/org/exoplatform/kernel/demos/mc/ExternallyControlledInjectingBean.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/org/exoplatform/kernel/demos/mc/ExternallyControlledInjectingBean.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,253 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.kernel.demos.mc;
+
+import org.jboss.dependency.spi.Controller;
+import org.picocontainer.Startable;
+
+import javax.transaction.TransactionManager;
+import java.util.Map;
+
+/**
+ * This POJO demonstrates how to use external configuration (mc-int-config.xml)
+ * to perform injections of JBoss Microcontainer components
+ * into a service object configured and managed through exo-kernel.
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class ExternallyControlledInjectingBean implements Startable
+{
+ /**
+ * An example of getting the JBoss MC configured transaction manager
+ * into an exo-kernel installed service.
+ * This field is to be injected through setter method by mc kernel.
+ */
+ private TransactionManager tm;
+
+ /**
+ * Field to be injected through setter method by mc kernel.
+ */
+ private InjectedBean bean;
+
+ /**
+ * A map field to be injected through setter method by mc kernel.
+ */
+ private Map bindingsMap;
+
+ /**
+ * A field to be injected with a property value of existing mc bean.
+ * Demonstrates another kind of injection.
+ */
+ private String stringValue;
+
+ /**
+ * Field that counts how many times start() method is called.
+ * This is to demonstrate that start() method is called exactly once.
+ */
+ private int startCount;
+
+ /**
+ * Field that tells if @Install method was successfully called
+ */
+ private boolean installOk;
+
+ /**
+ * Internal datastructure to demonstrate nested property injection
+ */
+ private ConfigurationHolder config;
+
+ /**
+ * In this demo this bean is to be instantiated by exo-kernel.
+ * We can not use constructor based injection that mc kernel supports,
+ * since it's not mc kernel that does the instantiation.
+ */
+ public ExternallyControlledInjectingBean()
+ {
+ config = new ConfigurationHolder();
+ }
+
+ /**
+ * Getter method.
+ * @return
+ */
+ public TransactionManager getTransactionManager()
+ {
+ return tm;
+ }
+
+ /**
+ * Setter method, externally configured as injection point for type matching
injection
+ * @param tm
+ */
+ public void setTransactionManager(TransactionManager tm)
+ {
+ this.tm = tm;
+ }
+
+ /**
+ * Getter method.
+ * @return injected bean
+ */
+ public InjectedBean getBean()
+ {
+ return bean;
+ }
+
+ /**
+ * Setter method, externally configured as injection point for type matching
injection.
+ * @param bean
+ */
+ public void setBean(InjectedBean bean)
+ {
+ this.bean = bean;
+ }
+
+ /**
+ * Getter method.
+ * @return
+ */
+ public Map getBindingsMap()
+ {
+ return bindingsMap;
+ }
+
+ /**
+ * Setter method, externally configured as injection point.
+ * @param bindingsMap
+ */
+ public void setBindingsMap(Map bindingsMap)
+ {
+ this.bindingsMap = bindingsMap;
+ }
+
+ /**
+ * Getter method.
+ * @return
+ */
+ public String getStringValue()
+ {
+ return stringValue;
+ }
+
+ /**
+ * Setter method externally configured as injection point for property getter
injection.
+ * @param stringValue
+ */
+ public void setStringValue(String stringValue)
+ {
+ this.stringValue = stringValue;
+ }
+
+ /**
+ * Getter method.
+ * @return start count
+ */
+ public int getStartCount()
+ {
+ return startCount;
+ }
+
+ /**
+ * org.picocontainer.Startable lifecycle method. Supposed to be called exactly once.
+ */
+ public void start()
+ {
+ startCount++;
+ }
+
+ /**
+ * org.picocontainer.Startable lifecycle method.
+ */
+ public void stop()
+ {
+ }
+
+ /**
+ * Getter method.
+ * @return
+ */
+ public ConfigurationHolder getConfig()
+ {
+ return config;
+ }
+
+ /**
+ * Non-setter method externally configured as injection method called with injected
parameters
+ * @param param1
+ * @param param2
+ * @param param3
+ */
+ public void initialize(String param1, String param2, Controller param3)
+ {
+ if (param1 == null)
+ {
+ throw new IllegalArgumentException("param1 == null");
+ }
+ if (param2 == null)
+ {
+ throw new IllegalArgumentException("param2 == null");
+ }
+ if (param3 == null)
+ {
+ throw new IllegalArgumentException("param3 == null");
+ }
+ installOk = true;
+ }
+
+ /**
+ * Getter method.
+ * @return true if install method was called successfully
+ */
+ public boolean isInstallOk()
+ {
+ return installOk;
+ }
+
+ /**
+ * Inner data structure for testing nested property injection
+ */
+ public static class ConfigurationHolder
+ {
+ /**
+ * Property to be injected
+ */
+ private String someProperty;
+
+ /**
+ * Getter method.
+ * @return someProperty
+ */
+ public String getSomeProperty()
+ {
+ return someProperty;
+ }
+
+ /**
+ * Setter method.
+ * @param someProperty
+ */
+ public void setSomeProperty(String someProperty)
+ {
+ this.someProperty = someProperty;
+ }
+ }
+}
Added:
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/org/exoplatform/kernel/demos/mc/InjectedBean.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/org/exoplatform/kernel/demos/mc/InjectedBean.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/org/exoplatform/kernel/demos/mc/InjectedBean.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,64 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.kernel.demos.mc;
+
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
+/**
+ * A simple POJO that we use for injection.
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class InjectedBean
+{
+ private static final Log log = ExoLogger.getLogger(InjectedBean.class);
+
+ public static final String SOME_PROPERTY_VALUE = "[This is some property
value]";
+
+ private String anotherProperty;
+
+ public InjectedBean()
+ {
+ log.info("InjectedBean instantiated :: " + this);
+ }
+
+ public String getSomeString()
+ {
+ return SOME_PROPERTY_VALUE;
+ }
+
+ public void start()
+ {
+ log.info("Method start() called on InjectedBean");
+ }
+
+ public String getAnotherProperty()
+ {
+ return anotherProperty;
+ }
+
+ public void setAnotherProperty(String anotherProperty)
+ {
+ this.anotherProperty = anotherProperty;
+ }
+}
Added:
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/org/exoplatform/kernel/demos/mc/InjectingBean.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/org/exoplatform/kernel/demos/mc/InjectingBean.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/java/org/exoplatform/kernel/demos/mc/InjectingBean.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,313 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.kernel.demos.mc;
+
+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.InstallMethod;
+import org.jboss.beans.metadata.api.annotations.MapValue;
+import org.jboss.beans.metadata.api.annotations.StringValue;
+import org.jboss.beans.metadata.api.annotations.Value;
+import org.jboss.dependency.spi.Controller;
+import org.jboss.kernel.plugins.bootstrap.basic.KernelConstants;
+import org.jboss.kernel.spi.config.KernelConfigurator;
+
+import javax.transaction.TransactionManager;
+import java.util.Map;
+
+/**
+ * This POJO demonstrates how to use annotations to perform injections of JBoss
Microcontainer components
+ * into a service object configured and managed through exo-kernel.
+ *
+ * If we want our class to be instantiated at deploy time,
+ * it has to implement org.picocontainer.Startable, otherwise it will only
+ * be registered, but not instantiated. MC integration takes place
+ * at instantiation time, not at component registration time.
+ *
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+// Enable field injection by setting injectionMode
+@InterceptMC(injectionMode = MCInjectionMode.ALL)
+public class InjectingBean implements org.picocontainer.Startable
+{
+ /**
+ * Logger
+ */
+ private static final Log log = ExoLogger.getLogger(InjectingBean.class);
+
+ /**
+ * Field to be injected through setter method by mc kernel.
+ */
+ private InjectedBean bean;
+
+ /**
+ * Field to be injected through setter method by mc kernel.
+ */
+ private KernelConfigurator configurator;
+
+ /**
+ * Field to be injected directly through field injection by mc kernel.
+ * This is an anti-pattern as you're exposing implementation details,
+ * and giving up interception capability.
+ */
+ @Inject(bean = "InjectedBean")
+ private InjectedBean injectedBean;
+
+ /**
+ * An example of getting the JBoss MC configured transaction manager
+ * into an exo-kernel installed service.
+ * This field is to be injected through setter method by mc kernel.
+ */
+ private TransactionManager tm;
+
+ /**
+ * A map field to be injected through setter method by mc kernel.
+ */
+ private Map bindingsMap;
+
+ /**
+ * A field to be injected with a property value of existing mc bean.
+ * Demonstrates another kind of injection.
+ */
+ private String stringValue;
+
+ /**
+ * Field that counts how many times start() method is called.
+ * This is to demonstrate that start() method is called exactly once.
+ */
+ private int startCount;
+
+ /**
+ * Field that tells if @Install method was successfully called
+ */
+ private boolean installOk;
+
+ /**
+ * In this demo this bean is to be instantiated by exo-kernel.
+ * We can not use constructor based injection that mc kernel supports,
+ * since it's not mc kernel that does the instantiation.
+ */
+ public InjectingBean()
+ {
+ log.info("Injecting bean instantiated");
+ }
+
+ /**
+ * Getter method.
+ * @return injected bean
+ */
+ public InjectedBean getBean()
+ {
+ return bean;
+ }
+
+ /**
+ * Setter method, annotated as injection point for type matching injection.
+ * @param bean
+ */
+ @Inject
+ public void setBean(InjectedBean bean)
+ {
+ this.bean = bean;
+ log.info("Received InjectedBean: " + bean);
+ }
+
+ /**
+ * Getter method.
+ * @return injected component
+ */
+ public KernelConfigurator getConfigurator()
+ {
+ return configurator;
+ }
+
+ /**
+ * Setter method, annotated as injection point for name matching injection.
+ * @param configurator
+ */
+ @Inject(bean = KernelConstants.KERNEL_CONFIGURATOR_NAME)
+ public void setConfigurator(KernelConfigurator configurator)
+ {
+ this.configurator = configurator;
+ log.info("InjectingBean Received KernelConfigurator: " + configurator);
+ }
+
+ /**
+ * Getter method.
+ * @return
+ */
+ public Map getBindings()
+ {
+ return bindingsMap;
+ }
+
+ /**
+ * Setter method, annotated as injection point with map injecting annotation.
+ * @param bindings
+ */
+ @MapValue(
+ value = {
+ @EntryValue(
+ key = @Value(type = Class.class, string = @StringValue(value =
"org.jboss.dependency.spi.Controller", type = Class.class)),
+ value = @Value(inject = @Inject(bean =
KernelConstants.KERNEL_CONTROLLER_NAME))
+ ),
+ @EntryValue(
+ key = @Value(type = Class.class, string = @StringValue(value =
"org.jboss.kernel.Kernel", type = Class.class)),
+ value = @Value(inject = @Inject(bean =
KernelConstants.KERNEL_NAME))
+ ),
+ @EntryValue(
+ key = @Value(type = Class.class, string = @StringValue(value =
"org.jboss.kernel.spi.dependency.KernelController", type = Class.class)),
+ value = @Value(inject = @Inject(bean =
KernelConstants.KERNEL_CONTROLLER_NAME))
+ ),
+ @EntryValue(
+ key = @Value(type = Class.class, string = @StringValue(value =
"org.jboss.kernel.spi.registry.KernelBus", type = Class.class)),
+ value = @Value(inject = @Inject(bean =
KernelConstants.KERNEL_BUS_NAME))
+ ),
+ @EntryValue(
+ key = @Value(type = Class.class, string = @StringValue(value =
"org.jboss.kernel.spi.registry.KernelRegistry", type = Class.class)),
+ value = @Value(inject = @Inject(bean =
KernelConstants.KERNEL_REGISTRY_NAME))
+ ),
+ @EntryValue(
+ key = @Value(type = Class.class, string = @StringValue(value =
"org.jboss.kernel.spi.config.KernelConfigurator", type = Class.class)),
+ value = @Value(inject = @Inject(bean =
KernelConstants.KERNEL_CONFIGURATOR_NAME))
+ )
+ }
+ )
+ public void setBindings(Map<Class<?>, Object> bindings)
+ {
+ log.info("Received a map with bindings: " + bindings);
+ this.bindingsMap = bindings;
+ }
+
+ /**
+ * Getter method.
+ * @return
+ */
+ public String getSomeStringProperty()
+ {
+ return stringValue;
+ }
+
+ /**
+ * Setter method annotated as injection point for property getter injection.
+ * @param value
+ */
+ @Inject(bean = "InjectedBean", property = "someString")
+ public void setSomeStringProperty(String value)
+ {
+ log.info("Received SomeStringProperty value: " + value);
+ this.stringValue = value;
+ }
+
+ /**
+ * org.picocontainer.Startable lifecycle method. Supposed to be called exactly once.
+ */
+ public void start()
+ {
+ log.warn("start() called (injectedBean is set to: " + injectedBean +
", transactionManager is setTo: " + tm + ")");
+ this.startCount++;
+ }
+
+ /**
+ * org.picocontainer.Startable lifecycle method.
+ */
+ public void stop()
+ {
+ log.info("stop() called");
+ }
+
+ /**
+ * Getter method for field-injected bean.
+ * @return field-injected bean
+ */
+ public InjectedBean getInjectedBean()
+ {
+ return injectedBean;
+ }
+
+ /**
+ * Getter method.
+ * @return start count
+ */
+ public int getStartCount()
+ {
+ return startCount;
+ }
+
+ /**
+ * Setter method annotated as injection point for type matching injection
+ * @param tm
+ */
+ @Inject
+ public void setTransactionManager(TransactionManager tm)
+ {
+ this.tm = tm;
+ }
+
+ /**
+ * Getter method.
+ * @return
+ */
+ public TransactionManager getTransactionManager()
+ {
+ return tm;
+ }
+
+ /**
+ * Non-setter method annotated as injection method called with injected parameters
+ * @param param1
+ * @param param2
+ * @param param3
+ */
+ @InstallMethod
+ public void initialize(@Inject @StringValue("parameter1") String param1,
+ @Inject(bean = "InjectedBean", property =
"someString") String param2,
+ @Inject(bean = KernelConstants.KERNEL_CONTROLLER_NAME)
Controller param3)
+ {
+ if (param1 == null)
+ {
+ throw new IllegalArgumentException("param1 == null");
+ }
+ if (param2 == null)
+ {
+ throw new IllegalArgumentException("param2 == null");
+ }
+ if (param3 == null)
+ {
+ throw new IllegalArgumentException("param3 == null");
+ }
+ installOk = true;
+ }
+
+ /**
+ * Getter method.
+ * @return true if install method was called successfully
+ */
+ public boolean isInstallOk()
+ {
+ return installOk;
+ }
+}
Added:
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/resources/META-INF/jboss-beans.xml
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/resources/META-INF/jboss-beans.xml
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/resources/META-INF/jboss-beans.xml 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,3 @@
+<deployment xmlns="urn:jboss:bean-deployer:2.0">
+ <bean name="InjectedBean"
class="org.exoplatform.kernel.demos.mc.InjectedBean"/>
+</deployment>
\ No newline at end of file
Added:
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/resources/conf/configuration.xml
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/resources/conf/configuration.xml
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/resources/conf/configuration.xml 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<configuration
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
xsi:schemaLocation="http://www.exoplaform.org/xml/ns/kernel_1_0.xsd
http://www.exoplaform.org/xml/ns/kernel_1_0.xsd"
+
xmlns="http://www.exoplaform.org/xml/ns/kernel_1_0.xsd">
+
+ <component>
+ <key>InjectingBean</key>
+ <type>org.exoplatform.kernel.demos.mc.InjectingBean</type>
+ </component>
+ <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>ExternallyControlledInjectingBean</key>
+
<type>org.exoplatform.kernel.demos.mc.ExternallyControlledInjectingBean</type>
+ </component>
+</configuration>
Added:
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/resources/conf/mc-int-config.xml
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/resources/conf/mc-int-config.xml
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-demo/src/main/resources/conf/mc-int-config.xml 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<deployment xmlns="urn:jboss:bean-deployer:2.0">
+
+ <bean name="InjectingBean2">
+ <!-- No leading or trailing white space allowed in annotation element -->
+
<annotation>(a)org.exoplatform.container.mc.impl.InterceptMC(injectionMode=org.exoplatform.container.mc.impl.MCInjectionMode.STANDARD)</annotation>
+ </bean>
+ <bean name="InjectingBean3">
+
<annotation>(a)org.exoplatform.container.mc.impl.InterceptMC(injectionMode=org.exoplatform.container.mc.impl.MCInjectionMode.ALL)</annotation>
+ </bean>
+ <bean name="InjectingBean4"
class="org.exoplatform.kernel.demos.mc.InjectingBean">
+ <!-- NO ANNOTATION -->
+ </bean>
+ <bean name="ExternallyControlledInjectingBean">
+
<annotation>(a)org.exoplatform.container.mc.impl.InterceptMC</annotation>
+ <property
name="transactionManager"><inject/></property>
+ <property name="bean"><inject
bean="InjectedBean"/></property>
+ <property name="bindingsMap">
+ <map keyClass="java.lang.Class"
valueClass="java.lang.Object">
+ <entry>
+ <key>org.jboss.dependency.spi.Controller</key>
+ <value><inject
bean="jboss.kernel:service=KernelController"/></value>
+ </entry>
+ </map>
+ </property>
+ <property name="stringValue"><inject
bean="InjectedBean" property="someString"/></property>
+ <!-- You can't use nested properties for injected properties (i.e. bean), as
property injection order is random -->
+ <!--property name="bean.anotherProperty">Test
value</property-->
+ <property name="config.someProperty">Test value</property>
+ <install method="initialize">
+ <parameter
class="java.lang.String">parameter1</parameter>
+ <parameter
class="java.lang.String">parameter2</parameter>
+ <parameter class="org.jboss.dependency.spi.Controller">
+ <inject bean="jboss.kernel:service=KernelController"/>
+ </parameter>
+ </install>
+ </bean>
+</deployment>
\ No newline at end of file
Added: kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/pom.xml
(rev 0)
+++ kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/pom.xml 2009-12-15
17:38:27 UTC (rev 1074)
@@ -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</groupId>
+ <artifactId>mc-integration-parent</artifactId>
+ <version>2.2.0-Beta05-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>exo.kernel.mc-int-tests</artifactId>
+ <packaging>war</packaging>
+
+ <name>eXo Kernel :: MC Kernel Integration :: Tests</name>
+ <description>MC Kernel 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</groupId>
+ <artifactId>exo.kernel.mc-int-demo</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/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/ExternalMCInjectionTest.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/ExternalMCInjectionTest.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/ExternalMCInjectionTest.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,194 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.kernel.it;
+
+import org.exoplatform.commons.Environment;
+import org.exoplatform.container.RootContainer;
+import org.exoplatform.kernel.demos.mc.ExternallyControlledInjectingBean;
+import org.exoplatform.kernel.demos.mc.InjectedBean;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.jboss.dependency.spi.Controller;
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.transaction.TransactionManager;
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class ExternalMCInjectionTest
+{
+ protected Log log = ExoLogger.getLogger(getClass());
+
+ protected String beanName;
+ protected ExternallyControlledInjectingBean bean;
+ protected boolean inJboss;
+ protected boolean mcIntActive = true;
+
+ public ExternalMCInjectionTest()
+ {
+ beanName = "ExternallyControlledInjectingBean";
+ }
+
+ protected void init()
+ {
+ log.info("init() method called");
+ RootContainer rootContainer = RootContainer.getInstance();
+ bean = (ExternallyControlledInjectingBean)
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();
+ tests();
+ }
+
+ protected void tests()
+ {
+ testTransactionManager();
+ testNameLookupMethodInjection();
+ testMapInjection();
+ testPropertyValueMethodInjection();
+ testNestedPropertyInjection();
+ testInstallMethod();
+ testStarted();
+ }
+
+ protected void testTransactionManager()
+ {
+ TransactionManager tm = bean.getTransactionManager();
+
+ if (inJboss && mcIntActive)
+ {
+ try
+ {
+ int status = tm.getStatus();
+ log.info("Status before tx: " + tm.getStatus());
+ tm.begin();
+ Assert.assertFalse("TX status didn't change: ", status ==
tm.getStatus());
+ log.info("Status in tx: " + tm.getStatus());
+ tm.commit();
+ Assert.assertTrue("TX status didn't return to original: ",
status == tm.getStatus());
+ log.info("Status after tx: " + tm.getStatus());
+ }
+ catch (Exception ex)
+ {
+ throw new RuntimeException("Failed to use TransactionManager: ",
ex);
+ }
+ }
+ else
+ {
+ Assert.assertNull("Injection should not have worked", tm);
+ }
+ log.info("testTransactionManager passed");
+ }
+
+ protected void testNameLookupMethodInjection()
+ {
+ boolean found = bean.getBean() != 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 testMapInjection()
+ {
+ Map bindings = bean.getBindingsMap();
+ boolean found = bindings != null;
+ if (inJboss && mcIntActive)
+ {
+ Assert.assertTrue("Map injection not executed", found);
+ Assert.assertEquals("Bindings size", bindings.size(), 1);
+ Assert.assertTrue("Controller not bound",
bindings.get(Controller.class) instanceof Controller);
+ }
+ else
+ {
+ Assert.assertFalse("Map injection should not have worked", found);
+ }
+ log.info("testMapInjection passed");
+ }
+
+ protected void testPropertyValueMethodInjection()
+ {
+ String propertyValue = bean.getStringValue();
+ 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 testNestedPropertyInjection()
+ {
+ String propertyValue = bean.getConfig().getSomeProperty();
+ boolean found = propertyValue != null;
+ if (inJboss && mcIntActive)
+ {
+ Assert.assertTrue("Nested property value method injection not
executed", found);
+ Assert.assertEquals("Invalid injected value", propertyValue,
"Test value");
+ }
+ else
+ {
+ Assert.assertFalse("Nested property value method injection should not have
worked", found);
+ }
+ log.info("testNestedPropertyInjection passed");
+ }
+
+ protected void testInstallMethod()
+ {
+ boolean installOk = bean.isInstallOk();
+ if (inJboss && mcIntActive)
+ {
+ Assert.assertTrue("Install method not executed as expected",
installOk);
+ }
+ else
+ {
+ Assert.assertFalse("Install method should not have worked",
installOk);
+ }
+ log.info("testInstallMethod passed");
+ }
+
+ protected void testStarted()
+ {
+ Assert.assertEquals("start() method not called exactly once", 1,
bean.getStartCount());
+ log.info("testStarted passed");
+ }
+}
Added:
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,220 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.kernel.it;
+
+import org.exoplatform.commons.Environment;
+import org.exoplatform.container.RootContainer;
+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.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 javax.transaction.TransactionManager;
+import java.util.Map;
+
+/**
+ * Presumption when running this test from within servlet container is that
+ * org.exoplatform.kernel.demos:exo.kernel.mc-int-demo 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;
+
+ 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();
+ tests();
+ }
+
+ protected void tests()
+ {
+ testFieldInjection();
+ testTypeMatchingMethodInjection();
+ testNameLookupMethodInjection();
+ testNameLookupMapInjection();
+ testPropertyValueMethodInjection();
+ testTransactionManager();
+ testInstallMethod();
+ testStarted();
+ }
+
+ protected void testTransactionManager()
+ {
+ TransactionManager tm = bean.getTransactionManager();
+
+ if (inJboss && mcIntActive)
+ {
+ try
+ {
+ int status = tm.getStatus();
+ log.info("Status before tx: " + tm.getStatus());
+ tm.begin();
+ Assert.assertFalse("TX status didn't change: ", status ==
tm.getStatus());
+ log.info("Status in tx: " + tm.getStatus());
+ tm.commit();
+ Assert.assertTrue("TX status didn't return to original: ",
status == tm.getStatus());
+ log.info("Status after tx: " + tm.getStatus());
+ }
+ catch (Exception ex)
+ {
+ throw new RuntimeException("Failed to use TransactionManager: ",
ex);
+ }
+ }
+ else
+ {
+ Assert.assertNull("Injection should not have worked", tm);
+ }
+ log.info("testTransactionManager passed");
+ }
+
+ 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 testInstallMethod()
+ {
+ boolean installOk = bean.isInstallOk();
+ if (inJboss && mcIntActive)
+ {
+ Assert.assertTrue("Install method not executed as expected",
installOk);
+ }
+ else
+ {
+ Assert.assertFalse("Install method should not have worked",
installOk);
+ }
+ log.info("testInstallMethod passed");
+ }
+
+ protected void testStarted()
+ {
+ Assert.assertEquals("start() method not called exactly once", 1,
bean.getStartCount());
+ log.info("testStarted passed");
+ }
+}
Added:
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest2.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest2.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest2.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.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/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest3.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest3.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest3.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,34 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.kernel.it;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class MCInjectionTest3 extends MCInjectionTest
+{
+ public MCInjectionTest3()
+ {
+ super();
+ beanName = "InjectingBean3";
+ }
+}
\ No newline at end of file
Added:
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest4.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest4.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/kernel/it/MCInjectionTest4.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,35 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.kernel.it;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class MCInjectionTest4 extends MCInjectionTest3
+{
+ public MCInjectionTest4()
+ {
+ super();
+ beanName = "InjectingBean4";
+ mcIntActive = false;
+ }
+}
\ No newline at end of file
Added:
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/tests/JUnitInvokerServlet.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/tests/JUnitInvokerServlet.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/tests/JUnitInvokerServlet.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,64 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.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/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/tests/LogOutputStream.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/tests/LogOutputStream.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/tests/LogOutputStream.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,75 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.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/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/tests/TeeOutputStream.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/tests/TeeOutputStream.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/java/org/exoplatform/tests/TeeOutputStream.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,74 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.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/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/webapp/WEB-INF/web.xml
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/webapp/WEB-INF/web.xml
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/main/webapp/WEB-INF/web.xml 2009-12-15
17:38:27 UTC (rev 1074)
@@ -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/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/CopiedException.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/CopiedException.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/CopiedException.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,91 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.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/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/FailuresParser.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/FailuresParser.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/FailuresParser.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,132 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.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/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/LineReader.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/LineReader.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/LineReader.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,68 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.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/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestExternalMCInjectionIntegration.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestExternalMCInjectionIntegration.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestExternalMCInjectionIntegration.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.exoplatform.kernel.it;
+
+/**
+ * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a>
+ */
+public class TestExternalMCInjectionIntegration extends TestMCInjectionIntegration
+{
+ public TestExternalMCInjectionIntegration()
+ {
+ testClass = org.exoplatform.kernel.it.ExternalMCInjectionTest.class.getName();
+ }
+}
Added:
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,100 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.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 +
"/mc-int-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/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration2.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration2.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration2.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.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/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration3.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration3.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration3.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.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/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration4.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration4.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-int-tests/src/test/java/org/exoplatform/kernel/it/TestMCInjectionIntegration4.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.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/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/pom.xml
(rev 0)
+++ kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/pom.xml 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,23 @@
+
+<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>mc-integration-parent</artifactId>
+ <version>2.2.0-Beta05-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>exo.kernel.mc-kernel-extras</artifactId>
+
+ <name>eXo Kernel :: MC Kernel Extras</name>
+ <description>MC Kernel 2.2.0 classes that aren't available in mc-kernel
2.0.6.GA</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.microcontainer</groupId>
+ <artifactId>jboss-kernel</artifactId>
+ </dependency>
+ </dependencies>
+</project>
Added:
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/src/main/java/org/jboss/dependency/plugins/helpers/StatelessController.java
===================================================================
---
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/src/main/java/org/jboss/dependency/plugins/helpers/StatelessController.java
(rev 0)
+++
kernel/trunk/exo.kernel.mc-integration/exo.kernel.mc-kernel-extras/src/main/java/org/jboss/dependency/plugins/helpers/StatelessController.java 2009-12-15
17:38:27 UTC (rev 1074)
@@ -0,0 +1,166 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.jboss.dependency.plugins.helpers;
+
+import org.jboss.beans.metadata.spi.BeanMetaData;
+import org.jboss.dependency.plugins.AbstractController;
+import org.jboss.dependency.spi.ControllerContext;
+import org.jboss.dependency.spi.ControllerState;
+import org.jboss.kernel.Kernel;
+import org.jboss.kernel.spi.dependency.KernelController;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.kernel.spi.event.KernelEvent;
+import org.jboss.kernel.spi.event.KernelEventFilter;
+import org.jboss.kernel.spi.event.KernelEventListener;
+
+import java.util.Set;
+
+/**
+ * Stateless controller.
+ *
+ * @author <a href="ales.justin(a)jboss.com">Ales Justin</a>
+ */
+public class StatelessController extends AbstractController implements KernelController
+{
+ private KernelController controller;
+
+ public StatelessController(KernelController controller)
+ {
+ if (controller == null)
+ throw new IllegalArgumentException("Null controller");
+
+ this.controller = controller;
+ for (ControllerState state : controller.getStates())
+ addState(state, null);
+ }
+
+ public void enableOnDemand(ControllerContext context) throws Throwable
+ {
+ // ignore
+ }
+
+ @Override
+ protected void registerControllerContext(ControllerContext context)
+ {
+ // do nothing
+ }
+
+ @Override
+ public void install(ControllerContext context) throws Throwable
+ {
+ super.install(context);
+ }
+
+ public ControllerContext uninstall(Object name)
+ {
+ return null;
+ }
+
+ public ControllerContext getContext(Object name, ControllerState state)
+ {
+ return controller.getContext(name, state);
+ }
+
+ public ControllerContext getInstalledContext(Object name)
+ {
+ return controller.getInstalledContext(name);
+ }
+
+ public boolean isShutdown()
+ {
+ return controller.isShutdown();
+ }
+
+ public void shutdown()
+ {
+ }
+
+ public Kernel getKernel()
+ {
+ return controller.getKernel();
+ }
+
+ public void setKernel(Kernel kernel) throws Throwable
+ {
+ controller.setKernel(kernel);
+ }
+
+ public KernelControllerContext install(BeanMetaData metaData) throws Throwable
+ {
+ return controller.install(metaData);
+ }
+
+ public KernelControllerContext install(BeanMetaData metaData, Object target) throws
Throwable
+ {
+ return controller.install(metaData, target);
+ }
+
+ public void addSupplies(KernelControllerContext context)
+ {
+ controller.addSupplies(context);
+ }
+
+ public void removeSupplies(KernelControllerContext context)
+ {
+ controller.removeSupplies(context);
+ }
+
+ public Set<KernelControllerContext> getInstantiatedContexts(Class<?>
clazz)
+ {
+ return controller.getInstantiatedContexts(clazz);
+ }
+
+ public Set<KernelControllerContext> getContexts(Class<?> clazz,
ControllerState state)
+ {
+ return controller.getContexts(clazz, state);
+ }
+
+ public KernelControllerContext getContextByClass(Class<?> clazz)
+ {
+ return controller.getContextByClass(clazz);
+ }
+
+ public void addInstantiatedContext(KernelControllerContext context)
+ {
+ controller.addInstantiatedContext(context);
+ }
+
+ public void removeInstantiatedContext(KernelControllerContext context)
+ {
+ controller.removeInstantiatedContext(context);
+ }
+
+ public void registerListener(KernelEventListener listener, KernelEventFilter filter,
Object handback) throws Throwable
+ {
+ controller.registerListener(listener, filter, handback);
+ }
+
+ public void unregisterListener(KernelEventListener listener, KernelEventFilter filter,
Object handback) throws Throwable
+ {
+ controller.unregisterListener(listener, filter, handback);
+ }
+
+ public void fireKernelEvent(KernelEvent event)
+ {
+ controller.fireKernelEvent(event);
+ }
+}
\ No newline at end of file
Added: kernel/trunk/exo.kernel.mc-integration/pom.xml
===================================================================
--- kernel/trunk/exo.kernel.mc-integration/pom.xml (rev 0)
+++ kernel/trunk/exo.kernel.mc-integration/pom.xml 2009-12-15 17:38:27 UTC (rev 1074)
@@ -0,0 +1,92 @@
+
+<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-Beta05-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>mc-integration-parent</artifactId>
+ <packaging>pom</packaging>
+
+ <name>eXo Kernel :: MC Kernel Integration</name>
+ <description>MC Kernel Integration</description>
+
+ <properties>
+ <!--version.parent>2.2.0-Beta05-SNAPSHOT</version.parent-->
+ <version.jboss.mc>2.0.6.GA</version.jboss.mc>
+ <version.jboss.mc-int>2.2.0.Alpha2</version.jboss.mc-int>
+ <version.jboss.classloader>2.0.7.GA</version.jboss.classloader>
+
+ </properties>
+ <modules>
+ <module>exo.kernel.mc-int</module>
+ <module>exo.kernel.mc-kernel-extras</module>
+ <module>exo.kernel.mc-int-demo</module>
+ <module>exo.kernel.mc-int-tests</module>
+ </modules>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.exoplatform.kernel</groupId>
+ <artifactId>exo.kernel.commons</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.exoplatform.kernel</groupId>
+ <artifactId>exo.kernel.container</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.exoplatform.kernel</groupId>
+ <artifactId>exo.kernel.mc-int</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.exoplatform.kernel</groupId>
+ <artifactId>exo.kernel.mc-int-demo</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.jboss.microcontainer</groupId>
+ <artifactId>jboss-dependency</artifactId>
+ <version>${version.jboss.mc}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.microcontainer</groupId>
+ <artifactId>jboss-kernel</artifactId>
+ <version>${version.jboss.mc}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.microcontainer</groupId>
+ <artifactId>jboss-aop-mc-int</artifactId>
+ <version>${version.jboss.mc}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.mc-int</groupId>
+ <artifactId>jboss-mc-int-common</artifactId>
+ <version>${version.jboss.mc-int}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.mc-int</groupId>
+ <artifactId>jboss-mc-int-servlet</artifactId>
+ <version>${version.jboss.mc-int}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.cl</groupId>
+ <artifactId>jboss-classloader</artifactId>
+ <version>${version.jboss.classloader}</version>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+</project>
Modified: kernel/trunk/pom.xml
===================================================================
--- kernel/trunk/pom.xml 2009-12-15 17:28:17 UTC (rev 1073)
+++ kernel/trunk/pom.xml 2009-12-15 17:38:27 UTC (rev 1074)
@@ -55,6 +55,7 @@
<module>exo.kernel.component.cache</module>
<module>exo.kernel.component.ext.cache.impl.jboss.v3</module>
<module>exo.kernel.component.command</module>
+ <module>exo.kernel.mc-integration</module>
<module>packaging/module</module>
</modules>
@@ -79,7 +80,7 @@
<groupId>org.exoplatform.kernel</groupId>
<artifactId>exo.kernel.component.remote</artifactId>
<version>${project.version}</version>
- </dependency>
+ </dependency>
<dependency>
<groupId>org.exoplatform.kernel</groupId>
<artifactId>exo.kernel.component.cache</artifactId>