package org.eclipse.core.internal.registry;
import java.util.*;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
public class CombinedEventDelta {
final private boolean addition;
private IObjectManager objectManager;
final static private int arrayGrowthSpace = 5;
private Map<String, List<Integer>> extensionsByID;
private Map<String, List<Integer>> extPointsByID;
private List<Integer> allExtensions;
private List<Integer> allExtensionPoints;
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<Integer> getExtensionsBucket(String id) {
if (extensionsByID == null) {
extensionsByID = new HashMap<>();
}
List<Integer> extensions = extensionsByID.get(id);
if (extensions == null) {
extensions = new ArrayList<>(arrayGrowthSpace);
extensionsByID.put(id, extensions);
}
return extensions;
}
private List<Integer> getExtPointsBucket(String id) {
if (extPointsByID == null) {
extPointsByID = new HashMap<>();
}
List<Integer> extensionPoints = extPointsByID.get(id);
if (extensionPoints == null) {
extensionPoints = new ArrayList<>(arrayGrowthSpace);
extPointsByID.put(id, extensionPoints);
}
return extensionPoints;
}
private List<Integer> getExtPointsGlobal() {
if (allExtensionPoints == null) {
allExtensionPoints = new ArrayList<>();
}
return allExtensionPoints;
}
private List<Integer> getExtensionsGlobal() {
if (allExtensions == null) {
allExtensions = new ArrayList<>();
}
return allExtensions;
}
public void rememberExtensionPoint(ExtensionPoint extensionPoint) {
String bucketId = extensionPoint.getUniqueIdentifier();
Integer extPt = Integer.valueOf(extensionPoint.getObjectId());
getExtPointsBucket(bucketId).add(extPt);
getExtPointsGlobal().add(extPt);
}
public void rememberExtension(ExtensionPoint extensionPoint, int ext) {
String bucketId = extensionPoint.getUniqueIdentifier();
Integer extension = Integer.valueOf(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<Integer> extensionPoints = null;
if (id != null && extPointsByID != null)
extensionPoints = extPointsByID.get(id);
else if (id == null)
extensionPoints = allExtensionPoints;
if (extensionPoints == null)
return null;
int size = extensionPoints.size();
ArrayList<IExtensionPoint> result = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
Integer extPt = extensionPoints.get(i);
IExtensionPoint extensionPoint = new ExtensionPointHandle(objectManager, extPt.intValue());
result.add(extensionPoint);
}
if (result.size() == 0)
return null;
return result.toArray(new IExtensionPoint[result.size()]);
}
public IExtension[] getExtensions(String id) {
List<Integer> extensions = null;
if (id != null && extensionsByID != null) {
extensions = extensionsByID.get(id);
} else if (id == null) {
extensions = allExtensions;
}
if (extensions == null)
return null;
int size = extensions.size();
ArrayList<IExtension> result = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
Integer ext = extensions.get(i);
IExtension extension = new ExtensionHandle(objectManager, ext.intValue());
result.add(extension);
}
return result.toArray(new IExtension[result.size()]);
}
}