/* * Copyright (c) 2002-2012 Alibaba Group Holding Limited. * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.citrus.service.moduleloader.impl.dataresolver; import static com.alibaba.citrus.test.TestUtil.*; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import com.alibaba.citrus.service.moduleloader.AbstractModuleLoaderTests; import com.alibaba.citrus.service.moduleloader.ModuleLoaderService; import com.alibaba.citrus.service.moduleloader.UnadaptableModuleException; import com.alibaba.citrus.service.moduleloader.impl.adapter.ActionEventAdapter; import com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter; import com.alibaba.test2.module.action.MyParameterizedAction; import com.alibaba.test2.module.screen.MyParameterizedScreen; import org.hamcrest.Matcher; import org.junit.BeforeClass; import org.junit.Test; import org.springframework.context.ApplicationContext; public class ParamBindingTests extends AbstractModuleLoaderTests { @BeforeClass public static void initServlet() throws Exception { prepareServlet(); factory = createContext("dataresolver/services-with-dataresolver-default-adapters.xml", false); } @Test public void noDataResolver() throws Exception { ApplicationContext factory = createContext("dataresolver/services-no-dataresolver.xml", false); moduleLoaderService = (ModuleLoaderService) factory.getBean("moduleLoaderService"); getInvocationContext("/app1?event_submit_do_my_event=yes"); initRequestContext(factory); // screen.execute(无参数) - 正常执行 DataBindingAdapter dbAdapter = (DataBindingAdapter) moduleLoaderService.getModule("screen", "myScreen"); dbAdapter.execute(); // screen.execute(带参数) try { moduleLoaderService.getModule("screen", "myParameterizedScreen"); fail(); } catch (UnadaptableModuleException e) { assertThat(e, exception("Could not adapt object to module: type=screen, name=MyParameterizedScreen, class=" + MyParameterizedScreen.class.getName() + ": method execute has 2 parameters, but no DataResolvers defined.")); } // action.doMyEvent(无参数) - 正常执行 ActionEventAdapter aeAdapter = (ActionEventAdapter) moduleLoaderService.getModule("action", "myAction"); aeAdapter.execute(); // action.doMyEvent(带参数) try { moduleLoaderService.getModule("action", "myParameterizedAction"); fail(); } catch (UnadaptableModuleException e) { Matcher<Throwable> case1 = exception("Could not adapt object to module: type=action, name=MyParameterizedAction, class=" + MyParameterizedAction.class.getName() + ": method doMyEvent has 2 parameters, but no DataResolvers defined."); Matcher<Throwable> case2 = exception("Could not adapt object to module: type=action, name=MyParameterizedAction, class=" + MyParameterizedAction.class.getName() + ": method doMyEventPrimitive has 2 parameters, but no DataResolvers defined."); @SuppressWarnings("unchecked") Matcher<Throwable> any = anyOf(case1, case2); assertThat(e, any); } } @Test public void withDataResolver_default_adapters() throws Exception { assertWithDataResolver(factory); } @Test public void withDataResolver_defined_adapters() throws Exception { assertWithDataResolver(createContext("dataresolver/services-with-dataresolver-defined-adapters.xml", false)); } @Test public void withDataResolver_defined_adapters_default_resolverRef() throws Exception { assertWithDataResolver(createContext( "dataresolver/services-with-dataresolver-defined-adapters-default-resolver-ref.xml", false)); } private void assertWithDataResolver(ApplicationContext factory) throws Exception { moduleLoaderService = (ModuleLoaderService) factory.getBean("moduleLoaderService"); getInvocationContext("/app1?event_submit_do_my_event=yes"); initRequestContext(factory); // screen.execute(无参数) DataBindingAdapter dbAdapter = (DataBindingAdapter) moduleLoaderService.getModule("screen", "myScreen"); dbAdapter.execute(); assertEquals("MyScreen.execute()", request.getAttribute("screenLog")); // screen.execute(带参数) dbAdapter = (DataBindingAdapter) moduleLoaderService.getModule("screen", "myParameterizedScreen"); dbAdapter.execute(); assertEquals("MyParameterizedScreen.execute(request, 111)", request.getAttribute("screenLog")); // action.doMyEvent(无参数) - 正常执行 ActionEventAdapter aeAdapter = (ActionEventAdapter) moduleLoaderService.getModule("action", "myAction"); aeAdapter.execute(); assertEquals("MyAction.doMyEvent()", request.getAttribute("actionLog")); // action.doMyEvent(带参数) aeAdapter = (ActionEventAdapter) moduleLoaderService.getModule("action", "myParameterizedAction"); aeAdapter.execute(); assertEquals("MyParameterizedAction.doMyEvent(request, 222)", request.getAttribute("actionLog")); // action.doMyEvent(带primitive参数) getInvocationContext("/app1?event_submit_do_my_event_primitive=yes"); initRequestContext(factory); aeAdapter = (ActionEventAdapter) moduleLoaderService.getModule("action", "myParameterizedAction"); aeAdapter.execute(); assertEquals("MyParameterizedAction.doMyEventPrimitive(request, 0)", request.getAttribute("actionLog")); } @Test public void skipScreen() throws Exception { moduleLoaderService = (ModuleLoaderService) factory.getBean("moduleLoaderService"); getInvocationContext("/app1?event_submit_do_my_event=yes"); initRequestContext(factory); // screen.execute(@skip) - 不会真的skip,只是参数为null DataBindingAdapter dbAdapter = (DataBindingAdapter) moduleLoaderService .getModule("screen", "mySkippableScreen"); dbAdapter.execute(); assertEquals("result is haha", request.getAttribute("screenLog")); // screen.execute(@skip primitive type) - 不会真的skip,只是参数为false dbAdapter = (DataBindingAdapter) moduleLoaderService.getModule("screen", "mySkippableScreen2"); dbAdapter.execute(); assertEquals("result is false", request.getAttribute("screenLog")); } @Test public void skipActionEvent() throws Exception { moduleLoaderService = (ModuleLoaderService) factory.getBean("moduleLoaderService"); getInvocationContext("/app1?event_submit_do_my_event=yes"); initRequestContext(factory); // action.doMyEvent(@skip) - 被skip后,不执行,但before/afterExecution仍执行。 ActionEventAdapter aeAdapter = (ActionEventAdapter) moduleLoaderService .getModule("action", "mySkippableAction"); aeAdapter.execute(); assertEquals(null /* 不是"result is null" */, request.getAttribute("actionLog")); assertEquals("result is haha", request.getAttribute("actionLog.before")); assertEquals("result is haha", request.getAttribute("actionLog.after")); } @Test public void skipAction() throws Exception { moduleLoaderService = (ModuleLoaderService) factory.getBean("moduleLoaderService"); getInvocationContext("/app1?event_submit_do_my_event=yes"); initRequestContext(factory); // action.execute(@skip) - 被skip后,不执行。 DataBindingAdapter dbAdapter = (DataBindingAdapter) moduleLoaderService.getModule("action", "mySkippableAction2"); dbAdapter.execute(); assertEquals(null /* 不是"result is null" */, request.getAttribute("actionLog")); } }