/*
* Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License, Version 1.0,
* which accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*
*/
package net.rim.ejde.internal.util;
import java.io.File;
import java.net.URL;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
import net.rim.ejde.internal.core.IConstants;
import net.rim.ejde.internal.legacy.JDEInfo;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.RegistryFactory;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jdt.launching.VMStandin;
import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
/**
* This class is meant to house all utils to do with the CPs and the extension used
*
* @author jheifetz
*/
public class ComponentPackUtils {
static final private Logger log = Logger.getLogger( ComponentPackUtils.class );
private static boolean _isInitialInstall = false;
private static String SUFFIX = File.separator + IConstants.EE_FILE_LOCATION;
/**
* The Class ComponentPackComparator.
*/
static public final class ComponentPackComparator implements Comparator< String > {
/**
* Instantiates a new component pack comparator.
*/
public ComponentPackComparator() {
}
/*
* (non-Javadoc)
*
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare( final String cPack1, final String cPack2 ) {
if( ( null == cPack1 ) || ( null == cPack2 ) )
throw new IllegalArgumentException( Messages.ComponentPackHandler_Undefined_Object_Argument_Err_Msg );
final int result = cPack1.compareTo( cPack2 );
if( result < 0 )
return 1;
else if( result > 0 )
return -1;
else
return 0;
}
}
/**
* Gets the component pack paths based on the CP extension point
*
* @return the component pack paths
*/
public static Map< String, JDEInfo > getComponentPackPaths() {
ComponentPackUtils.log.debug( "Starting Search for CPs" ); //$NON-NLS-1$
IExtension[] extensions;
final IExtensionRegistry registry = RegistryFactory.getRegistry();
final IExtensionPoint point = registry.getExtensionPoint( IConstants.CP_EXTENSION_POINT_ID );
final TreeMap< String, JDEInfo > packs = new TreeMap< String, JDEInfo >( new ComponentPackComparator() );
if( ( null == point ) || !point.isValid() ) {
ComponentPackUtils.log.debug( "Extention Point Null or Invalid" ); //$NON-NLS-1$
return packs;
}
extensions = point.getExtensions();
if( ( null == extensions ) || ( 0 == extensions.length ) ) {
ComponentPackUtils.log.debug( "Extentions Null or Non-Existant" ); //$NON-NLS-1$
return packs;
}
Bundle bundle;
URL url;
String name, version, path;
File file;
for( final IExtension extension : extensions ) {
try {
bundle = Platform.getBundle( extension.getNamespaceIdentifier() );
final int bundleState = bundle.getState();
if( ( bundleState != Bundle.UNINSTALLED ) && ( bundleState != Bundle.STOPPING ) ) {
url = FileLocator.resolve( FileLocator.find( bundle, Path.ROOT, null ) );
name = bundle.getHeaders().get( Constants.BUNDLE_NAME );
version = bundle.getHeaders().get( Constants.BUNDLE_VERSION );
if( StringUtils.isBlank( name ) || StringUtils.isBlank( version ) ) {
break;
}
file = new File( url.getFile() );
if( !file.exists() ) {
break;
}
path = file.getAbsolutePath() + ComponentPackUtils.SUFFIX;
ComponentPackUtils.log.debug( "CP named " + name + " was found at " + path ); //$NON-NLS-1$ //$NON-NLS-2$
packs.put( name, new JDEInfo( name, path, version ) );
}
} catch( final Throwable e ) {
ComponentPackUtils.log.error( e.getMessage(), e );
}
}
return packs;
}
/**
* Public method to insure that CPs are only loaded once.
*/
public static synchronized void initialLoad() {
if( !_isInitialInstall ) {
_isInitialInstall = true;
loadAllCPPluginsAsVMs();
}
}
/**
* Searches for CPs and creates corresponding VMs for those that are found.
*/
private static void loadAllCPPluginsAsVMs() {
final Map< String, JDEInfo > cpPaths = ComponentPackUtils.getComponentPackPaths();
try {
for( final JDEInfo info : cpPaths.values() ) {
final File bbSdkEEConfFile = new File( info.getPath() + File.separator + IConstants.EE_FILE_NAME );
if( bbSdkEEConfFile.exists() && bbSdkEEConfFile.isFile() ) {
final VMStandin standin = VMUtils.createVMFromDefinitionFile( bbSdkEEConfFile, true );
if( standin != null ) {
standin.convertToRealVM();
}
}
}
// Save changes to the preferences for storage.
JavaRuntime.saveVMConfiguration();
} catch( final CoreException ce ) {
log.error( "VM Initial Load Error", ce );
}
}
}