/* * 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.factory; import static com.alibaba.citrus.test.TestUtil.*; import static org.junit.Assert.*; import java.util.Set; import javax.servlet.http.HttpServletRequest; import com.alibaba.citrus.service.moduleloader.AbstractModuleLoaderTests; import com.alibaba.citrus.service.moduleloader.Module; 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.citrus.service.requestcontext.rundata.RunData; import com.alibaba.test.app1.module.screens.MyScreen; import org.junit.BeforeClass; import org.junit.Test; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.NoSuchBeanDefinitionException; public class ClassModuleFactoryTests extends AbstractModuleLoaderTests { @BeforeClass public static void initFactory() { factory = createContext("factory/services-class-modules.xml", false); } @Test public void moduleClassNotFound() { try { createContext("factory/services-class-modules-wrong.xml", false); fail(); } catch (BeansException e) { assertThat( e, exception(IllegalArgumentException.class, "Specificly-defined module could not be found in search-packages or search-classes", "screens.NotFound", "services-class-modules-wrong.xml")); } } @Test public void search_packages() { moduleLoaderService = (ModuleLoaderService) factory.getBean("search-packages"); // types Set<String> types = moduleLoaderService.getModuleTypes(); assertArrayEquals(new String[] { "action", "control", "screens" }, types.toArray(new String[types.size()])); // names Set<String> names = moduleLoaderService.getModuleNames("action"); assertArrayEquals(new String[] { "myprod.MyAction", "myprod.MyActionFailure", "myprod.MyActionNoRunData" }, names.toArray(new String[names.size()])); names = moduleLoaderService.getModuleNames("control"); assertArrayEquals(new String[] { "InvalidControl", "myprod.MyControl", "myprod.MyControl2" }, names.toArray(new String[names.size()])); names = moduleLoaderService.getModuleNames("screens"); assertArrayEquals(new String[] { "MyScreen" }, names.toArray(new String[names.size()])); // modules Module module = moduleLoaderService.getModule(" screens ", "myScreen"); assertNotNull(module); assertEquals(MyScreen.class, module.getClass()); assertEquals(null, ((MyScreen) module).getName()); module = moduleLoaderService.getModule("control", "myprod.MyControl"); assertNotNull(module); assertEquals(DataBindingAdapter.class, module.getClass()); module = moduleLoaderService.getModule("action", "myprod.MyAction"); assertNotNull(module); assertEquals(ActionEventAdapter.class, module.getClass()); } @Test public void search_classes() { search_classes("search-classes"); } @Test public void search_classes_2() { search_classes("search-classes-2"); } private void search_classes(String name) { moduleLoaderService = (ModuleLoaderService) factory.getBean(name); // types Set<String> types = moduleLoaderService.getModuleTypes(); assertArrayEquals(new String[] { "action", "control", "screens" }, types.toArray(new String[types.size()])); // names Set<String> names = moduleLoaderService.getModuleNames("action"); assertArrayEquals(new String[] { "app1.myprod.MyAction", "app1.myprod.MyActionFailure", "app1.myprod.MyActionNoRunData" }, names.toArray(new String[names.size()])); names = moduleLoaderService.getModuleNames("control"); assertArrayEquals(new String[] { "app1.InvalidControl", "app1.myprod.MyControl", "app1.myprod.MyControl2" }, names.toArray(new String[names.size()])); names = moduleLoaderService.getModuleNames("screens"); assertArrayEquals(new String[] { "app1.MyScreen" }, names.toArray(new String[names.size()])); // modules Module module = moduleLoaderService.getModule(" screens ", "app1/myScreen"); assertNotNull(module); assertEquals(MyScreen.class, module.getClass()); assertEquals(null, ((MyScreen) module).getName()); module = moduleLoaderService.getModule("control", "app1.myprod.MyControl"); assertNotNull(module); assertEquals(DataBindingAdapter.class, module.getClass()); module = moduleLoaderService.getModule("action", "app1.myprod.MyAction"); assertNotNull(module); assertEquals(ActionEventAdapter.class, module.getClass()); } @Test public void search_multi() { moduleLoaderService = (ModuleLoaderService) factory.getBean("search-multi"); // types Set<String> types = moduleLoaderService.getModuleTypes(); assertArrayEquals(new String[] { "action", "control", "screen" }, types.toArray(new String[types.size()])); // names Set<String> names = moduleLoaderService.getModuleNames("action"); assertArrayEquals(new String[] { "myprod.MyAction", "myprod.MyActionFailure", "myprod.MyActionNoRunData" }, names.toArray(new String[names.size()])); names = moduleLoaderService.getModuleNames("control"); assertArrayEquals(new String[] { "app1.InvalidControl", "app1.myprod.MyControl", "app1.myprod.MyControl2" }, names.toArray(new String[names.size()])); names = moduleLoaderService.getModuleNames("screen"); assertArrayEquals(new String[] { "MyScreen" }, names.toArray(new String[names.size()])); // modules Module module = moduleLoaderService.getModule(" screen ", "/myScreen"); assertNotNull(module); assertEquals(MyScreen.class, module.getClass()); assertEquals("hello", ((MyScreen) module).getName()); module = moduleLoaderService.getModule("control", "app1.myprod.MyControl"); assertNotNull(module); assertEquals(DataBindingAdapter.class, module.getClass()); module = moduleLoaderService.getModule("action", "myprod.MyAction"); assertNotNull(module); assertEquals(ActionEventAdapter.class, module.getClass()); } @Test public void autowire_failed() throws Exception { try { createContext("factory/services-class-modules.xml", null); fail(); } catch (BeanCreationException e) { assertThat(e, exception(NoSuchBeanDefinitionException.class, "RunData")); } } @Test public void autowire_no() throws Exception { moduleLoaderService = (ModuleLoaderService) factory.getBean("search-multi"); Module module = moduleLoaderService.getModule(" action ", "/myprod/myAction"); assertEquals(ActionEventAdapter.class, module.getClass()); // adapter.request != null assertNotNull(getFieldValue(module, "request", HttpServletRequest.class)); // adapter.moduleObject.rundata Object mobj = getFieldValue(module, "moduleObject", Object.class); assertNull(getFieldValue(mobj, "rundata", RunData.class)); } @Test public void autowire_byType() throws Exception { moduleLoaderService = (ModuleLoaderService) factory.getBean("search-autowire"); Module module = moduleLoaderService.getModule(" action ", "/myprod/myAction"); assertEquals(ActionEventAdapter.class, module.getClass()); // adapter.request != null assertNotNull(getFieldValue(module, "request", HttpServletRequest.class)); // adapter.moduleObject.rundata Object mobj = getFieldValue(module, "moduleObject", Object.class); assertNotNull(getFieldValue(mobj, "rundata", RunData.class)); } @Test public void search_abstract() throws Exception { // search-packages moduleLoaderService = (ModuleLoaderService) factory.getBean("search-packages-abstract"); Set<String> names = moduleLoaderService.getModuleNames("screens"); assertArrayEquals(new String[] { "AbstractScreen", "MyScreen" }, names.toArray(new String[names.size()])); try { moduleLoaderService.getModule("screens", "AbstractScreen"); } catch (UnadaptableModuleException e) { assertThat(e, exception("name=AbstractScreen", "java.lang.Class")); } // search-classes moduleLoaderService = (ModuleLoaderService) factory.getBean("search-classes-abstract"); names = moduleLoaderService.getModuleNames("screens"); assertArrayEquals(new String[] { "app1.AbstractScreen", "app1.MyScreen" }, names.toArray(new String[names.size()])); try { moduleLoaderService.getModule("screens", "app1.AbstractScreen"); } catch (UnadaptableModuleException e) { assertThat(e, exception("name=app1.AbstractScreen", "java.lang.Class")); } } @Test public void search_withFilterByCustom() { moduleLoaderService = (ModuleLoaderService) factory.getBean("search-classes-with-filter-custom"); doSearch_withFilter(); } @Test public void search_withFilterByWildcard() { moduleLoaderService = (ModuleLoaderService) factory.getBean("search-classes-with-filter-wildcard"); doSearch_withFilter(); } private void doSearch_withFilter() { // types Set<String> types = moduleLoaderService.getModuleTypes(); assertArrayEquals(new String[] { "action", "screen" }, types.toArray(new String[types.size()])); // names Set<String> names = moduleLoaderService.getModuleNames("action"); assertArrayEquals(new String[] { "app2.FirstAction", "app2.ThirdAction" }, names.toArray(new String[names.size()])); names = moduleLoaderService.getModuleNames("screen"); assertArrayEquals(new String[] { "app2.FirstScreen", "app2.ThirdScreen" }, names.toArray(new String[names.size()])); // modules Module module = moduleLoaderService.getModule("action", "/app2/firstAction"); assertNotNull(module); assertEquals(ActionEventAdapter.class, module.getClass()); module = moduleLoaderService.getModule(" screen ", "app2.ThirdScreen"); assertNotNull(module); assertEquals(DataBindingAdapter.class, module.getClass()); } @Test public void search_withIncludeFilter() { moduleLoaderService = (ModuleLoaderService) factory.getBean("search-classes-with-includeFilter"); // types Set<String> types = moduleLoaderService.getModuleTypes(); assertArrayEquals(new String[] { "action", "screen" }, types.toArray(new String[types.size()])); // names Set<String> names = moduleLoaderService.getModuleNames("action"); assertArrayEquals(new String[] { "app2.SecondAction" }, names.toArray(new String[names.size()])); names = moduleLoaderService.getModuleNames("screen"); assertArrayEquals(new String[] { "app2.FirstScreen", "app2.SecondScreen" }, names.toArray(new String[names.size()])); // modules Module module = moduleLoaderService.getModule("action", "/app2/secondAction"); assertNotNull(module); assertEquals(ActionEventAdapter.class, module.getClass()); module = moduleLoaderService.getModule(" screen ", "app2.FirstScreen"); assertNotNull(module); assertEquals(DataBindingAdapter.class, module.getClass()); } }