blob: 89d233389a0ecc11a4e1dc7f7e86bafa03f60ac8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.core.plugin;
import java.util.ArrayList;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.osgi.service.resolver.BundleDescription;
/**
* A ModelEntry object has an ID and keeps track of all workspace plug-ins and target
* plug-ins that have that ID.
* <p>
* This class is not meant to be extended or instantiated by clients.
* </p>
*
* @since 3.3
*/
public class ModelEntry extends PlatformObject {
private String fId;
protected ArrayList fWorkspaceEntries = new ArrayList(1);
protected ArrayList fExternalEntries = new ArrayList(1);
/**
* Constructor
*
* @param id the entry ID
*/
public ModelEntry(String id) {
fId = id;
}
/**
* Returns all the workspace plug-ins that have the model entry ID
*
* @return an array of workspace plug-ins that have the model entry ID
*/
public IPluginModelBase[] getWorkspaceModels() {
return (IPluginModelBase[])fWorkspaceEntries.toArray(new IPluginModelBase[fWorkspaceEntries.size()]);
}
/**
* Returns all plug-ins in the target platform that have the model entry ID.
* The returned result contains both plug-ins that are enabled (ie. checked on the
* <b>Plug-in Development > Target Platform</b> preference page) and disabled.
*
* @return an array of plug-ins in the target platform that have the model entry ID
*/
public IPluginModelBase[] getExternalModels() {
return (IPluginModelBase[])fExternalEntries.toArray(new IPluginModelBase[fExternalEntries.size()]);
}
/**
* Returns the plug-in model for the best match plug-in with the given ID.
* A null value is returned if no such bundle is found in the workspace or target platform.
* <p>
* A workspace plug-in is always preferably returned over a target plug-in.
* A plug-in that is checked/enabled on the Target Platform preference page is always
* preferably returned over a target plug-in that is unchecked/disabled.
* </p>
* <p>
* In the case of a tie among workspace plug-ins or among target plug-ins,
* the plug-in with the highest version is returned.
* </p>
* <p>
* In the case of a tie among more than one suitable plug-in that have the same version,
* one of those plug-ins is randomly returned.
* </p>
*
* @return the plug-in model for the best match plug-in with the given ID
*/
public IPluginModelBase getModel() {
IPluginModelBase model = getBestCandidate(getWorkspaceModels());
if (model == null)
model = getBestCandidate(getExternalModels());
return model;
}
private IPluginModelBase getBestCandidate(IPluginModelBase[] models) {
IPluginModelBase model = null;
for (int i = 0; i < models.length; i++) {
if (models[i].getBundleDescription() == null)
continue;
if (model == null) {
model = models[i];
continue;
}
if (!model.isEnabled() && models[i].isEnabled()) {
model = models[i];
continue;
}
BundleDescription current = model.getBundleDescription();
BundleDescription candidate = models[i].getBundleDescription();
if (!current.isResolved() && candidate.isResolved()) {
model = models[i];
continue;
}
if (current.getVersion().compareTo(candidate.getVersion()) < 0) {
model = models[i];
}
}
return model;
}
/**
* Returns all the plug-ins, with the model entry ID, that are currently active.
* <p>
* Workspace plug-ins are always active.
* Target plug-ins are only active if:
* <ul>
* <li>they are checked on the <b>Plug-in Development > Target Platform</b> preference page</li>
* <li>there does not exist a workspace plug-in that has the same ID</li>
* </ul>
* </p>
*
* @return an array of the currently active plug-ins with the model entry ID
*/
public IPluginModelBase[] getActiveModels() {
if (fWorkspaceEntries.size() > 0)
return getWorkspaceModels();
if (fExternalEntries.size() > 0) {
ArrayList list = new ArrayList(fExternalEntries.size());
for (int i = 0; i < fExternalEntries.size(); i++) {
IPluginModelBase model = (IPluginModelBase)fExternalEntries.get(i);
if (model.isEnabled())
list.add(model);
}
return (IPluginModelBase[])list.toArray(new IPluginModelBase[list.size()]);
}
return new IPluginModelBase[0];
}
/**
* Returns the model entry ID
*
* @return the model entry ID
*/
public String getId() {
return fId;
}
/**
* Return the plug-in model associated with the given bundle description or
* <code>null</code> if none is found.
*
* @param desc the given bundle description
*
* @return the plug-in model associated with the given bundle description if such a
* model exists.
*/
public IPluginModelBase getModel(BundleDescription desc) {
if (desc == null)
return null;
long bundleId = desc.getBundleId();
for (int i = 0; i < fWorkspaceEntries.size(); i++) {
IPluginModelBase model = (IPluginModelBase)fWorkspaceEntries.get(i);
BundleDescription bundle = model.getBundleDescription();
if (bundle != null && bundle.getBundleId() == bundleId)
return model;
}
for (int i = 0; i < fExternalEntries.size(); i++) {
IPluginModelBase model = (IPluginModelBase)fExternalEntries.get(i);
BundleDescription bundle = model.getBundleDescription();
if (bundle != null && bundle.getBundleId() == bundleId)
return model;
}
return null;
}
/**
* Returns <code>true</code> if there are workspace plug-ins associated with the ID
* of this model entry; <code>false</code>otherwise.
*
* @return <code>true</code> if there are workspace plug-ins associated with the ID
* of this model entry; <code>false</code>otherwise.
*/
public boolean hasWorkspaceModels() {
return !fWorkspaceEntries.isEmpty();
}
/**
* Returns <code>true</code> if there are target plug-ins associated with the ID
* of this model entry; <code>false</code>otherwise.
*
* @return <code>true</code> if there are target plug-ins associated with the ID
* of this model entry; <code>false</code>otherwise.
*/
public boolean hasExternalModels() {
return !fExternalEntries.isEmpty();
}
}