/****************************************************************************** * Copyright (c) 2016 Oracle * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Konstantin Komissarchik - initial implementation and ongoing maintenance ******************************************************************************/ package org.eclipse.sapphire.ui; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.sapphire.Context; import org.eclipse.sapphire.LoggingService; import org.eclipse.sapphire.Sapphire; import org.eclipse.sapphire.modeling.ExtensionsLocator; import org.eclipse.sapphire.modeling.ResourceStoreException; import org.eclipse.sapphire.modeling.UrlResourceStore; import org.eclipse.sapphire.modeling.xml.RootXmlResource; import org.eclipse.sapphire.modeling.xml.XmlResourceStore; import org.eclipse.sapphire.ui.def.ActionDef; import org.eclipse.sapphire.ui.def.ActionHandlerDef; import org.eclipse.sapphire.ui.def.ActionHandlerFactoryDef; import org.eclipse.sapphire.ui.def.ISapphireUiExtensionDef; /** * @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a> */ public final class SapphireExtensionSystem { private static List<ISapphireUiExtensionDef> extensions; private static List<ActionDef> actions; private static List<ActionHandlerDef> actionHandlers; private static List<ActionHandlerFactoryDef> actionHandlerFactories; public static synchronized List<ISapphireUiExtensionDef> getExtensions() { if( extensions == null ) { final List<ISapphireUiExtensionDef> list = new ArrayList<ISapphireUiExtensionDef>(); for( final ExtensionsLocator.Handle handle : ExtensionsLocator.instance().find() ) { try { final UrlResourceStore store = new UrlResourceStore( handle.extension() ) { @Override public <A> A adapt( final Class<A> adapterType ) { if( adapterType == Context.class ) { return adapterType.cast( handle.context() ); } return super.adapt( adapterType ); } }; final XmlResourceStore xmlResourceStore = new XmlResourceStore( store ); final RootXmlResource resource = new RootXmlResource( xmlResourceStore ); final ISapphireUiExtensionDef extension = ISapphireUiExtensionDef.TYPE.instantiate( resource ); list.add( extension ); } catch( ResourceStoreException e ) { Sapphire.service( LoggingService.class ).log( e ); } } extensions = Collections.unmodifiableList( list ); } return extensions; } public static synchronized List<ActionDef> getActions() { if( actions == null ) { final List<ActionDef> list = new ArrayList<ActionDef>(); for( ISapphireUiExtensionDef extension : getExtensions() ) { for( ActionDef def : extension.getActions() ) { // TODO: Validate and log list.add( def ); } } actions = Collections.unmodifiableList( list ); } return actions; } public static synchronized List<ActionHandlerDef> getActionHandlers() { if( actionHandlers == null ) { final List<ActionHandlerDef> list = new ArrayList<ActionHandlerDef>(); for( ISapphireUiExtensionDef extension : getExtensions() ) { for( ActionHandlerDef def : extension.getActionHandlers() ) { // TODO: Validate and log list.add( def ); } } actionHandlers = Collections.unmodifiableList( list ); } return actionHandlers; } public static synchronized List<ActionHandlerFactoryDef> getActionHandlerFactories() { if( actionHandlerFactories == null ) { final List<ActionHandlerFactoryDef> list = new ArrayList<ActionHandlerFactoryDef>(); for( ISapphireUiExtensionDef extension : getExtensions() ) { for( ActionHandlerFactoryDef def : extension.getActionHandlerFactories() ) { // TODO: Validate and log list.add( def ); } } actionHandlerFactories = Collections.unmodifiableList( list ); } return actionHandlerFactories; } }