// Copyright (c) 2003-present, Jodd Team (http://jodd.org)
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
package jodd.madvoc.component;
import jodd.madvoc.MadvocException;
import jodd.madvoc.MadvocTestCase;
import jodd.madvoc.interceptor.*;
import jodd.petite.PetiteContainer;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
public class InterceptorsManagerTest extends MadvocTestCase {
@SuppressWarnings({"unchecked"})
@Test
public void testExpand() {
InterceptorsManager im = new InterceptorsManager();
im.madvocConfig = new MadvocConfig();
im.madvocConfig.defaultInterceptors = new Class[]{ServletConfigInterceptor.class};
Class<? extends ActionInterceptor>[] in = new Class[]{
EchoInterceptor.class,
DefaultWebAppInterceptors.class
};
Class<? extends ActionInterceptor>[] out = im.expand(in);
assertEquals(2, out.length);
assertEquals(EchoInterceptor.class, out[0]);
assertEquals(ServletConfigInterceptor.class, out[1]);
}
@SuppressWarnings({"unchecked"})
@Test
public void testExpand2() {
InterceptorsManager im = new InterceptorsManager();
im.madvocConfig = new MadvocConfig();
im.madvocConfig.defaultInterceptors = new Class[]{EchoInterceptor.class, LogEchoInterceptor.class, ServletConfigInterceptor.class};
Class<? extends ActionInterceptor>[] in = new Class[]{
AnnotatedPropertyInterceptor.class,
DefaultWebAppInterceptors.class,
EchoInterceptor.class
};
Class<? extends ActionInterceptor>[] out = im.expand(in);
assertEquals(5, out.length);
assertEquals(AnnotatedPropertyInterceptor.class, out[0]);
assertEquals(EchoInterceptor.class, out[1]);
assertEquals(LogEchoInterceptor.class, out[2]);
assertEquals(ServletConfigInterceptor.class, out[3]);
assertEquals(EchoInterceptor.class, out[4]);
}
@SuppressWarnings({"unchecked"})
@Test
public void testExpandStack() {
InjectorsManager injectorsManager = new InjectorsManager();
injectorsManager.scopeDataResolver = new ScopeDataResolver();
injectorsManager.madvocConfig = new MadvocConfig();
injectorsManager.madpc = new PetiteContainer();
injectorsManager.createInjectors();
InterceptorsManager im = new InterceptorsManager();
im.contextInjectorComponent = new ContextInjectorComponent();
im.contextInjectorComponent.injectorsManager = injectorsManager;
im.contextInjectorComponent.madvocController = new MadvocController();
im.contextInjectorComponent.scopeDataResolver = injectorsManager.scopeDataResolver;
im.contextInjectorComponent.madpc = injectorsManager.madpc;
im.madvocConfig = injectorsManager.madvocConfig;
im.madvocConfig.defaultInterceptors = new Class[]{EchoInterceptor.class, ServletConfigInterceptor.class};
Class<? extends ActionInterceptor>[] in = new Class[]{
TestStack.class,
DefaultWebAppInterceptors.class,
EchoInterceptor.class
};
Class<? extends ActionInterceptor>[] out = im.expand(in);
assertEquals(7, out.length);
assertEquals(AnnotatedPropertyInterceptor.class, out[0]);
assertEquals(LogEchoInterceptor.class, out[1]);
assertEquals(EchoInterceptor.class, out[2]);
assertEquals(ServletConfigInterceptor.class, out[3]);
assertEquals(EchoInterceptor.class, out[4]);
assertEquals(ServletConfigInterceptor.class, out[5]);
assertEquals(EchoInterceptor.class, out[6]);
}
@SuppressWarnings({"unchecked"})
@Test
public void testExpandConfigurableStack() {
InjectorsManager injectorsManager = new InjectorsManager();
injectorsManager.scopeDataResolver = new ScopeDataResolver();
injectorsManager.madvocConfig = new MadvocConfig();
injectorsManager.madpc = new PetiteContainer();
InterceptorsManager im = new InterceptorsManager();
im.contextInjectorComponent = new ContextInjectorComponent();
im.contextInjectorComponent.injectorsManager = injectorsManager;
im.contextInjectorComponent.madvocController = new MadvocController();
im.contextInjectorComponent.scopeDataResolver = injectorsManager.scopeDataResolver;
im.contextInjectorComponent.madpc = injectorsManager.madpc;
im.madvocConfig = injectorsManager.madvocConfig;
im.madvocConfig.defaultInterceptors = new Class[]{EchoInterceptor.class, ServletConfigInterceptor.class};
injectorsManager.madpc.defineParameter(
TestConfigurableStack.class.getName() + ".interceptors",
AnnotatedPropertyInterceptor.class.getName() + "," +
ServletConfigInterceptor.class.getName() + "," +
LogEchoInterceptor.class.getName()
);
injectorsManager.createInjectors();
Class<? extends ActionInterceptor>[] in = new Class[] {
TestConfigurableStack.class,
TestConfigurableStack2.class,
EchoInterceptor.class
};
Class<? extends ActionInterceptor>[] out = im.expand(in);
assertEquals(6, out.length); // 3 + 2 + 1
// assert: TestConfigurableStack => defined in madpc
assertEquals(AnnotatedPropertyInterceptor.class, out[0]);
assertEquals(ServletConfigInterceptor.class, out[1]);
assertEquals(LogEchoInterceptor.class, out[2]);
//assert: TestConfigurableStack2 => madvocConfig.defaultInterceptors
assertEquals(EchoInterceptor.class, out[3]);
assertEquals(ServletConfigInterceptor.class, out[4]);
assertEquals(EchoInterceptor.class, out[5]);
}
@SuppressWarnings({"unchecked"})
@Test
public void testExpandSelf() {
InterceptorsManager im = new InterceptorsManager();
im.madvocConfig = new MadvocConfig();
im.madvocConfig.setDefaultInterceptors(new Class[]{
EchoInterceptor.class,
DefaultWebAppInterceptors.class // cyclic dependency
});
Class<? extends ActionInterceptor>[] in = new Class[]{
EchoInterceptor.class,
DefaultWebAppInterceptors.class
};
try {
Class<? extends ActionInterceptor>[] out = im.expand(in);
fail();
} catch (MadvocException ignore) {
} catch (Exception ignored) {
fail();
}
}
@SuppressWarnings({"unchecked"})
@Test
public void testExpandStack2() {
InjectorsManager injectorsManager = new InjectorsManager();
injectorsManager.scopeDataResolver = new ScopeDataResolver();
injectorsManager.madvocConfig = new MadvocConfig();
injectorsManager.madpc = new PetiteContainer();
injectorsManager.createInjectors();
InterceptorsManager im = new InterceptorsManager();
im.contextInjectorComponent = new ContextInjectorComponent();
im.contextInjectorComponent.injectorsManager = injectorsManager;
im.contextInjectorComponent.madvocController = new MadvocController();
im.contextInjectorComponent.scopeDataResolver = injectorsManager.scopeDataResolver;
im.contextInjectorComponent.madpc = injectorsManager.madpc;
im.madvocConfig = injectorsManager.madvocConfig;
im.madvocConfig.defaultInterceptors = new Class[]{EchoInterceptor.class, ServletConfigInterceptor.class, Test2Stack.class};
Class<? extends ActionInterceptor>[] in = new Class[]{
DefaultWebAppInterceptors.class,
};
Class<? extends ActionInterceptor>[] out = im.expand(in);
assertEquals(4, out.length);
assertEquals(EchoInterceptor.class, out[0]);
assertEquals(ServletConfigInterceptor.class, out[1]);
assertEquals(AnnotatedPropertyInterceptor.class, out[2]);
assertEquals(LogEchoInterceptor.class, out[3]);
}
// ---------------------------------------------------------------- util
public static class TestStack extends ActionInterceptorStack {
@SuppressWarnings({"unchecked"})
public TestStack() {
super(new Class[]{Test2Stack.class, DefaultWebAppInterceptors.class});
}
}
public static class Test2Stack extends ActionInterceptorStack {
@SuppressWarnings({"unchecked"})
public Test2Stack() {
super(new Class[]{AnnotatedPropertyInterceptor.class, LogEchoInterceptor.class});
}
}
public static class TestConfigurableStack extends ActionInterceptorStack {
}
public static class TestConfigurableStack2 extends ActionInterceptorStack {
public TestConfigurableStack2() {
super(DefaultWebAppInterceptors.class);
}
}
}