blob: e74150cf8576e0282c52cba373e357bfaa49a2a0 [file] [log] [blame]
package aQute.lib.osgi;
import java.util.*;
import aQute.libg.header.*;
public class Instructions implements Map<Instruction, Attrs> {
private LinkedHashMap<Instruction, Attrs> map;
static Map<Instruction, Attrs> EMPTY = Collections.emptyMap();
public Instructions(Instructions other) {
if (other.map != null && !other.map.isEmpty()) {
map = new LinkedHashMap<Instruction, Attrs>(other.map);
}
}
public Instructions(Collection<String> other) {
if ( other != null)
for ( String s : other ) {
put( new Instruction(s), null);
}
}
public Instructions() {
}
public Instructions(Parameters contained) {
append(contained);
}
public Instructions(String h) {
this(new Parameters(h));
}
public void clear() {
map.clear();
}
public boolean containsKey(Instruction name) {
if (map == null)
return false;
return map.containsKey(name);
}
@Deprecated public boolean containsKey(Object name) {
assert name instanceof Instruction;
if (map == null)
return false;
return map.containsKey((Instruction) name);
}
public boolean containsValue(Attrs value) {
if (map == null)
return false;
return map.containsValue(value);
}
@Deprecated public boolean containsValue(Object value) {
assert value instanceof Attrs;
if (map == null)
return false;
return map.containsValue((Attrs) value);
}
public Set<java.util.Map.Entry<Instruction, Attrs>> entrySet() {
if (map == null)
return EMPTY.entrySet();
return map.entrySet();
}
@Deprecated public Attrs get(Object key) {
assert key instanceof Instruction;
if (map == null)
return null;
return map.get((Instruction) key);
}
public Attrs get(Instruction key) {
if (map == null)
return null;
return map.get(key);
}
public boolean isEmpty() {
return map == null || map.isEmpty();
}
public Set<Instruction> keySet() {
if (map == null)
return EMPTY.keySet();
return map.keySet();
}
public Attrs put(Instruction key, Attrs value) {
if (map == null)
map = new LinkedHashMap<Instruction, Attrs>();
return map.put(key, value);
}
public void putAll(Map<? extends Instruction, ? extends Attrs> map) {
if (this.map == null)
if (map.isEmpty())
return;
else
this.map = new LinkedHashMap<Instruction, Attrs>();
this.map.putAll(map);
}
@Deprecated public Attrs remove(Object var0) {
assert var0 instanceof Instruction;
if (map == null)
return null;
return map.remove((Instruction) var0);
}
public Attrs remove(Instruction var0) {
if (map == null)
return null;
return map.remove(var0);
}
public int size() {
if (map == null)
return 0;
return map.size();
}
public Collection<Attrs> values() {
if (map == null)
return EMPTY.values();
return map.values();
}
public String toString() {
return map == null ? "{}" : map.toString();
}
public void append(Parameters other) {
for (Map.Entry<String, Attrs> e : other.entrySet()) {
put( new Instruction(e.getKey()), e.getValue());
}
}
public <T> Collection<T> select(Collection<T> set, boolean emptyIsAll) {
return select(set,null, emptyIsAll);
}
public <T> Collection<T> select(Collection<T> set, Set<Instruction> unused, boolean emptyIsAll) {
List<T> input = new ArrayList<T>(set);
if ( emptyIsAll && isEmpty())
return input;
List<T> result = new ArrayList<T>();
for (Instruction instruction : keySet()) {
boolean used = false;
for (Iterator<T> o = input.iterator(); o.hasNext();) {
T oo = o.next();
String s = oo.toString();
if (instruction.matches(s)) {
if (!instruction.isNegated())
result.add(oo);
o.remove();
used = true;
}
}
if ( !used && unused != null)
unused.add(instruction);
}
return result;
}
public <T> Collection<T> reject(Collection<T> set) {
List<T> input = new ArrayList<T>(set);
List<T> result = new ArrayList<T>();
for (Instruction instruction : keySet()) {
for (Iterator<T> o = input.iterator(); o.hasNext();) {
T oo = o.next();
String s = oo.toString();
if (instruction.matches(s)) {
if (instruction.isNegated())
result.add(oo);
o.remove();
} else
result.add(oo);
}
}
return result;
}
public boolean matches(String value) {
if ( size() == 0)
return true;
for ( Instruction i : keySet()) {
if ( i.matches(value)) {
if ( i.isNegated())
return false; // we deny this one explicitly
else
return true; // we allow it explicitly
}
}
return false;
}
}