blob: ebcf05e8a42970a3ad0a62ccd48dbb5563a78c1d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2011 EclipseSource 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
*
* Contributors:
* Holger Staudacher - initial API and implementation
*******************************************************************************/
package org.eclipse.libra.warproducts.ui.editor;
import java.util.*;
import org.eclipse.libra.warproducts.core.validation.Validator;
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.eclipse.osgi.service.resolver.HostSpecification;
import org.eclipse.pde.internal.core.TargetPlatformHelper;
import org.eclipse.pde.internal.core.iproduct.*;
import org.eclipse.pde.internal.ui.editor.PDEFormEditor;
import org.eclipse.pde.internal.ui.editor.PDEFormPage;
import org.eclipse.pde.internal.ui.editor.product.PluginSection;
import org.eclipse.pde.internal.ui.search.dependencies.DependencyCalculator;
import org.eclipse.swt.widgets.Composite;
public class PluginSectionExtended extends PluginSection {
private static final int BUTTON_ADD_REQUIRED = 2;
public PluginSectionExtended( final PDEFormPage formPage,
final Composite parent )
{
super( formPage, parent );
}
protected void buttonSelected( int index ) {
if( index == BUTTON_ADD_REQUIRED ) {
PDEFormEditor pdeEditor = getPage().getPDEEditor();
IProductModel model = ( IProductModel )pdeEditor.getAggregateModel();
validHandleAddRequired( model.getProduct().getPlugins(),
includeOptionalDependencies() );
} else {
super.buttonSelected( index );
}
}
private static void validHandleAddRequired(
final IProductPlugin[] plugins,
final boolean includeOptional )
{
if( plugins.length > 0 ) {
ArrayList<BundleDescription> list = new ArrayList<BundleDescription>( plugins.length );
for( int i = 0; i < plugins.length; i++ ) {
list.add( TargetPlatformHelper.getState()
.getBundle( plugins[ i ].getId(), null ) );
}
DependencyCalculator calculator
= new DependencyCalculator( includeOptional );
calculator.findDependencies( list.toArray() );
BundleDescription[] bundles
= TargetPlatformHelper.getState().getBundles();
for( int i = 0; i < bundles.length; i++ ) {
HostSpecification host = bundles[ i ].getHost();
String compatibilityId = "org.eclipse.ui.workbench.compatibility"; //$NON-NLS-1$
String bundleName = bundles[ i ].getSymbolicName();
boolean compatible = compatibilityId.equals( bundleName );
if( host != null ) {
String hostName = host.getName();
boolean containsPluginId = calculator.containsPluginId( hostName );
if( !compatible && containsPluginId ) {
calculator.findDependency( bundles[ i ] );
}
}
}
List<String> dependencies = validateBundleIds( calculator.getBundleIDs() );
validateBundleIds( dependencies );
IProduct product = plugins[ 0 ].getProduct();
IProductModelFactory factory = product.getModel().getFactory();
IProductPlugin[] requiredPlugins
= new IProductPlugin[ dependencies.size() ];
for( int i = 0; i < requiredPlugins.length; i++ ) {
String id = dependencies.get( i );
IProductPlugin plugin = factory.createPlugin();
plugin.setId( id );
requiredPlugins[ i ] = plugin;
}
product.addPlugins( requiredPlugins );
}
}
private static List<String> validateBundleIds( final Collection<String> bundleIDs ) {
List<String> validBundles = new ArrayList<String>();
copyBundleIds( bundleIDs, validBundles );
handleBannedBundles( validBundles );
handleRequiredBundles( validBundles );
return validBundles;
}
private static void copyBundleIds( final Collection<String> bundleIDs,
final List<String> validBundles )
{
Iterator<String> iter = bundleIDs.iterator();
while( iter.hasNext() ) {
validBundles.add( iter.next() );
}
}
private static void handleRequiredBundles( final Collection<String> bundleIDs ) {
String[] requiredBundles = Validator.REQUIRED_BUNDLES;
for( int i = 0; i < requiredBundles.length; i++ ) {
String requiredId = requiredBundles[ i ];
if( !bundleIDs.contains( requiredId ) ) {
bundleIDs.add( requiredId );
}
}
}
private static void handleBannedBundles( final Collection<String> bundleIDs ) {
String[] bannedBundles = Validator.BANNED_BUNDLES;
for( int i = 0; i < bannedBundles.length; i++ ) {
String bannedId = bannedBundles[ i ];
if( bundleIDs.contains( bannedId ) ) {
bundleIDs.remove( bannedId );
}
}
}
}