Temporarily include bndlib 1.47 for testing purposes (not yet on central)
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1185095 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/bundleplugin/src/main/java/aQute/lib/collections/LineCollection.java b/bundleplugin/src/main/java/aQute/lib/collections/LineCollection.java
new file mode 100644
index 0000000..36bfa39
--- /dev/null
+++ b/bundleplugin/src/main/java/aQute/lib/collections/LineCollection.java
@@ -0,0 +1,54 @@
+package aQute.lib.collections;
+
+import java.io.*;
+import java.util.*;
+
+public class LineCollection implements Iterator<String>, Closeable {
+ final BufferedReader reader;
+ String next;
+
+ public LineCollection(InputStream in) throws IOException {
+ this(new InputStreamReader(in, "UTF8"));
+ }
+
+ public LineCollection(File in) throws IOException {
+ this(new FileReader(in));
+ }
+
+ public LineCollection(Reader reader) throws IOException {
+ this(new BufferedReader(reader));
+ }
+
+ public LineCollection(BufferedReader reader) throws IOException {
+ this.reader = reader;
+ next = reader.readLine();
+ }
+
+ public boolean hasNext() {
+ return next != null;
+ }
+
+ public String next() {
+ if (next == null)
+ throw new IllegalStateException("Iterator has finished");
+ try {
+ String result = next;
+ next = reader.readLine();
+ if (next == null)
+ reader.close();
+ return result;
+ } catch (Exception e) {
+ // ignore
+ return null;
+ }
+ }
+
+ public void remove() {
+ if (next == null)
+ throw new UnsupportedOperationException("Cannot remove");
+ }
+
+ public void close() throws IOException {
+ reader.close();
+ }
+}
diff --git a/bundleplugin/src/main/java/aQute/lib/collections/Logic.java b/bundleplugin/src/main/java/aQute/lib/collections/Logic.java
new file mode 100644
index 0000000..75322dd
--- /dev/null
+++ b/bundleplugin/src/main/java/aQute/lib/collections/Logic.java
@@ -0,0 +1,22 @@
+package aQute.lib.collections;
+
+import java.util.*;
+
+public class Logic {
+
+ public static <T> Collection<T> retain( Collection<T> first, Collection<T> ... sets) {
+ Set<T> result = new HashSet<T>(first);
+ for ( Collection<T> set : sets ) {
+ result.retainAll(set);
+ }
+ return result;
+ }
+
+ public static <T> Collection<T> remove( Collection<T> first, Collection<T> ... sets) {
+ Set<T> result = new HashSet<T>(first);
+ for ( Collection<T> set : sets ) {
+ result.removeAll(set);
+ }
+ return result;
+ }
+}
diff --git a/bundleplugin/src/main/java/aQute/lib/collections/MultiMap.java b/bundleplugin/src/main/java/aQute/lib/collections/MultiMap.java
new file mode 100644
index 0000000..7672638
--- /dev/null
+++ b/bundleplugin/src/main/java/aQute/lib/collections/MultiMap.java
@@ -0,0 +1,83 @@
+package aQute.lib.collections;
+
+import java.util.*;
+
+public class MultiMap<K,V> extends HashMap<K,Set<V>> {
+ private static final long serialVersionUID = 1L;
+ final Set<V> EMPTY = Collections.emptySet();
+
+ public boolean add( K key, V value ) {
+ Set<V> set = get(key);
+ if ( set == null) {
+ set=new HashSet<V>();
+ put(key,set);
+ }
+ return set.add(value);
+ }
+
+ public boolean addAll( K key, Collection<V> value ) {
+ Set<V> set = get(key);
+ if ( set == null) {
+ set=new HashSet<V>();
+ put(key,set);
+ }
+ return set.addAll(value);
+ }
+
+ public boolean remove( K key, V value ) {
+ Set<V> set = get(key);
+ if ( set == null) {
+ return false;
+ }
+ boolean result = set.remove(value);
+ if ( set.isEmpty())
+ remove(key);
+ return result;
+ }
+
+ public boolean removeAll( K key, Collection<V> value ) {
+ Set<V> set = get(key);
+ if ( set == null) {
+ return false;
+ }
+ boolean result = set.removeAll(value);
+ if ( set.isEmpty())
+ remove(key);
+ return result;
+ }
+
+ public Iterator<V> iterate(K key) {
+ Set<V> set = get(key);
+ if ( set == null)
+ return EMPTY.iterator();
+ else
+ return set.iterator();
+ }
+
+ public Iterator<V> all() {
+ return new Iterator<V>() {
+ Iterator<Set<V>> master = values().iterator();
+ Iterator<V> current = null;
+
+ public boolean hasNext() {
+ if ( current == null || !current.hasNext()) {
+ if ( master.hasNext()) {
+ current = master.next().iterator();
+ return current.hasNext();
+ }
+ return false;
+ }
+ return true;
+ }
+
+ public V next() {
+ return current.next();
+ }
+
+ public void remove() {
+ current.remove();
+ }
+
+ };
+ }
+}
diff --git a/bundleplugin/src/main/java/aQute/lib/collections/packageinfo b/bundleplugin/src/main/java/aQute/lib/collections/packageinfo
new file mode 100644
index 0000000..7c8de03
--- /dev/null
+++ b/bundleplugin/src/main/java/aQute/lib/collections/packageinfo
@@ -0,0 +1 @@
+version 1.0