/* * 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) 2016 Pentaho Corporation. All rights reserved. */ package org.pentaho.marketplace.di.plugin; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.pentaho.di.ui.spoon.Spoon; import org.pentaho.di.ui.spoon.SpoonLifecycleListener; import org.pentaho.di.ui.spoon.SpoonPerspective; import org.pentaho.di.ui.spoon.SpoonPluginCategories; import org.pentaho.di.ui.spoon.SpoonPluginInterface; import org.pentaho.di.ui.spoon.TabMapEntry; import org.pentaho.ui.xul.XulDomContainer; import org.pentaho.ui.xul.XulException; @org.pentaho.di.ui.spoon.SpoonPlugin( id = "pentaho-marketplace-di", image = "" ) @SpoonPluginCategories( { "spoon" } ) public class SpoonPlugin implements SpoonPluginInterface { private static final String RESOURCE_PATH = "org/pentaho/marketplace/di/plugin/res"; private static final String OVERLAY_FILE_PATH = RESOURCE_PATH + "/spoon_overlay.xul"; private static final String SPOON_CATEGORY = "spoon"; // region Properties private XulDomContainer container; public void setUrl( String url ) { MenuHandler.WEB_CLIENT_PATH = url; } public SpoonLifecycleListener getLifecycleListener() { return new SpoonLifecycleListener() { public void onEvent( SpoonLifeCycleEvent evt ) { if ( evt.equals( SpoonLifeCycleEvent.STARTUP ) ) { try { getSpoon().setMarketMethod( MenuHandler.class.getMethod( "openMarketplace" ) ); } catch ( Throwable e ) { // under no circumstance allow the failure to prevent market load logger.warn( e.getMessage(), e ); } } } }; } // May be called more than once, don't construct your perspective here. public SpoonPerspective getPerspective() { return null; } public Spoon getSpoon() { if ( this.spoon == null ) { return Spoon.getInstance(); } return this.spoon; } public void setSpoon( Spoon spoon ) { this.spoon = spoon; } private Spoon spoon; protected Log getLogger() { return this.logger; } private Log logger = LogFactory.getLog( this.getClass() ); protected MenuHandler getMenuHandler() { return this.menuHandler; } protected void setMenuHandler( MenuHandler menuHandler ) { this.menuHandler = menuHandler; } private MenuHandler menuHandler; // endregion // region Constructors public SpoonPlugin() { this.setMenuHandler( new MenuHandler() ); } // endregion /** * This call tells the Spoon Plugin to make it's modification to the particular area in Spoon (category). The current * possible areas are: trans-graph, job-graph, database_dialog and spoon. * * @param category Area to modify * @param container The XUL-document for the particular category. * @throws XulException */ public void applyToContainer( String category, XulDomContainer container ) throws XulException { if ( category.equals( SPOON_CATEGORY ) ) { this.container = container; container.registerClassLoader( getClass().getClassLoader() ); container.loadOverlay( OVERLAY_FILE_PATH ); container.addEventHandler( this.getMenuHandler() ); // refresh menus this.getSpoon().enableMenus(); } } // Called by OSGI on remove public void removeFromContainer() throws XulException { if ( container == null ) { return; } final Spoon spoon = this.getSpoon(); final Log logger = this.getLogger(); final String menuHandlerName = this.getMenuHandler().getName(); spoon.getDisplay().syncExec( new Runnable() { public void run() { try { container.removeOverlay( OVERLAY_FILE_PATH ); } catch ( XulException e ) { logger.error( "Error removing overlay: " + OVERLAY_FILE_PATH, e ); } container.getEventHandlers().remove( menuHandlerName ); container.deRegisterClassLoader( SpoonPlugin.class.getClassLoader() ); closeMarketplaceTab(); // refresh menus spoon.enableMenus(); } private void closeMarketplaceTab() { TabMapEntry marketplaceTab = getMarketplaceTab(); if ( marketplaceTab != null ) { spoon.delegates.tabs.removeTab( marketplaceTab ); } } private TabMapEntry getMarketplaceTab() { TabMapEntry marketplaceTab = null; for ( TabMapEntry tabMapEntry : spoon.delegates.tabs.getTabs() ) { if ( tabMapEntry.getTabItem().getId().equalsIgnoreCase( "Marketplace" ) ) { marketplaceTab = tabMapEntry; break; } } return marketplaceTab; } } ); } }