/******************************************************************************* * Copyright (c) 2011 Frank Appel and others. * 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 ******************************************************************************/ package com.codeaffine.example.rwt.osgi.configurationadmin; import java.io.IOException; import java.util.Dictionary; import java.util.Hashtable; import org.eclipse.equinox.http.jetty.JettyConstants; import org.eclipse.rap.rwt.application.ApplicationConfiguration; import org.eclipse.rap.rwt.osgi.ApplicationLauncher; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import org.osgi.framework.ServiceReference; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; import org.osgi.service.http.HttpService; public class DeploymentHelper { private BundleContext bundleContext; public DeploymentHelper() { this.bundleContext = getBundleContext(); } public static BundleContext getBundleContext() { return FrameworkUtil.getBundle( DeploymentHelper.class ).getBundleContext(); } public void deployApplication( String configurator, String port, String contextName ) { String key = createApplicationKey( configurator, port, contextName ); try { Configuration configuration = createConfiguration( configurator ); configuration.update( createApplicationSettings( key, port, contextName ) ); } catch( IOException ioe ) { throw new RuntimeException( "Unable to update configuration for " + key, ioe ); } } public void undeployApplication( String configurator, String port, String contextName ) { deleteConfiguration( createApplicationFilter( configurator, port, contextName ) ); } @SuppressWarnings("unchecked") public void deployUIContribution( String contributor, String configurator, String port, String contextName ) { try { Configuration configuration = createConfiguration( contributor ); configuration.update( createSettings( contributor, configurator, port, contextName ) ); } catch( IOException ioe ) { throw new RuntimeException( "Unable to update configuration for " + contributor, ioe ); } } public void undeployUIContribution( String contributor, String configurator, String port, String contextName ) { String filter = createUIContributorFilter( contributor, configurator, port, contextName ); deleteConfiguration( filter ); } private Configuration createConfiguration( String configurationName ) throws IOException { Configuration result; ServiceReference<ConfigurationAdmin> reference = getConfigurationAdmin(); ConfigurationAdmin configurationAdmin = bundleContext.getService( reference ); try { result = configurationAdmin.createFactoryConfiguration( configurationName ); } finally { bundleContext.ungetService( reference ); } return result; } private void deleteConfiguration( String filter ) { try { ServiceReference<ConfigurationAdmin> reference = getConfigurationAdmin(); ConfigurationAdmin configurationAdmin = bundleContext.getService( reference ); Configuration[] configurations; try { configurations = configurationAdmin.listConfigurations( filter ); } finally { bundleContext.ungetService( reference ); } if( configurations != null && configurations.length >= 1 ) { configurations[ 0 ].delete(); } } catch( Exception exception ) { throw new RuntimeException( "Unable to delete configuration for " + filter, exception ); } } private ServiceReference<ConfigurationAdmin> getConfigurationAdmin() { return bundleContext.getServiceReference( ConfigurationAdmin.class ); } private static Dictionary<String, Object> createApplicationSettings( String key, String port, String contextName ) { Dictionary<String,Object> result = new Hashtable<String, Object>(); result.put( createTargetKey( HttpService.class ), createPortFilter( port ) ); result.put( getConfigurationKey(), key ); result.put( key, port ); if( contextName != null ) { result.put( ApplicationLauncher.PROPERTY_CONTEXT_NAME, contextName ); } return result; } @SuppressWarnings( { "rawtypes", "unchecked" } ) private static Dictionary createSettings( String contributor, String configurator, String port, String contextName ) { String key = createUIContributorKey( contributor, configurator, port, contextName ); String value = createApplicationKey( configurator, port, contextName ); Hashtable result = new Hashtable(); result.put( key, value ); result.put( getConfigurationKey(), value ); return result; } private static String createUIContributorKey( String contributor, String configurator, String port, String contextName ) { return contributor + "_" + createApplicationKey( configurator, port, contextName ); } private static String createTargetKey( Class<?> targetType ) { StringBuilder result = new StringBuilder(); result.append( targetType.getSimpleName().substring( 0, 1 ).toLowerCase() ); result.append( targetType.getSimpleName().substring( 1 ) ); result.append( ".target" ); return result.toString(); } private static String getConfigurationKey() { return ApplicationConfiguration.class.getSimpleName(); } private static String createPortFilter( String port ) { return "(" + JettyConstants.HTTP_PORT + "=" + port + ")"; } private static String createUIContributorFilter( String contributor, String configurator, String port, String contextName ) { String key = createUIContributorKey( contributor, configurator, port, contextName ); String value = createApplicationKey( configurator, port, contextName ); return "(" + key + "=" + value + ")"; } private static String createApplicationFilter( String configurator, String port, String contextName ) { String key = createApplicationKey( configurator, port, contextName ); return "(" + key + "=" + port + ")"; } private static String createApplicationKey( String configurator, String port, String contextName ) { return port + "_" + configurator + "_" + contextName; } }