/* * Copyright (C) 2013 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.container.spi; import junit.framework.TestCase; import org.exoplatform.container.AbstractInterceptor; import org.exoplatform.container.CachingContainer; import org.exoplatform.container.ConcurrentContainer; import org.exoplatform.container.DefaultInterceptorChainFactory; import org.exoplatform.container.ExoContainer; import org.exoplatform.container.management.ManageableContainer; /** * @author <a href="mailto:nfilotto@exoplatform.com">Nicolas Filotto</a> * @version $Id$ * */ public class TestKernelExtension extends TestCase { public void testFactory() { try { MockInterceptorChainFactory.mode = 1; ExoContainer container = new ExoContainer(); assertTrue(container.getSuccessor() instanceof MockInterceptor); } finally { MockInterceptorChainFactory.mode = 0; } } public void testInterceptors() { ExoContainer parent = new ExoContainer(); testInterceptorsInternal(parent); // Make sure that it is consistent testInterceptorsInternal(parent); } private void testInterceptorsInternal(ExoContainer parent) { MockInterceptor1 i1 = null; MockInterceptor2 i2 = null; MockInterceptor3 i3 = null; MockInterceptor4 i4 = null; MockInterceptor5 i5 = null; MockInterceptor6 i6 = null; MockInterceptor7 i7 = null; MockInterceptor8 i8 = null; MockInterceptor9 i9 = null; ExoContainer holder = new ExoContainer(parent); Container container = holder; while ((container = container.getSuccessor()) != null) { if (container instanceof MockInterceptor1) { i1 = (MockInterceptor1)container; } else if (container instanceof MockInterceptor2) { i2 = (MockInterceptor2)container; } else if (container instanceof MockInterceptor3) { i3 = (MockInterceptor3)container; } else if (container instanceof MockInterceptor4) { i4 = (MockInterceptor4)container; } else if (container instanceof MockInterceptor5) { i5 = (MockInterceptor5)container; } else if (container instanceof MockInterceptor6) { i6 = (MockInterceptor6)container; } else if (container instanceof MockInterceptor7) { i7 = (MockInterceptor7)container; } else if (container instanceof MockInterceptor8) { i8 = (MockInterceptor8)container; } else if (container instanceof MockInterceptor9) { i9 = (MockInterceptor9)container; } } assertNotNull(i1); assertNotNull(i1.getSuccessor()); assertSame(parent, i1.getParent()); assertSame(holder, i1.getHolder()); assertEquals("MockInterceptor1", i1.getId()); assertNotNull(i2); assertNotNull(i2.getSuccessor()); assertSame(parent, i2.getParent()); assertSame(holder, i2.getHolder()); assertEquals("MockInterceptor2", i2.getId()); assertNotNull(i3); assertNotNull(i3.getSuccessor()); assertSame(parent, i3.getParent()); assertSame(holder, i3.getHolder()); assertEquals("MockInterceptor3", i3.getId()); assertNotNull(i4); assertNotNull(i4.getSuccessor()); assertSame(parent, i4.getParent()); assertSame(holder, i4.getHolder()); assertEquals("MockInterceptor4", i4.getId()); assertNotNull(i5); assertNotNull(i5.getSuccessor()); assertSame(parent, i5.getParent()); assertSame(holder, i5.getHolder()); assertEquals("MockInterceptor5", i5.getId()); assertNotNull(i6); assertNotNull(i6.getSuccessor()); assertSame(parent, i6.getParent()); assertSame(holder, i6.getHolder()); assertEquals("MockInterceptor6", i6.getId()); assertNotNull(i7); assertNotNull(i7.getSuccessor()); assertSame(parent, i7.getParent()); assertSame(holder, i7.getHolder()); assertEquals("MockInterceptor7", i7.getId()); assertNotNull(i8); assertNull(i8.getSuccessor()); assertSame(parent, i8.getParent()); assertSame(holder, i8.getHolder()); assertEquals("MockInterceptor8", i8.getId()); assertNotNull(i9); assertNotNull(i9.getSuccessor()); assertSame(i5, i9.getSuccessor()); assertSame(parent, i9.getParent()); assertSame(holder, i9.getHolder()); assertEquals("MockInterceptor9", i9.getId()); assertSame(i9, holder.getSuccessor()); Test0 t0I = new Test0(); Test1 t1I = new Test1(); Test2 t2I = new Test2(); Test3 t3I = new Test3(); holder.registerComponentInstance(Test0.class, t0I); holder.registerComponentInstance(Test1.class, t1I); holder.registerComponentInstance(Test2.class, t2I); holder.registerComponentInstance(Test3.class, t3I); holder.registerComponentImplementation(Test5.class); assertSame(t0I, holder.getComponentInstanceOfType(Test0.class)); Test1 t1FC = holder.getComponentInstanceOfType(Test1.class); assertNotSame(t1I, t1FC); // A new instance is created at each call so it must not be the same as before assertNotSame(t1FC, holder.getComponentInstanceOfType(Test1.class)); Test2 t2FC = holder.getComponentInstanceOfType(Test2.class); assertNotSame(t2I, t2FC); // It comes from the cache so it must be the same than before assertSame(t2FC, holder.getComponentInstanceOfType(Test2.class)); Test3 t3FC = holder.getComponentInstanceOfType(Test3.class); assertSame(MockInterceptor1.TEST, t3FC); Test5 t4FC = holder.getComponentInstanceOfType(Test5.class); assertSame(t0I, t4FC.t0); assertNotSame(t1I, t4FC.t1); assertNotSame(t2I, t4FC.t2); assertSame(t3FC, t4FC.t3); } public static class MockInterceptorChainFactory implements InterceptorChainFactory { private static int mode; private final InterceptorChainFactory delegate = new DefaultInterceptorChainFactory(); /** * {@inheritDoc} */ public Interceptor getInterceptorChain(ExoContainer holder, ExoContainer parent) { if (mode == 0) { // default mode return delegate.getInterceptorChain(holder, parent); } // mode with the MockContainer ConcurrentContainer cc = new ConcurrentContainer(holder, parent); CachingContainer caching = new CachingContainer(); caching.setSuccessor(cc); ManageableContainer mac = new ManageableContainer(holder, parent); mac.setSuccessor(caching); return new MockInterceptor(mac); } } @SuppressWarnings("serial") @Before("Cache") public static class MockInterceptor1 extends AbstractInterceptor { public static final Test3 TEST = new Test3(); ExoContainer getParent() { return parent; } ExoContainer getHolder() { return holder; } @Override public <T> T getComponentInstanceOfType(Class<T> componentType, boolean autoRegistration) { if (componentType.equals(Test1.class)) { return componentType.cast(new Test1()); } else if (componentType.equals(Test3.class)) { return componentType.cast(TEST); } else if (componentType.equals(Test4.class)) { return componentType.cast(new Test4()); } return super.getComponentInstanceOfType(componentType, autoRegistration); } } @SuppressWarnings("serial") @After(value = "Cache") public static class MockInterceptor2 extends AbstractInterceptor { ExoContainer getParent() { return parent; } ExoContainer getHolder() { return holder; } @Override public <T> T getComponentInstanceOfType(Class<T> componentType, boolean autoRegistration) { if (componentType.equals(Test2.class)) { return componentType.cast(new Test2()); } return super.getComponentInstanceOfType(componentType, autoRegistration); } } @SuppressWarnings("serial") public static class MockInterceptor3 extends AbstractInterceptor { ExoContainer getParent() { return parent; } ExoContainer getHolder() { return holder; } } @SuppressWarnings("serial") @After("Fake") public static class MockInterceptor4 extends AbstractInterceptor { ExoContainer getParent() { return parent; } ExoContainer getHolder() { return holder; } } @SuppressWarnings("serial") @Before("Fake") public static class MockInterceptor5 extends AbstractInterceptor { ExoContainer getParent() { return parent; } ExoContainer getHolder() { return holder; } } @SuppressWarnings("serial") @After("") public static class MockInterceptor6 extends AbstractInterceptor { ExoContainer getParent() { return parent; } ExoContainer getHolder() { return holder; } } @SuppressWarnings("serial") @Before("") public static class MockInterceptor7 extends AbstractInterceptor { ExoContainer getParent() { return parent; } ExoContainer getHolder() { return holder; } } @SuppressWarnings("serial") @After("ConcurrentContainer") public static class MockInterceptor8 extends AbstractInterceptor { ExoContainer getParent() { return parent; } ExoContainer getHolder() { return holder; } } @SuppressWarnings("serial") @Before("MockInterceptor5") public static class MockInterceptor9 extends AbstractInterceptor { ExoContainer getParent() { return parent; } ExoContainer getHolder() { return holder; } } @SuppressWarnings("serial") private static class MockInterceptor extends AbstractInterceptor { private MockInterceptor(Interceptor delegate) { setSuccessor(delegate); } } private static class Test0 { }; private static class Test1 { }; private static class Test2 { }; private static class Test3 { }; private static class Test4 { }; public static class Test5 { public Test0 t0; public Test1 t1; public Test2 t2; public Test3 t3; public Test4 t4; public Test5(Test0 t0, Test1 t1, Test2 t2, Test3 t3, Test4 t4) { this.t0 = t0; this.t1 = t1; this.t2 = t2; this.t3 = t3; this.t4 = t4; } }; }