/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program 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. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.test.platform.plugin.pluginmgr; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.Predicate; import org.junit.Before; import org.junit.Test; import org.pentaho.platform.api.engine.IContentInfo; import org.pentaho.platform.api.engine.IPlatformPlugin; import org.pentaho.platform.api.engine.IPluginOperation; import org.pentaho.platform.api.engine.ISolutionEngine; import org.pentaho.platform.api.engine.PlatformPluginRegistrationException; import org.pentaho.platform.api.engine.PluginBeanDefinition; import org.pentaho.platform.api.engine.PluginServiceDefinition; import org.pentaho.platform.api.engine.perspective.IPluginPerspectiveManager; import org.pentaho.platform.api.engine.perspective.pojo.IPluginPerspective; import org.pentaho.platform.engine.core.system.StandaloneSession; import org.pentaho.platform.engine.services.solution.SolutionEngine; import org.pentaho.platform.plugin.services.pluginmgr.PluginMessageLogger; import org.pentaho.platform.plugin.services.pluginmgr.SystemPathXmlPluginProvider; import org.pentaho.platform.plugin.services.pluginmgr.perspective.DefaultPluginPerspectiveManager; import org.pentaho.test.platform.engine.core.MicroPlatform; import org.pentaho.test.platform.utils.TestResourceLocation; import java.util.Collection; import java.util.List; import static org.junit.Assert.*; @SuppressWarnings( "nls" ) public class SystemPathPluginProviderIT { private MicroPlatform microPlatform = null; SystemPathXmlPluginProvider provider = null; @Before public void init() { microPlatform = new MicroPlatform( TestResourceLocation.TEST_RESOURCES + "/SystemPathPluginProviderTest/" ); microPlatform.define( ISolutionEngine.class, SolutionEngine.class ); microPlatform.define( IPluginPerspectiveManager.class, DefaultPluginPerspectiveManager.class ); provider = new SystemPathXmlPluginProvider(); } @SuppressWarnings( "deprecation" ) @Test public void testLoad_Good() throws PlatformPluginRegistrationException { microPlatform.init(); PluginMessageLogger.clear(); List<IPlatformPlugin> plugins = provider.getPlugins( new StandaloneSession() ); // should successfully load good-plugin1 and good-plugin2 and not load bad-plugin. The fact // that bad-plugin does not load should not prevent the good ones from being loaded assertTrue( "plugin1 was not found", CollectionUtils.exists( plugins, new PluginNameMatcherPredicate( "Plugin 1" ) ) ); assertTrue( "plugin2 was not found", CollectionUtils.exists( plugins, new PluginNameMatcherPredicate( "Plugin 2" ) ) ); // make sure that the bad plugin caused an error message to be logged assertEquals( "bad plugin did not log an error message", 1, PluginMessageLogger .count( "SystemPathXmlPluginProvider.ERROR_0001" ) ); for ( String msg : PluginMessageLogger.getAll() ) { System.err.println( msg ); } } @SuppressWarnings( "deprecation" ) @Test( expected = PlatformPluginRegistrationException.class ) public void testLoad_BadSolutionPath() throws PlatformPluginRegistrationException { MicroPlatform mp = new MicroPlatform( TestResourceLocation.TEST_RESOURCES + "/SystemPathPluginProviderTest/system" ); mp.define( ISolutionEngine.class, SolutionEngine.class ); mp.init(); provider.getPlugins( new StandaloneSession() ); } class PluginNameMatcherPredicate implements Predicate { private String pluginNameToMatch; public PluginNameMatcherPredicate( String pluginNameToMatch ) { this.pluginNameToMatch = pluginNameToMatch; } public boolean evaluate( Object object ) { return pluginNameToMatch.equals( ( (IPlatformPlugin) object ).getId() ); } } @SuppressWarnings( "deprecation" ) @Test public void tesLoadtLifecycleListener() throws PlatformPluginRegistrationException { microPlatform.init(); PluginMessageLogger.clear(); List<IPlatformPlugin> plugins = provider.getPlugins( new StandaloneSession() ); // first make sure Plugin 1 was loaded, otherwise our check for lifcycle class will never happen assertTrue( "plugin1 was not found", CollectionUtils.exists( plugins, new PluginNameMatcherPredicate( "Plugin 1" ) ) ); for ( IPlatformPlugin plugin : plugins ) { if ( plugin.getId().equals( "Plugin 1" ) ) { assertEquals( "org.pentaho.test.platform.plugin.pluginmgr.FooInitializer", plugin .getLifecycleListenerClassname() ); } if ( plugin.getId().equals( "Plugin 2" ) ) { // no listener defined to for Plugin 2 assertNull( plugin.getLifecycleListenerClassname() ); } } } @SuppressWarnings( "deprecation" ) @Test public void testLoadBeanDefinition() throws PlatformPluginRegistrationException { microPlatform.init(); List<IPlatformPlugin> plugins = provider.getPlugins( new StandaloneSession() ); IPlatformPlugin plugin = (IPlatformPlugin) CollectionUtils.find( plugins, new PluginNameMatcherPredicate( "Plugin 1" ) ); assertNotNull( "Plugin 1 should have been found", plugin ); Collection<PluginBeanDefinition> beans = plugin.getBeans(); assertEquals( "FooComponent was not loaded", 1, CollectionUtils.countMatches( beans, new Predicate() { public boolean evaluate( Object object ) { PluginBeanDefinition bean = (PluginBeanDefinition) object; return bean.getBeanId().equals( "FooComponent" ) && bean.getClassname().equals( "org.pentaho.test.platform.plugin.pluginmgr.FooComponent" ); } } ) ); assertEquals( "genericBean was not loaded", 1, CollectionUtils.countMatches( beans, new Predicate() { public boolean evaluate( Object object ) { PluginBeanDefinition bean = (PluginBeanDefinition) object; return bean.getBeanId().equals( "genericBean" ) && bean.getClassname().equals( "java.lang.Object" ); } } ) ); } @SuppressWarnings( "deprecation" ) @Test public void testLoadLifeCycleListener() throws PlatformPluginRegistrationException { microPlatform.init(); List<IPlatformPlugin> plugins = provider.getPlugins( new StandaloneSession() ); IPlatformPlugin plugin = (IPlatformPlugin) CollectionUtils.find( plugins, new PluginNameMatcherPredicate( "Plugin 1" ) ); assertNotNull( "Plugin 1 should have been found", plugin ); assertEquals( "org.pentaho.test.platform.plugin.pluginmgr.FooInitializer", plugin.getLifecycleListenerClassname() ); } @SuppressWarnings( "deprecation" ) @Test public void testLoadWebservices() throws PlatformPluginRegistrationException { microPlatform.init(); List<IPlatformPlugin> plugins = provider.getPlugins( new StandaloneSession() ); System.out.println( PluginMessageLogger.getAll() ); IPlatformPlugin plugin = (IPlatformPlugin) CollectionUtils.find( plugins, new PluginNameMatcherPredicate( "Plugin 1" ) ); assertNotNull( "Plugin 1 should have been found", plugin ); Collection<PluginServiceDefinition> webservices = plugin.getServices(); Object wsobj = CollectionUtils.find( webservices, new Predicate() { public boolean evaluate( Object object ) { PluginServiceDefinition ws = (PluginServiceDefinition) object; boolean ret = ws.getTitle().equals( "%TestWS1.TITLE%" ); return ret; } } ); assertNotNull( "Webservice \"%TestWS1.TITLE%\" should have been loaded", wsobj ); PluginServiceDefinition wsDfn = (PluginServiceDefinition) wsobj; assertEquals( "org.pentaho.test.platform.engine.core.EchoServiceBean", wsDfn.getServiceClass() ); assertEquals( "xml", wsDfn.getTypes()[0] ); assertEquals( "gwt", wsDfn.getTypes()[1] ); assertEquals( "A test webservice", wsDfn.getDescription() ); assertEquals( 1, wsDfn.getExtraClasses().size() ); assertEquals( "java.lang.String", wsDfn.getExtraClasses().iterator().next() ); } @SuppressWarnings( "deprecation" ) @Test public void testLoadContentGenerators() throws PlatformPluginRegistrationException { microPlatform.init(); List<IPlatformPlugin> plugins = provider.getPlugins( new StandaloneSession() ); IPlatformPlugin plugin = (IPlatformPlugin) CollectionUtils.find( plugins, new PluginNameMatcherPredicate( "content-generator-plugin" ) ); assertNotNull( "content-generator-plugin should have been found", plugin ); List<IContentInfo> contentTypes = plugin.getContentInfos(); Object contentType = CollectionUtils.find( contentTypes, new Predicate() { public boolean evaluate( Object object ) { IContentInfo type = (IContentInfo) object; return type.getTitle().equals( "Good Test Type" ); } } ); assertNotNull( "\"Good Test Type\" should have been loaded", contentType ); assertNotNull( "\"Good Test Type\" extension definition is incorrect", ( (IContentInfo) contentType ) .getExtension().equals( "good-content-type" ) ); IContentInfo contentInfo = (IContentInfo) contentType; IPluginOperation operation = contentInfo.getOperations().listIterator().next(); assertEquals( "Missing perspective", "custom-perspective", operation.getPerspective() ); assertEquals( "\"Test Type Missing type\" should not have been loaded", 0, CollectionUtils.countMatches( contentTypes, new Predicate() { public boolean evaluate( Object object ) { IContentInfo type = (IContentInfo) object; return type.getTitle().equals( "Test Type Missing type" ); } } ) ); assertEquals( "\"test-type-missing-title\" should not have been loaded", 0, CollectionUtils.countMatches( contentTypes, new Predicate() { public boolean evaluate( Object object ) { IContentInfo type = (IContentInfo) object; return type.getExtension().equals( "test-type-missing-title" ); } } ) ); } @SuppressWarnings( "deprecation" ) @Test public void testLoadPerspectives() throws PlatformPluginRegistrationException { microPlatform.init(); List<IPlatformPlugin> plugins = provider.getPlugins( new StandaloneSession() ); IPlatformPlugin plugin = (IPlatformPlugin) CollectionUtils.find( plugins, new PluginNameMatcherPredicate( "Plugin 1" ) ); assertNotNull( "Plugin 1 should have been found", plugin ); assertEquals( 2, plugin.getPluginPerspectives().size() ); IPluginPerspective perspective = plugin.getPluginPerspectives().get( 0 ); assertEquals( perspective.getId(), "perspective1" ); assertEquals( perspective.getTitle(), "Test Perspective 1" ); assertEquals( perspective.getLayoutPriority(), 500 ); } }