blob: f9f066b20d4f1ddb14a0c9e1b6d47d9f54aae555 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 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
*******************************************************************************/
package org.eclipse.osgi.internal.module;
import java.util.*;
/*
* A MappedList maps values into keyed list arrays. All values with the same key are stored
* into the same array. Extending classes may override the sort method to sort the individual
* arrays in the MappedList. By default the MappedList appends new values to the end of the array.
*/
public class MappedList {
// the mapping with key -> Object[] mapping
protected HashMap internal = new HashMap();
public void put(Object key, Object value) {
Object existing = internal.get(key);
if (existing == null) {
internal.put(key, value);
} else {
Object[] existingValues = existing.getClass().isArray() ? (Object[]) existing : new Object[] {existing};
// insert the new value
int index = insertionIndex(existingValues, value);
Object[] newValues = new Object[existingValues.length + 1];
System.arraycopy(existingValues, 0, newValues, 0, index);
newValues[index] = value;
System.arraycopy(existingValues, index, newValues, index + 1, existingValues.length - index);
internal.put(key, newValues); // overwrite the old values in the map
}
}
protected int insertionIndex(Object[] existing, Object value) {
// a MappedList is by default not sorted so just insert at the end
// extending classes may override this method to provide an index that retains sorted order
return existing.length;
}
// removes all values with the specified key
public Object[] remove(Object key) {
return get(key, true);
}
// gets all values with the specified key
public Object[] get(Object key) {
return get(key, false);
}
// gets all values with the specified and optionally removes them
private Object[] get(Object key, boolean remove) {
Object result = remove ? internal.remove(key) : internal.get(key);
if (result != null && result.getClass().isArray())
return (Object[]) result;
return result == null ? new Object[0] : new Object[] {result};
}
// returns the number of keyed lists
public int getSize() {
return internal.size();
}
// returns all values of all keys
public Object[] getAllValues() {
if (getSize() == 0)
return new Object[0];
ArrayList results = new ArrayList(getSize());
Iterator iter = internal.values().iterator();
while (iter.hasNext()) {
Object value = iter.next();
if (value.getClass().isArray()) {
Object[] values = (Object[]) value;
for (int i = 0; i < values.length; i++)
results.add(values[i]);
} else
results.add(value);
}
return results.toArray();
}
// removes all keys from the map
public void clear() {
internal.clear();
}
}