blob: a965922bb7a9929a3613291a0407704497873031 [file] [log] [blame]
package org.eclipse.pde.internal.core;
import java.util.*;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.pde.core.IModel;
import org.eclipse.pde.core.plugin.*;
public class PluginModelManager implements IAdaptable {
private IModelProviderListener providerListener;
private ExternalModelManager externalManager;
private WorkspaceModelManager workspaceManager;
private ArrayList listeners;
private Hashtable entries;
public PluginModelManager() {
providerListener = new IModelProviderListener() {
public void modelsChanged(IModelProviderEvent e) {
if (entries!=null)
handleModelsChanged(e);
}
};
listeners = new ArrayList();
}
public Object getAdapter(Class key) {
return null;
}
public void addPluginModelListener(IPluginModelListener listener) {
if (!listeners.contains(listener))
listeners.add(listener);
}
public void removePluginModelListener(IPluginModelListener listener) {
if (listeners.contains(listener))
listeners.remove(listener);
}
public boolean isEmpty() {
if (entries == null)
initializeTable();
return entries.isEmpty();
}
public ModelEntry[] getEntries() {
if (entries == null)
initializeTable();
Collection values = entries.values();
return (ModelEntry[]) values.toArray(new ModelEntry[values.size()]);
}
public IPluginModelBase [] getPlugins() {
if (entries == null)
initializeTable();
Collection values = entries.values();
IPluginModelBase [] plugins = new IPluginModelBase[values.size()];
int i=0;
for (Iterator iter=values.iterator(); iter.hasNext();) {
ModelEntry entry = (ModelEntry)iter.next();
plugins[i++] = entry.getActiveModel();
}
return plugins;
}
public IPluginModelBase findPlugin(String id, String version, int match) {
if (entries == null) initializeTable();
ModelEntry entry = (ModelEntry)entries.get(id);
if (entry==null) return null;
return entry.getActiveModel();
}
private void handleModelsChanged(IModelProviderEvent e) {
PluginModelDelta delta = new PluginModelDelta();
if ((e.getEventTypes() & IModelProviderEvent.MODELS_REMOVED) != 0) {
IModel[] removed = e.getRemovedModels();
for (int i = 0; i < removed.length; i++) {
if (!(removed[i] instanceof IPluginModelBase)) continue;
IPluginModelBase model = (IPluginModelBase) removed[i];
IPluginBase plugin = model.getPluginBase();
updateTable(plugin.getId(), model, false, delta);
}
}
if ((e.getEventTypes() & IModelProviderEvent.MODELS_ADDED) != 0) {
IModel[] added = e.getAddedModels();
for (int i = 0; i < added.length; i++) {
if (!(added[i] instanceof IPluginModelBase)) continue;
IPluginModelBase model = (IPluginModelBase) added[i];
IPluginBase plugin = model.getPluginBase();
updateTable(plugin.getId(), model, true, delta);
}
}
if ((e.getEventTypes() & IModelProviderEvent.MODELS_CHANGED) != 0) {
IModel[] changed = e.getChangedModels();
for (int i = 0; i < changed.length; i++) {
if (!(changed[i] instanceof IPluginModelBase)) continue;
IPluginModelBase model = (IPluginModelBase) changed[i];
IPluginBase plugin = model.getPluginBase();
ModelEntry entry = (ModelEntry)entries.get(plugin.getId());
delta.addEntry(entry, PluginModelDelta.CHANGED);
}
}
fireDelta(delta);
}
private void updateTable(
String id,
IPluginModelBase model,
boolean added,
PluginModelDelta delta) {
boolean workspace = model.getUnderlyingResource()!=null;
ModelEntry entry = (ModelEntry) entries.get(id);
int kind = 0;
if (added && entry == null) {
entry = new ModelEntry(id);
entries.put(id, entry);
kind = PluginModelDelta.ADDED;
}
if (added) {
if (workspace)
entry.setWorkspaceModel(model);
else
entry.setExternalModel(model);
} else if (entry != null) {
if (workspace) entry.setWorkspaceModel(null);
else
entry.setExternalModel(null);
if (entry.isEmpty()) {
entries.remove(id);
kind = PluginModelDelta.REMOVED;
}
}
if (kind==0) kind = PluginModelDelta.CHANGED;
delta.addEntry(entry, kind);
}
private void initializeTable() {
entries = new Hashtable();
IPluginModel[] models = workspaceManager.getWorkspacePluginModels();
IFragmentModel[] fmodels = workspaceManager.getWorkspaceFragmentModels();
addToTable(models, fmodels, true);
models = externalManager.getModels();
fmodels = externalManager.getFragmentModels(null);
addToTable(models, fmodels, false);
}
private void addToTable(
IPluginModel[] pmodels,
IFragmentModel[] fmodels,
boolean workspace) {
for (int i = 0; i < pmodels.length; i++) {
addToTable(pmodels[i], workspace);
}
for (int i = 0; i < fmodels.length; i++) {
addToTable(fmodels[i], workspace);
}
}
private void addToTable(IPluginModelBase model, boolean workspace) {
String id = model.getPluginBase().getId();
ModelEntry entry = (ModelEntry) entries.get(id);
if (entry == null) {
entry = new ModelEntry(id);
entries.put(id, entry);
}
if (workspace)
entry.setWorkspaceModel(model);
else
entry.setExternalModel(model);
}
private void fireDelta(PluginModelDelta delta) {
Object [] entries = listeners.toArray();
for (int i=0; i<entries.length; i++) {
((IPluginModelListener)entries[i]).modelsChanged(delta);
}
}
public void connect(WorkspaceModelManager wm, ExternalModelManager em) {
externalManager = em;
workspaceManager = wm;
externalManager.addModelProviderListener(providerListener);
workspaceManager.addModelProviderListener(providerListener);
}
public void shutdown() {
workspaceManager.removeModelProviderListener(providerListener);
externalManager.removeModelProviderListener(providerListener);
}
}