blob: 794da534e75cfdf0d9ecd65850537b6a17c0491e [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 org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.osgi.service.resolver.VersionRange;
import org.eclipse.osgi.util.ManifestElement;
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.factory.ReversibleFactory.ReversiblePackageType;
import org.eclipse.papyrus.adltool.reversible.packages.ReversiblePackage;
import org.eclipse.papyrus.osgi.profile.OSGIStereotypes;
import org.eclipse.swt.graphics.Image;
import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
/**
* This class is a reversible adapter of a loaded plug-in.
*/
public class LoadedPlugin extends AbstractPlugin {
private Bundle bundle;
/**
* Constructor.
*
* @param bundle
*/
public LoadedPlugin(Bundle bundle) {
super();
this.bundle = bundle;
List<ReversiblePackage> exportedPackages = new ArrayList<>();
List<ManifestElement> manifestExportedPackages = extractManifestHeader(Constants.EXPORT_PACKAGE);
for (ManifestElement exportedPackage : manifestExportedPackages) {
ReversiblePackage exportPackage = ReversibleFactory.getInstance().makeReversible(exportedPackage.getValue(), ReversiblePackageType.EXPORT);
exportPackage.setParent(this);
exportedPackages.add(exportPackage);
}
List<ManifestElement> manifestImportedPackages = extractManifestHeader(Constants.IMPORT_PACKAGE);
List<ReversiblePackage> importedPackages = new ArrayList<>();
for (ManifestElement importedPackage : manifestImportedPackages) {
ReversiblePackage importPackage = ReversibleFactory.getInstance().makeReversible(importedPackage.getValue(), ReversiblePackageType.IMPORT);
importPackage.setParent(this);
importedPackages.add(importPackage);
}
// Save the extension points
IExtensionPoint[] bundleExtensionPoints = ADL4EclipseUtils.findExtensionPointsForBundle(bundle.getBundleId(), getId());
List<ReversibleExtensionPoint> extensionPoints = new ArrayList<>();
for (IExtensionPoint bundleExtensionPoint : bundleExtensionPoints) {
ReversibleExtensionPoint extensionPoint = ReversibleFactory.getInstance().makeReversible(bundleExtensionPoint);
extensionPoint.setParent(this);
extensionPoints.add(extensionPoint);
}
// Save the extensions
IExtension[] bundleExtensions = ADL4EclipseUtils.findExtensionsForBundle(bundle.getBundleId(), getId());
List<ReversibleExtension> extensions = new ArrayList<>();
for (IExtension extension : bundleExtensions) {
ReversibleExtension reversibleExtension = ReversibleFactory.getInstance().makeReversible(extension);
reversibleExtension.setParent(this);
extensions.add(reversibleExtension);
}
setExportedPackages(exportedPackages);
setImportedPackages(importedPackages);
setExtensionPoints(extensionPoints);
setExtensions(extensions);
}
@Override
public String getId() {
return bundle.getSymbolicName();
}
@Override
public String getStereotypeName() {
return OSGIStereotypes.BUNDLE;
}
@Override
public Type getType() {
return Type.BUNDLE;
}
@Override
public Image getImage() {
return ADL4EclipseUtils.getImage("img/bundle_obj.gif");
}
@Override
public boolean isSingleton() {
String isSingleton = getBundleValue(Constants.SINGLETON_DIRECTIVE);
return Boolean.valueOf(isSingleton);
}
@Override
public List<ReversibleProject> getDependencies() {
List<ReversibleProject> dependencies = new ArrayList<>();
List<ManifestElement> requiredBundles = extractManifestHeader(Constants.REQUIRE_BUNDLE);
if (!requiredBundles.isEmpty()) {
for (ManifestElement requiredBundle : requiredBundles) {
String bundleId = requiredBundle.getValue();
if (!Constants.SYSTEM_BUNDLE_SYMBOLICNAME.equals(bundleId)) {
ReversibleProject reversibleChild = ReversibleFactory.getInstance().getPlugin(bundleId);
if (reversibleChild != null) {
dependencies.add(reversibleChild);
// Version
String version = requiredBundle.getAttribute(Constants.BUNDLE_VERSION_ATTRIBUTE);
if (version != null) {
VersionRange versionRange = new VersionRange(version);
reversibleVersion.put(reversibleChild, new StereotypeVersion(versionRange));
}
} else {
log.warn(getType() + " \"" + getId() + "\": cannot find child " + bundleId);
}
}
}
}
return dependencies;
}
@Override
protected String getBundleValue(String key) {
return bundle.getHeaders().get(key);
}
}