blob: 737ba3126827f526408e7106f8ce05d0dda6c739 [file] [log] [blame]
/**
* Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-v2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Thales Corporate Services S.A.S - initial API and implementation
*/
package org.eclipse.egf.core.platform.internal.pde;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.egf.common.helper.BundleHelper;
import org.eclipse.egf.common.helper.CollectionHelper;
import org.eclipse.egf.core.platform.EGFPlatformPlugin;
import org.eclipse.egf.core.platform.l10n.CorePlatformMessages;
import org.eclipse.egf.core.platform.pde.IPlatformBundle;
import org.eclipse.egf.core.platform.pde.IPlatformExtensionPoint;
import org.eclipse.egf.core.platform.pde.IPlatformExtensionPointFactory;
import org.eclipse.emf.common.util.URI;
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.core.plugin.IPluginBase;
import org.eclipse.pde.core.plugin.IPluginElement;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.PluginRegistry;
import org.eclipse.pde.internal.core.bundle.BundleFragment;
import org.osgi.framework.Bundle;
class PlatformBundle implements IPlatformBundle {
private Bundle _bundle;
private IPluginModelBase _base;
private String _previousBundleId;
private Map<Class<?>, Map<String, Object>> _extensions = new HashMap<Class<?>, Map<String, Object>>();
public PlatformBundle(IPluginModelBase base) {
Assert.isNotNull(base);
Assert.isNotNull(BundleHelper.getBundleId(base));
_base = base;
_previousBundleId = BundleHelper.getBundleId(base);
}
public PlatformBundle(Bundle bundle) {
Assert.isNotNull(bundle);
Assert.isNotNull(bundle.getSymbolicName());
_bundle = bundle;
_previousBundleId = bundle.getSymbolicName();
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((_base == null) ? 0 : _base.hashCode());
result = prime * result + ((_bundle == null) ? 0 : _bundle.hashCode());
result = prime * result + ((_previousBundleId == null) ? 0 : _previousBundleId.hashCode());
return result;
}
@Override
public boolean equals(Object object) {
if (object == null) {
return false;
}
if (this == object) {
return true;
}
if (object instanceof IPlatformBundle == false) {
return false;
}
if (getPluginModelBase() != null && ((IPlatformBundle) object).getPluginModelBase() != null) {
return getPluginModelBase() == ((IPlatformBundle) object).getPluginModelBase();
}
if (getBundle() != null && ((IPlatformBundle) object).getBundle() != null) {
return getBundle() == ((IPlatformBundle) object).getBundle();
}
return false;
}
public String getBundleId() {
if (_base != null) {
return BundleHelper.getBundleId(_base);
}
return getBundle().getSymbolicName();
}
public String getPreviousBundleId() {
return _previousBundleId;
}
public IPluginModelBase getPluginModelBase() {
if (isRuntime() == false) {
return _base;
}
// PDE analysis
IPluginModelBase base = PluginRegistry.findModel(getBundleId());
if (base == null) {
return null;
}
// Runtime Bundle and Target Bundle are compatible
// TODO: should be enhanced to match compatible bundle rather than strict version equality
if (base.getPluginBase().getVersion() != null && base.getPluginBase().getVersion().equals(_bundle.getVersion().toString())) {
return base;
}
return null;
}
public boolean isFragment() {
if (getPluginModelBase() != null) {
return getPluginModelBase().isFragmentModel();
}
return getBundle() instanceof BundleFragment;
}
/**
* Get the IProject from this IPlatformBundle
*
* @return null if the bundle is not in the workspace.
*/
public IProject getProject() {
if (isWorkspace()) {
// Retrieve project from the model.
return getPluginModelBase().getUnderlyingResource().getProject();
}
return null;
}
/**
* Get the Bundle from this IPlatformBundle
*
* @return null if the bundle is a target or a workspace bundle.
*/
public Bundle getBundle() {
// Process known use cases
if (isWorkspace()) {
return null;
}
if (isRuntime()) {
return _bundle;
}
// Target matching analysis
Bundle bundle = Platform.getBundle(getBundleId());
if (bundle == null) {
return null;
}
// Target Bundle and Runtime Bundle are compatible
// TODO: should be enhanced to match compatible bundle rather than strict version equality
// if (_base.getPluginBase().getVersion() != null && _base.getPluginBase().getVersion().equals(bundle.getVersion().toString())) {
return bundle;
// }
// return null;
}
public boolean isRuntime() {
return _bundle != null;
}
public boolean isTarget() {
if (isRuntime() == false) {
return getPluginModelBase().getUnderlyingResource() == null;
}
return false;
}
public boolean isWorkspace() {
return isRuntime() == false && isTarget() == false;
}
@SuppressWarnings("unchecked")
protected <T extends IPlatformExtensionPoint> T createPlatformExtensionPoint(Class<T> clazz, Object element) {
if (element instanceof IPluginElement) {
// Check
if (((IPluginElement) element).isValid() == false) {
EGFPlatformPlugin.getDefault().logWarning(NLS.bind("PlatformBundle.createPlatformExtensionPoint(..) _ Bundle ''{0}'' invalid IPluginElement ''{1}''.", //$NON-NLS-1$
getBundleId(), ((IPluginElement) element).getName()));
return null;
}
} else if (element instanceof IConfigurationElement) {
// Check
if (((IConfigurationElement) element).isValid() == false) {
EGFPlatformPlugin.getDefault().logWarning(NLS.bind("PlatformBundle.createPlatformExtensionPoint(..) _ Bundle ''{0}'' invalid IConfigurationElement ''{1}''.", //$NON-NLS-1$
getBundleId(), ((IConfigurationElement) element).getName()));
return null;
}
} else {
throw new UnsupportedOperationException();
}
// Retrieve Factory
IPlatformExtensionPointFactory<T> extensionPointFactory = (IPlatformExtensionPointFactory<T>) EGFPlatformPlugin.getPlatformExtensionPointFactories().get(clazz);
if (extensionPointFactory == null) {
return null;
}
T extensionPoint = extensionPointFactory.createExtensionPoint(this, element);
if (extensionPoint == null) {
return null;
}
Map<String, Object> extensionPoints = _extensions.get(clazz);
if (extensionPoints == null) {
extensionPoints = new HashMap<String, Object>();
_extensions.put(clazz, extensionPoints);
}
try {
if (extensionPoints.get(extensionPoint.getId()) != null) {
EGFPlatformPlugin.getDefault().logWarning(NLS.bind("PlatformBundle.createPlatformExtensionPoint(..) _ Bundle ''{0}'' already contains Extension Point ''{1}''.", //$NON-NLS-1$
getBundleId(), extensionPoint.getId()));
return null;
}
if (extensionPoints.put(extensionPoint.getId(), extensionPoint) != null) {
EGFPlatformPlugin.getDefault().logError(NLS.bind("PlatformBundle.createPlatformExtensionPoint(..) _ Bundle ''{0}'' unable to add Extension Point ''{1}''.", //$NON-NLS-1$
getBundleId(), extensionPoint.getId()));
return null;
}
} catch (Throwable t) {
EGFPlatformPlugin.getDefault().logError("PlatformBundle.createPlatformExtensionPoint(..)", t); //$NON-NLS-1$
return null;
}
return clazz.cast(extensionPoint);
}
protected void addPlatformExtensionPoint(Class<? extends IPlatformExtensionPoint> clazz, IPlatformExtensionPoint extensionPoint) {
if (extensionPoint == null) {
return;
}
Map<String, Object> extensionPoints = _extensions.get(clazz);
if (extensionPoints == null) {
extensionPoints = new HashMap<String, Object>();
_extensions.put(clazz, extensionPoints);
}
try {
if (extensionPoints.get(extensionPoint.getId()) != null) {
EGFPlatformPlugin.getDefault().logWarning(NLS.bind("PlatformBundle.addPlatformExtensionPoint(..) _ Bundle ''{0}'' already contains Extension Point ''{1}''.", //$NON-NLS-1$
getBundleId(), extensionPoint.getId()));
}
if (extensionPoints.put(extensionPoint.getId(), extensionPoint) != null) {
EGFPlatformPlugin.getDefault().logError(NLS.bind("PlatformBundle.addPlatformExtensionPoint(..) _ Bundle ''{0}'' unable to add Extension Point ''{1}''.", //$NON-NLS-1$
getBundleId(), extensionPoint.getId()));
}
((AbstractPlatformExtensionPoint) extensionPoint).setPlatformBundle(this);
} catch (Throwable t) {
EGFPlatformPlugin.getDefault().logError("PlatformBundle.addPlatformExtensionPoint(..)", t); //$NON-NLS-1$
}
}
public IPlatformExtensionPoint[] getPlatformExtensionPoints() {
List<Object> extensionPoints = new ArrayList<Object>();
for (Map<String, Object> extensionPoint : _extensions.values()) {
extensionPoints.addAll(extensionPoint.values());
}
return extensionPoints.toArray(new IPlatformExtensionPoint[extensionPoints.size()]);
}
public <T extends IPlatformExtensionPoint> T[] getPlatformExtensionPoints(Class<T> clazz) {
List<Object> extensionPoints = new ArrayList<Object>();
if (clazz != null && EGFPlatformPlugin.getPlatformExtensionPoints().values().contains(clazz)) {
Map<String, Object> extensions = _extensions.get(clazz);
if (extensions != null) {
extensionPoints.addAll(extensions.values());
}
}
return CollectionHelper.toArray(extensionPoints, clazz);
}
protected boolean removePlatformExtensionPoint(Class<? extends IPlatformExtensionPoint> clazz, IPlatformExtensionPoint extensionPoint) {
if (clazz == null || EGFPlatformPlugin.getPlatformExtensionPoints().values().contains(clazz) == false || extensionPoint == null) {
return false;
}
if (_extensions.get(clazz) != null && _extensions.get(clazz).remove(extensionPoint.getId()) != null) {
((AbstractPlatformExtensionPoint) extensionPoint).dispose();
return true;
}
return false;
}
public boolean isEmpty() {
for (Class<? extends IPlatformExtensionPoint> clazz : EGFPlatformPlugin.getPlatformExtensionPoints().values()) {
if (_extensions.get(clazz) != null && _extensions.get(clazz).size() > 0) {
return false;
}
}
return true;
}
public boolean hasPlatformExtensionPoint(IPlatformExtensionPoint extensionPoint) {
if (extensionPoint == null) {
return false;
}
for (Class<? extends IPlatformExtensionPoint> clazz : EGFPlatformPlugin.getPlatformExtensionPoints().values()) {
if (hasPlatformExtensionPoint(clazz, extensionPoint)) {
return true;
}
}
return false;
}
public boolean hasPlatformExtensionPoint(Class<? extends IPlatformExtensionPoint> clazz, IPlatformExtensionPoint extensionPoint) {
if (clazz == null || EGFPlatformPlugin.getPlatformExtensionPoints().values().contains(clazz) == false || extensionPoint == null) {
return false;
}
if (_extensions.get(clazz) != null && _extensions.get(clazz).get(extensionPoint.getId()) != null) {
return true;
}
return false;
}
public String getInstallLocation() {
if (isRuntime()) {
try {
return FileLocator.getBundleFile(getBundle()).getAbsolutePath();
} catch (IOException ioe) {
return null;
}
}
return getPluginModelBase().getInstallLocation();
}
public URI getUnrootedBase() {
return URI.createURI("platform:/plugin/" + getBundleId()); //$NON-NLS-1$
}
public URI getRootedBase() {
return URI.createURI("platform:/plugin/" + getBundleId() + "/"); //$NON-NLS-1$ //$NON-NLS-2$
}
@Override
public String toString() {
String id = getBundleId();
String previousId = getPreviousBundleId();
StringBuilder text = new StringBuilder();
text.append(id);
if (id.equals(previousId) == false) {
text.append(" PreviousId: ").append(previousId); //$NON-NLS-1$
}
if (getPluginModelBase() != null) {
IPluginBase pluginBase = getPluginModelBase().getPluginBase();
if (pluginBase.getModel() != null && pluginBase.getModel().isInSync() == false) {
text.append(" ").append(CorePlatformMessages.PlatformManager_outOfSync); //$NON-NLS-1$
}
}
if (isTarget()) {
text.append(" [Target]"); //$NON-NLS-1$
} else if (isWorkspace()) {
text.append(" [Workspace]"); //$NON-NLS-1$
} else {
text.append(" [Runtime]"); //$NON-NLS-1$
}
if (getInstallLocation() != null) {
text.append(" [").append(getInstallLocation()).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
}
return text.toString();
}
}