blob: a4ea4a3a471366bd901763d4c180c6323664fed9 [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.core.internal.registry;
import java.util.*;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
/**
* The class stores extensions and extensions points that have been actually
* modified by a registry operation.
*
* For performance, modified extensions and extension points are stored in two forms:
* - organized in buckets by IDs of extension points (for listeners on specific ext.point)
* - aggregated in one list (for global listeners)
*/
public class CombinedEventDelta {
final private boolean addition; // true: objects were added; false: objects were removed
// the object manager from which all the objects contained in this delta will be found
private IObjectManager objectManager;
// an empty array trail used to reduce re-allocations
final static private int arrayGrowthSpace = 5;
private Map extensionsByID = null; // extension point ID -> List of Integer extensions IDs
private Map extPointsByID = null; // extension point ID -> List of Integer extension point IDs
private ArrayList allExtensions = null; // List of Integer IDs
private ArrayList allExtensionPoints = null; // List if Integer IDs
private CombinedEventDelta(boolean addition) {
this.addition = addition;
}
static public CombinedEventDelta recordAddition() {
return new CombinedEventDelta(true);
}
static public CombinedEventDelta recordRemoval() {
return new CombinedEventDelta(false);
}
public boolean isAddition() {
return addition;
}
public boolean isRemoval() {
return !addition;
}
public void setObjectManager(IObjectManager manager) {
objectManager = manager;
}
public IObjectManager getObjectManager() {
return objectManager;
}
private List getExtensionsBucket(String id) {
if (extensionsByID == null)
extensionsByID = new HashMap();
List extensions = (List) extensionsByID.get(id);
if (extensions == null) {
extensions = new ArrayList(arrayGrowthSpace);
extensionsByID.put(id, extensions);
}
return extensions;
}
private List getExtPointsBucket(String id) {
if (extPointsByID == null)
extPointsByID = new HashMap();
List extensionPoints = (List) extPointsByID.get(id);
if (extensionPoints == null) {
extensionPoints = new ArrayList(arrayGrowthSpace);
extPointsByID.put(id, extensionPoints);
}
return extensionPoints;
}
private List getExtPointsGlobal() {
if (allExtensionPoints == null)
allExtensionPoints = new ArrayList();
return allExtensionPoints;
}
private List getExtensionsGlobal() {
if (allExtensions == null)
allExtensions = new ArrayList();
return allExtensions;
}
public void rememberExtensionPoint(ExtensionPoint extensionPoint) {
String bucketId = extensionPoint.getUniqueIdentifier();
Object extPt = new Integer(extensionPoint.getObjectId());
getExtPointsBucket(bucketId).add(extPt);
getExtPointsGlobal().add(extPt);
}
public void rememberExtension(ExtensionPoint extensionPoint, int ext) {
String bucketId = extensionPoint.getUniqueIdentifier();
Object extension = new Integer(ext);
getExtensionsBucket(bucketId).add(extension);
getExtensionsGlobal().add(extension);
}
public void rememberExtensions(ExtensionPoint extensionPoint, int[] exts) {
if (exts == null)
return;
if (exts.length == 0)
return;
for (int i = 0; i < exts.length; i++)
rememberExtension(extensionPoint, exts[i]);
}
public IExtensionPoint[] getExtensionPoints(String id) {
List extensionPoints = null;
if (id != null && extPointsByID != null)
extensionPoints = (List) extPointsByID.get(id);
else if (id == null)
extensionPoints = allExtensionPoints;
if (extensionPoints == null) // no changes that fit the filter
return null;
int size = extensionPoints.size();
ArrayList result = new ArrayList(size);
for (int i = 0; i < size; i++) {
Integer extPt = (Integer) extensionPoints.get(i);
IExtensionPoint extensionPoint = new ExtensionPointHandle(objectManager, extPt.intValue());
result.add(extensionPoint);
}
if (result.size() == 0)
return null;
return (IExtensionPoint[]) result.toArray(new IExtensionPoint[result.size()]);
}
public IExtension[] getExtensions(String id) {
List extensions = null;
if (id != null && extensionsByID != null)
extensions = (List) extensionsByID.get(id);
else if (id == null)
extensions = allExtensions;
if (extensions == null) // no changes that fit the filter
return null;
int size = extensions.size();
ArrayList result = new ArrayList(size);
for (int i = 0; i < size; i++) {
Integer ext = (Integer) extensions.get(i);
IExtension extension = new ExtensionHandle(objectManager, ext.intValue());
result.add(extension);
}
return (IExtension[]) result.toArray(new IExtension[result.size()]);
}
}