blob: dfe9b9a95ed53f29c011c5d6329ef0de5034cd34 [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2015 CEA LIST.
*
* 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:
* Thomas Daniellou (CEA LIST) - Initial API and implementation
*****************************************************************************/
package org.eclipse.papyrus.adltool.reversible.project;
import static org.eclipse.papyrus.adltool.Activator.log;
import java.util.ArrayList;
import java.util.List;
import java.util.PropertyResourceBundle;
import org.eclipse.osgi.service.resolver.VersionRange;
import org.eclipse.papyrus.adl4eclipse.org.ADL4Eclipse_Stereotypes;
import org.eclipse.papyrus.adltool.ADL4EclipseUtils;
import org.eclipse.papyrus.adltool.reversible.extension.ReversibleExtension;
import org.eclipse.papyrus.adltool.reversible.extensionpoint.ReversibleExtensionPoint;
import org.eclipse.papyrus.adltool.reversible.factory.ReversibleFactory;
import org.eclipse.papyrus.adltool.reversible.packages.ReversiblePackage;
import org.eclipse.pde.core.plugin.IPluginExtension;
import org.eclipse.pde.core.plugin.IPluginExtensionPoint;
import org.eclipse.pde.core.project.IBundleProjectDescription;
import org.eclipse.pde.core.project.IPackageExportDescription;
import org.eclipse.pde.core.project.IPackageImportDescription;
import org.eclipse.pde.core.project.IRequiredBundleDescription;
import org.eclipse.swt.graphics.Image;
import org.osgi.framework.Constants;
import org.osgi.framework.Version;
/**
* This class is a reversible adapter of a workspace plug-in.
*/
public class WorkspacePlugin extends AbstractPlugin {
private IBundleProjectDescription plugin;
/**
* Constructor.
*
* @param plugin
*/
public WorkspacePlugin(IBundleProjectDescription plugin) {
super();
this.plugin = plugin;
// Save the exported packages
List<ReversiblePackage> reversiblePackageExports = new ArrayList<>();
IPackageExportDescription[] packageExports = plugin.getPackageExports();
if (packageExports != null) {
for (IPackageExportDescription packageExport : packageExports) {
if (packageExport != null) {
ReversiblePackage reversiblePackageExport = ReversibleFactory.getInstance().makeReversible(packageExport);
reversiblePackageExports.add(reversiblePackageExport);
Version version = packageExport.getVersion();
if (version != null) {
setReversibleVersion(reversiblePackageExport, new StereotypeVersion(version));
}
}
}
}
// Save the imported packages
List<ReversiblePackage> reversiblePackageImports = new ArrayList<>();
IPackageImportDescription[] packageImports = plugin.getPackageImports();
if (packageImports != null) {
for (IPackageImportDescription packageImport : packageImports) {
if (packageImport != null) {
ReversiblePackage reversiblePackageImport = ReversibleFactory.getInstance().makeReversible(packageImport);
reversiblePackageImports.add(reversiblePackageImport);
VersionRange versionRange = packageImport.getVersionRange();
if (versionRange != null) {
setReversibleVersion(reversiblePackageImport, new StereotypeVersion(versionRange));
}
}
}
}
// Save the extension points
IPluginExtensionPoint[] pluginExtensionPoints = ADL4EclipseUtils.findExtensionPointsForPlugin(getId());
List<ReversibleExtensionPoint> extensionPoints = new ArrayList<>();
for (IPluginExtensionPoint pluginExtensionPoint : pluginExtensionPoints) {
ReversibleExtensionPoint extensionPoint = ReversibleFactory.getInstance().makeReversible(pluginExtensionPoint);
extensionPoint.setParent(this);
extensionPoints.add(extensionPoint);
}
// Save the extensions
IPluginExtension[] pluginExtensions = ADL4EclipseUtils.findExtensionsForPlugin(getId());
List<ReversibleExtension> extensions = new ArrayList<>();
for (IPluginExtension extension : pluginExtensions) {
ReversibleExtension reversibleExtension = ReversibleFactory.getInstance().makeReversible(extension);
reversibleExtension.setParent(this);
extensions.add(reversibleExtension);
}
setExportedPackages(reversiblePackageExports);
setImportedPackages(reversiblePackageImports);
setExtensionPoints(extensionPoints);
setExtensions(extensions);
}
@Override
public String getId() {
return plugin.getSymbolicName();
}
@Override
public String getStereotypeName() {
return ADL4Eclipse_Stereotypes.PLUGIN_STEREOTYPE;
}
@Override
public Type getType() {
return Type.PLUGIN;
}
@Override
public Image getImage() {
return ADL4EclipseUtils.getImage("img/bundle_pj.gif");
}
@Override
public boolean isSingleton() {
return plugin.isSingleton();
}
@Override
public List<ReversibleProject> getDependencies() {
List<ReversibleProject> dependencies = new ArrayList<>();
IRequiredBundleDescription[] requiredBundles = plugin.getRequiredBundles();
if (requiredBundles != null) {
for (IRequiredBundleDescription requiredBundle : requiredBundles) {
if (requiredBundle != null) {
String pluginId = requiredBundle.getName();
if (!Constants.SYSTEM_BUNDLE_SYMBOLICNAME.equals(pluginId)) {
ReversibleProject reversiblePlugin = ReversibleFactory.getInstance().getPlugin(pluginId);
if (reversiblePlugin != null) {
dependencies.add(reversiblePlugin);
// Save the version range of the dependency
VersionRange versionRange = requiredBundle.getVersionRange();
if (versionRange != null) {
reversibleVersion.put(reversiblePlugin, new StereotypeVersion(versionRange));
}
} else {
log.warn(getType() + " \"" + getId() + "\": cannot find child " + pluginId);
}
}
}
}
}
return dependencies;
}
@Override
protected String getBundleValue(String key) {
String valueFromDescription = plugin.getHeader(key);
PropertyResourceBundle propertyResourceBundle = ADL4EclipseUtils.getNLSFilesFor(plugin);
if (propertyResourceBundle != null && valueFromDescription != null) {
if (valueFromDescription.startsWith("%") && valueFromDescription.length() > 1) { //$NON-NLS-1$
String propertiesKey = valueFromDescription.substring(1);
valueFromDescription = propertyResourceBundle.getString(propertiesKey);
}
}
return valueFromDescription;
}
}