Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/IUMap.java')
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/IUMap.java227
1 files changed, 0 insertions, 227 deletions
diff --git a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/IUMap.java b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/IUMap.java
deleted file mode 100644
index 99d7b7531..000000000
--- a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/IUMap.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 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
- * Cloudsmith Inc. - rewrite for smaller memory footprint
- *******************************************************************************/
-package org.eclipse.equinox.internal.p2.metadata;
-
-import java.util.*;
-import org.eclipse.equinox.internal.p2.core.helpers.CollectionUtils;
-import org.eclipse.equinox.p2.metadata.IInstallableUnit;
-import org.eclipse.equinox.p2.metadata.Version;
-import org.eclipse.equinox.p2.query.*;
-
-/**
- * A map that stores {@link IInstallableUnit} instances in a way that is efficient to query
- */
-public class IUMap implements Cloneable {
- /**
- * Iterator over all the {@link IInstallableUnit} instances in the map.
- */
- public class MapIterator implements Iterator<IInstallableUnit> {
- //iterator over the keys in UIMap
- private final Iterator<Object> unitIterator;
- private IInstallableUnit[] currentBucket;
- private int bucketIndex = 0;
- private IInstallableUnit nextElement = null;
-
- MapIterator() {
- super();
- unitIterator = units.values().iterator();
- }
-
- public boolean hasNext() {
- return positionNext();
- }
-
- public IInstallableUnit next() {
- if (!positionNext())
- throw new NoSuchElementException();
-
- IInstallableUnit nxt = nextElement;
- nextElement = null;
- return nxt;
- }
-
- public void remove() {
- throw new UnsupportedOperationException();
- }
-
- private boolean positionNext() {
- if (nextElement != null)
- return true;
-
- if (currentBucket != null) {
- nextElement = currentBucket[bucketIndex];
- if (++bucketIndex == currentBucket.length) {
- currentBucket = null;
- bucketIndex = -1;
- }
- return true;
- }
-
- if (!unitIterator.hasNext())
- return false;
-
- Object val = unitIterator.next();
- if (val instanceof IInstallableUnit)
- nextElement = (IInstallableUnit) val;
- else {
- currentBucket = (IInstallableUnit[]) val;
- nextElement = currentBucket[0];
- bucketIndex = 1;
- }
- return true;
- }
- }
-
- /**
- * Map<String,Object> mapping IU id to either arrays of iu's or a single iu with that id.
- */
- final Map<String, Object> units = new HashMap<String, Object>();
-
- public IUMap() {
- //
- }
-
- private IUMap(IUMap cloneSource) {
- units.putAll(cloneSource.units);
- }
-
- public void add(IInstallableUnit unit) {
- String key = unit.getId();
- Object matching = units.get(key);
- if (matching == null) {
- units.put(key, unit);
- return;
- }
-
- // We already had something at this key position. It must be
- // preserved.
- if (matching.getClass().isArray()) {
- // Entry is an array. Add unique
- IInstallableUnit[] iuArr = (IInstallableUnit[]) matching;
- int idx = iuArr.length;
- while (--idx >= 0)
- if (iuArr[idx].equals(unit))
- // This unit has already been added
- return;
-
- IInstallableUnit[] iuArrPlus = new IInstallableUnit[iuArr.length + 1];
- System.arraycopy(iuArr, 0, iuArrPlus, 0, iuArr.length);
- iuArrPlus[iuArr.length] = unit;
- units.put(unit.getId(), iuArrPlus);
- } else {
- IInstallableUnit old = (IInstallableUnit) matching;
- if (!old.equals(unit))
- units.put(key, new IInstallableUnit[] {old, unit});
- }
- }
-
- public void addAll(IInstallableUnit[] toAdd) {
- for (int i = 0; i < toAdd.length; i++)
- add(toAdd[i]);
- }
-
- public void addAll(Collection<IInstallableUnit> toAdd) {
- for (IInstallableUnit unit : toAdd) {
- add(unit);
- }
- }
-
- public void clear() {
- units.clear();
- }
-
- @Override
- public IUMap clone() {
- return new IUMap(this);
- }
-
- public Iterator<IInstallableUnit> iterator() {
- return new MapIterator();
- }
-
- public boolean contains(IInstallableUnit unit) {
- return !internalGet(unit.getId(), unit.getVersion()).isEmpty();
- }
-
- /**
- * Returns a collection of units that has the given <code>id</code>.
- * @param id The id of the desired units. Must not be <code>null</code>.
- * @return The units corresponding to the given <code>id</code>.
- */
- public Collection<IInstallableUnit> getUnits(String id) {
- Object bucket = units.get(id);
- if (bucket == null)
- return CollectionUtils.emptyList();
- return bucket.getClass().isArray() ? CollectionUtils.unmodifiableList((IInstallableUnit[]) bucket) : Collections.<IInstallableUnit> singletonList((IInstallableUnit) bucket);
- }
-
- public IQueryResult<IInstallableUnit> get(String id) {
- return internalGet(id, null);
- }
-
- private IQueryResult<IInstallableUnit> internalGet(String id, Version version) {
- if (id == null) {
- IQuery<IInstallableUnit> query = version == null ? QueryUtil.createIUAnyQuery() : QueryUtil.createIUQuery(null, version);
- return query.perform(iterator());
- }
-
- Collection<IInstallableUnit> idUnits = getUnits(id);
- if (idUnits.isEmpty())
- return Collector.emptyCollector();
- return version == null ? new CollectionResult<IInstallableUnit>(idUnits) : QueryUtil.createIUQuery(id, version).perform(idUnits.iterator());
- }
-
- public IInstallableUnit get(String id, Version version) {
- IQueryResult<IInstallableUnit> result = internalGet(id, version);
- return result.isEmpty() ? null : result.iterator().next();
- }
-
- public void remove(IInstallableUnit unit) {
- String key = unit.getId();
- Object matching = units.get(key);
- if (matching == null)
- return;
-
- if (matching instanceof IInstallableUnit) {
- if (matching.equals(unit))
- units.remove(key);
- return;
- }
-
- IInstallableUnit[] array = (IInstallableUnit[]) matching;
- int idx = array.length;
- while (--idx >= 0) {
- if (unit.equals(array[idx])) {
- if (array.length == 2) {
- // We no longer need this array. Replace it with the
- // entry that we keep.
- units.put(key, idx == 0 ? array[1] : array[0]);
- break;
- }
-
- // Shrink the array
- IInstallableUnit[] newArray = new IInstallableUnit[array.length - 1];
- if (idx > 0)
- System.arraycopy(array, 0, newArray, 0, idx);
- if (idx + 1 < array.length)
- System.arraycopy(array, idx + 1, newArray, idx, array.length - (idx + 1));
- units.put(key, newArray);
- break;
- }
- }
- }
-
- public void removeAll(Collection<IInstallableUnit> toRemove) {
- for (IInstallableUnit iu : toRemove)
- remove(iu);
- }
-}

Back to the top