--- /dev/null
+package fi.vtt.simantics.procore.internal;\r
+\r
+import java.lang.reflect.Array;\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.Collections;\r
+import java.util.Comparator;\r
+import java.util.HashSet;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.ListIterator;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.Statement;\r
+import org.simantics.db.exception.ResourceNotFoundException;\r
+import org.simantics.db.impl.ResourceImpl;\r
+import org.simantics.db.impl.graph.ReadGraphImpl;\r
+import org.simantics.db.impl.query.IntSet;\r
+import org.simantics.db.service.CollectionSupport;\r
+import org.simantics.utils.datastructures.Callback;\r
+\r
+import gnu.trove.impl.Constants;\r
+import gnu.trove.iterator.TIntIterator;\r
+import gnu.trove.list.array.TIntArrayList;\r
+import gnu.trove.map.hash.TIntIntHashMap;\r
+import gnu.trove.map.hash.TIntObjectHashMap;\r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.procedure.TIntObjectProcedure;\r
+import gnu.trove.procedure.TIntProcedure;\r
+import gnu.trove.procedure.TObjectIntProcedure;\r
+import gnu.trove.procedure.TObjectProcedure;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
+public class CollectionSupportImpl implements CollectionSupport {\r
+ \r
+ final private SessionImplSocket session;\r
+ \r
+ CollectionSupportImpl(SessionImplSocket session) {\r
+ this.session = session;\r
+ }\r
+ \r
+ static final class IntResourceMap {\r
+ \r
+ final private SessionImplSocket session;\r
+ final private TIntIntHashMap backend = new TIntIntHashMap(Constants.DEFAULT_CAPACITY, Constants.DEFAULT_LOAD_FACTOR, -1, 0);\r
+ \r
+ IntResourceMap(SessionImplSocket session) {\r
+ this.session = session;\r
+ }\r
+ \r
+ public int size() {\r
+ return backend.size();\r
+ }\r
+ \r
+ public boolean isEmpty() {\r
+ return backend.isEmpty();\r
+ }\r
+ \r
+ public boolean containsKey(int key) {\r
+ return backend.containsKey(key);\r
+ }\r
+ \r
+ public boolean containsValue(int value) {\r
+ return backend.containsValue(value);\r
+ }\r
+ \r
+ public Resource get(int key) {\r
+ try {\r
+ return session.getResourceByKey(backend.get(key));\r
+ } catch (ResourceNotFoundException e) {\r
+ e.printStackTrace();\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ public Resource put(int key, Resource value) {\r
+ ResourceImpl impl = (ResourceImpl) value;\r
+ int i = backend.put(key, impl.id);\r
+ if (i == 0)\r
+ return null;\r
+ else\r
+ try {\r
+ return session.getResourceByKey(i);\r
+ } catch (ResourceNotFoundException e) {\r
+ e.printStackTrace();\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ public Resource remove(int key) {\r
+ throw new UnsupportedOperationException("remove not supported");\r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ return backend.hashCode();\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ if (this == obj)\r
+ return true;\r
+ if (obj == null)\r
+ return false;\r
+ if (getClass() != obj.getClass())\r
+ return false;\r
+ IntResourceMap other = (IntResourceMap) obj;\r
+ return session == other.session && backend.equals(other.backend);\r
+ }\r
+ }\r
+ \r
+ public IntResourceMap createIntResourceMap() {\r
+ return new IntResourceMap(session);\r
+ }\r
+\r
+ static final class ObjectResourceMap<T> implements Map<T, Resource> {\r
+ \r
+ final private SessionImplSocket session;\r
+ final private TObjectIntHashMap<T> backend;\r
+ \r
+ ObjectResourceMap(SessionImplSocket session) {\r
+ this.session = session;\r
+ backend = new TObjectIntHashMap<T>(Constants.DEFAULT_CAPACITY, Constants.DEFAULT_LOAD_FACTOR, 0);\r
+ }\r
+\r
+ ObjectResourceMap(SessionImplSocket session, int capacity) {\r
+ this.session = session;\r
+ backend = new TObjectIntHashMap<T>(capacity, Constants.DEFAULT_LOAD_FACTOR, 0);\r
+ }\r
+ \r
+ @Override\r
+ public int size() {\r
+ return backend.size();\r
+ }\r
+ @Override\r
+ public boolean isEmpty() {\r
+ return backend.isEmpty();\r
+ }\r
+ \r
+ @Override\r
+ public boolean containsKey(Object key) {\r
+ return backend.contains(key);\r
+ }\r
+ \r
+ @Override\r
+ public boolean containsValue(Object value) {\r
+ ResourceImpl impl = (ResourceImpl) value;\r
+ return backend.containsValue(impl.id);\r
+ }\r
+ \r
+ @Override\r
+ public Resource get(Object key) {\r
+ try {\r
+ int result = backend.get(key);\r
+ if (result == 0)\r
+ return null;\r
+ return session.getResourceByKey(result);\r
+ } catch (ResourceNotFoundException e) {\r
+ e.printStackTrace();\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ @Override\r
+ public Resource put(T key, Resource value) {\r
+ ResourceImpl impl = (ResourceImpl) value;\r
+ int i = backend.put(key, impl.id);\r
+ if (i == 0)\r
+ return null;\r
+ else\r
+ try {\r
+ return session.getResourceByKey(i);\r
+ } catch (ResourceNotFoundException e) {\r
+ e.printStackTrace();\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ @Override\r
+ public Resource remove(Object key) {\r
+ throw new UnsupportedOperationException("remove not supported, structure is immutable");\r
+ }\r
+ \r
+ @Override\r
+ public void putAll(Map<? extends T, ? extends Resource> map) {\r
+ @SuppressWarnings("unchecked")\r
+ ObjectResourceMap<T> other = (ObjectResourceMap<T>) map;\r
+ other.backend.forEachEntry(new TObjectIntProcedure<T>() {\r
+\r
+ @Override\r
+ public boolean execute(T a, int b) {\r
+ backend.put(a, b);\r
+ return true;\r
+ }\r
+ });\r
+ }\r
+ \r
+ @Override\r
+ public void clear() {\r
+ throw new UnsupportedOperationException("clear not supported, structure is immutable");\r
+ }\r
+ \r
+ @Override\r
+ public Set<T> keySet() {\r
+ final Set<T> result = new HashSet<T>();\r
+ backend.forEach(new TObjectProcedure<T>() {\r
+\r
+ @Override\r
+ public boolean execute(T object) {\r
+ result.add(object);\r
+ return true;\r
+ }\r
+ });\r
+ return result;\r
+ }\r
+ \r
+ @Override\r
+ public Collection<Resource> values() {\r
+ ArrayList<Resource> result = new ArrayList<Resource>();\r
+ for (int key : backend.values()) {\r
+ try {\r
+ result.add(session.getResourceByKey(key));\r
+ } catch (ResourceNotFoundException e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+ \r
+ @Override\r
+ public Set<java.util.Map.Entry<T, Resource>> entrySet() {\r
+ final HashSet<java.util.Map.Entry<T, Resource>> result = new HashSet<java.util.Map.Entry<T, Resource>>();\r
+ backend.forEachEntry(new TObjectIntProcedure<T>() {\r
+\r
+ @Override\r
+ public boolean execute(final T a, final int b) {\r
+ return result.add(new Map.Entry<T, Resource>() {\r
+\r
+ @Override\r
+ public T getKey() {\r
+ return a;\r
+ }\r
+\r
+ @Override\r
+ public Resource getValue() {\r
+ return new ResourceImpl(session.resourceSupport, b);\r
+ }\r
+\r
+ @Override\r
+ public Resource setValue(Resource value) {\r
+ throw new UnsupportedOperationException("Map.Entry.setValue not supported, structure is immutable");\r
+ }\r
+ \r
+ });\r
+ }\r
+ });\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ return backend.hashCode();\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ if (this == obj)\r
+ return true;\r
+ if (obj == null)\r
+ return false;\r
+ if (getClass() != obj.getClass())\r
+ return false;\r
+ ObjectResourceMap<?> other = (ObjectResourceMap<?>) obj;\r
+ return session == other.session && backend.equals(other.backend);\r
+ }\r
+\r
+ }\r
+ \r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public <T, I> T createObjectResourceMap(Class<I> clazz) {\r
+ return (T)new ObjectResourceMap<I>(session);\r
+ }\r
+\r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public <T, I> T createObjectResourceMap(Class<I> clazz, int capacity) {\r
+ return (T)new ObjectResourceMap<I>(session, capacity);\r
+ }\r
+\r
+ static final class ResourceMap<T> implements org.simantics.db.ResourceMap<T> {\r
+ \r
+ final private SessionImplSocket session;\r
+ final private TIntObjectHashMap<T> backend = new TIntObjectHashMap<T>();\r
+\r
+ ResourceMap(SessionImplSocket session) {\r
+ this.session = session;\r
+ }\r
+ \r
+ @Override\r
+ public void clear() {\r
+ throw new UnsupportedOperationException("Not implemented");\r
+ }\r
+\r
+ @Override\r
+ public boolean containsKey(Object resource) {\r
+ ResourceImpl impl = (ResourceImpl)resource;\r
+ return backend.containsKey(impl.id);\r
+ }\r
+\r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public boolean containsValue(Object value) {\r
+ return backend.containsValue((T)value);\r
+ }\r
+\r
+ @Override\r
+ public Set<java.util.Map.Entry<Resource, T>> entrySet() {\r
+ final HashSet<java.util.Map.Entry<Resource, T>> result = new HashSet<java.util.Map.Entry<Resource, T>>();\r
+ backend.forEachEntry(new TIntObjectProcedure<T>() {\r
+\r
+ @Override\r
+ public boolean execute(final int a, final T b) {\r
+ result.add(new Map.Entry<Resource, T>() {\r
+\r
+ @Override\r
+ public Resource getKey() {\r
+ return new ResourceImpl(session.resourceSupport, a);\r
+ }\r
+\r
+ @Override\r
+ public T getValue() {\r
+ return b;\r
+ }\r
+\r
+ @Override\r
+ public T setValue(T arg0) {\r
+ throw new UnsupportedOperationException("Not supported");\r
+ }\r
+ \r
+ });\r
+ return true;\r
+ }\r
+ \r
+ });\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public T get(Object resource) {\r
+ ResourceImpl impl = (ResourceImpl)resource;\r
+ return backend.get(impl.id);\r
+ }\r
+\r
+ @Override\r
+ public boolean isEmpty() {\r
+ return backend.isEmpty();\r
+ }\r
+\r
+ public class CallbackEntry<E> implements ResourceMapEntry<E> {\r
+ \r
+ int id;\r
+ E value;\r
+ \r
+ @Override\r
+ public Resource getKey() {\r
+ return new ResourceImpl(session.resourceSupport, id);\r
+ }\r
+\r
+ @Override\r
+ public E getValue() {\r
+ return value;\r
+ }\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public void iterateEntries(final Callback<ResourceMapEntry<T>> callback) {\r
+ final CallbackEntry<T> entry = new CallbackEntry<T>();\r
+ backend.forEach(new TIntProcedure() {\r
+ \r
+ @Override\r
+ public boolean execute(int value) {\r
+ entry.id = value;\r
+ entry.value = backend.get(value);\r
+ callback.run(entry);\r
+ return true;\r
+ }\r
+ });\r
+ }\r
+ \r
+ @Override\r
+ public Set<Resource> keySet() {\r
+ final ResourceSet result = new ResourceSet(session);\r
+ backend.forEach(new TIntProcedure() {\r
+ \r
+ @Override\r
+ public boolean execute(int value) {\r
+ result.add(value);\r
+ return true;\r
+ }\r
+ });\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public T put(Resource resource, T value) {\r
+ ResourceImpl impl = (ResourceImpl)resource;\r
+ return backend.put(impl.id, value);\r
+ }\r
+\r
+ @Override\r
+ public void putAll(Map<? extends Resource, ? extends T> map) {\r
+ @SuppressWarnings("unchecked")\r
+ ResourceMap<T> other = (ResourceMap<T>)map;\r
+ other.backend.forEachEntry(new TIntObjectProcedure<T>() {\r
+\r
+ @Override\r
+ public boolean execute(int a, T b) {\r
+ backend.put(a, b);\r
+ return true;\r
+ }\r
+ \r
+ });\r
+ }\r
+\r
+ @Override\r
+ public T remove(Object arg0) {\r
+ throw new UnsupportedOperationException("Not implemented");\r
+ }\r
+\r
+ @Override\r
+ public int size() {\r
+ return backend.size();\r
+ }\r
+\r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public Collection<T> values() {\r
+ ArrayList<T> result = new ArrayList<T>();\r
+ for(Object o : backend.values()) result.add((T)o);\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ return backend.hashCode();\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ if (this == obj)\r
+ return true;\r
+ if (obj == null)\r
+ return false;\r
+ if (getClass() != obj.getClass())\r
+ return false;\r
+ ResourceMap<?> other = (ResourceMap<?>) obj;\r
+ return session == other.session && backend.equals(other.backend);\r
+ }\r
+ \r
+ }\r
+ \r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public <T, I> T createMap(Class<I> clazz) {\r
+ return (T)new ResourceMap<I>(session);\r
+ }\r
+\r
+ static final class ResourceSet implements Set<Resource> {\r
+ \r
+ final private SessionImplSocket session;\r
+ final private TIntHashSet backend;\r
+\r
+ ResourceSet(SessionImplSocket session) {\r
+ this.session = session;\r
+ backend = new TIntHashSet();\r
+ }\r
+ \r
+ ResourceSet(SessionImplSocket session, int capacity) {\r
+ this.session = session;\r
+ backend = new TIntHashSet(capacity);\r
+ }\r
+\r
+ @Override\r
+ public void clear() {\r
+ backend.clear();\r
+ }\r
+\r
+ @Override\r
+ public int size() {\r
+ return backend.size();\r
+ }\r
+\r
+ @Override\r
+ public boolean add(Resource resource) {\r
+ ResourceImpl impl = (ResourceImpl)resource;\r
+ return backend.add(impl.id);\r
+ }\r
+ \r
+ boolean add(int id) {\r
+ return backend.add(id);\r
+ }\r
+\r
+ @Override\r
+ public boolean addAll(Collection<? extends Resource> rs) {\r
+ boolean result = true;\r
+ for(Resource r : rs) result &= add(r);\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public boolean contains(Object resource) {\r
+ ResourceImpl impl = (ResourceImpl)resource;\r
+ return backend.contains(impl.id);\r
+ }\r
+\r
+ @Override\r
+ public boolean containsAll(Collection<?> rs) {\r
+ boolean result = true;\r
+ for(Object r : rs) result &= contains(r);\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public boolean isEmpty() {\r
+ return backend.isEmpty();\r
+ }\r
+\r
+ @Override\r
+ public Iterator<Resource> iterator() {\r
+ return new Iterator<Resource>() {\r
+\r
+ TIntIterator it = backend.iterator();\r
+ \r
+ @Override\r
+ public boolean hasNext() {\r
+ return it.hasNext();\r
+ }\r
+\r
+ @Override\r
+ public Resource next() {\r
+ return new ResourceImpl(session.resourceSupport, it.next());\r
+ }\r
+\r
+ @Override\r
+ public void remove() {\r
+ it.remove();\r
+ }\r
+ \r
+ };\r
+ }\r
+\r
+ @Override\r
+ public boolean remove(Object resource) {\r
+ ResourceImpl impl = (ResourceImpl)resource;\r
+ return backend.remove(impl.id);\r
+ }\r
+\r
+ @Override\r
+ public boolean removeAll(Collection<?> rs) {\r
+ boolean result = true;\r
+ for(Object r : rs) result &= remove(r);\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public boolean retainAll(Collection<?> arg0) {\r
+ throw new UnsupportedOperationException("Not implemented");\r
+ }\r
+\r
+ @Override\r
+ public Object[] toArray() {\r
+ throw new UnsupportedOperationException("Not implemented");\r
+ }\r
+\r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public <T> T[] toArray(T[] arg0) {\r
+ final T[] result = (T[])Array.newInstance(arg0.getClass().getComponentType(), backend.size());\r
+ backend.forEach(new TIntProcedure() {\r
+ \r
+ int index = 0;\r
+ \r
+ @Override\r
+ public boolean execute(int value) {\r
+ result[index++] = (T)new ResourceImpl(session.resourceSupport, value);\r
+ return true;\r
+ }\r
+ });\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ return backend.hashCode();\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ if (this == obj)\r
+ return true;\r
+ if (obj == null)\r
+ return false;\r
+ if (getClass() != obj.getClass())\r
+ return false;\r
+ ResourceSet other = (ResourceSet) obj;\r
+ return session == other.session && backend.equals(other.backend);\r
+ }\r
+ \r
+ }\r
+ \r
+ @Override\r
+ public Set<Resource> createSet() {\r
+ return new ResourceSet(session);\r
+ }\r
+ \r
+ @Override\r
+ public Set<Resource> createSet(int capacity) {\r
+ return new ResourceSet(session, capacity);\r
+ }\r
+\r
+ static final class ResourceList implements List<Resource> {\r
+ \r
+ final private SessionImplSocket session;\r
+ final private TIntArrayList backend;\r
+\r
+ ResourceList(SessionImplSocket session) {\r
+ this.session = session;\r
+ this.backend = new TIntArrayList();\r
+ }\r
+\r
+ ResourceList(SessionImplSocket session, Collection<Resource> rs) {\r
+ this.session = session;\r
+ this.backend = new TIntArrayList(rs.size());\r
+ addAll(rs);\r
+ }\r
+\r
+ @Override\r
+ public void clear() {\r
+ throw new UnsupportedOperationException("Not implemented");\r
+ }\r
+\r
+ @Override\r
+ public int size() {\r
+ return backend.size();\r
+ }\r
+\r
+ @Override\r
+ public boolean add(Resource resource) {\r
+ if(resource == null) {\r
+ backend.add(0);\r
+ } else {\r
+ ResourceImpl impl = (ResourceImpl)resource;\r
+ backend.add(impl.id);\r
+ }\r
+ return true;\r
+ }\r
+\r
+ @Override\r
+ public boolean addAll(Collection<? extends Resource> rs) {\r
+ if(rs instanceof ResourceList) {\r
+ ResourceList rl = (ResourceList)rs;\r
+ backend.addAll(rl.backend);\r
+ return !rl.isEmpty();\r
+ }\r
+ boolean result = true;\r
+ for(Resource r : rs) result &= add(r);\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public boolean contains(Object resource) {\r
+ ResourceImpl impl = (ResourceImpl)resource;\r
+ return backend.contains(impl.id);\r
+ }\r
+\r
+ @Override\r
+ public boolean containsAll(Collection<?> rs) {\r
+ boolean result = true;\r
+ for(Object r : rs) result &= contains(r);\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public boolean isEmpty() {\r
+ return backend.isEmpty();\r
+ }\r
+\r
+ @Override\r
+ public Iterator<Resource> iterator() {\r
+ return new Iterator<Resource>() {\r
+ \r
+ int index = backend.size();\r
+ \r
+ @Override\r
+ public boolean hasNext() {\r
+ return index > 0; \r
+ }\r
+\r
+ @Override\r
+ public Resource next() {\r
+ return new ResourceImpl(session.resourceSupport, backend.getQuick(--index));\r
+ }\r
+\r
+ @Override\r
+ public void remove() {\r
+ throw new UnsupportedOperationException("Not supported");\r
+ }\r
+ \r
+ };\r
+ }\r
+\r
+ @Override\r
+ public boolean remove(Object resource) {\r
+ if(!(resource instanceof ResourceImpl)) return false;\r
+ ResourceImpl impl = (ResourceImpl)resource;\r
+ return backend.remove(impl.id);\r
+ }\r
+\r
+ @Override\r
+ public boolean removeAll(Collection<?> rs) {\r
+ boolean modified = false;\r
+ for(Object o : rs)\r
+ modified |= remove(o);\r
+ return modified;\r
+ }\r
+\r
+ @Override\r
+ public boolean retainAll(Collection<?> arg0) {\r
+ throw new UnsupportedOperationException("Not implemented");\r
+ }\r
+\r
+ @Override\r
+ public Object[] toArray() {\r
+ return toArray(new Object[backend.size()]);\r
+ }\r
+\r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public <T> T[] toArray(T[] arg0) {\r
+ final T[] result = (T[])Array.newInstance(arg0.getClass().getComponentType(), backend.size());\r
+ backend.forEach(new TIntProcedure() {\r
+ \r
+ int index = 0;\r
+ \r
+ @Override\r
+ public boolean execute(int value) {\r
+ result[index++] = (T)new ResourceImpl(session.resourceSupport, value);\r
+ return true;\r
+ }\r
+ });\r
+ return result;\r
+ }\r
+ \r
+ void sort() {\r
+ backend.sort();\r
+ }\r
+\r
+ @Override\r
+ public boolean addAll(int index, Collection<? extends Resource> rs) {\r
+ if(rs.isEmpty()) return false;\r
+ int i = index;\r
+ for(Resource r : rs) {\r
+ add(i++, r);\r
+ }\r
+ return true;\r
+ }\r
+\r
+ @Override\r
+ public Resource get(int index) {\r
+ int id = backend.get(index);\r
+ if(id == 0) return null;\r
+ return new ResourceImpl(session.resourceSupport, id);\r
+ }\r
+\r
+ @Override\r
+ public Resource set(int index, Resource resource) {\r
+ ResourceImpl impl = (ResourceImpl)resource;\r
+ int old = backend.set(index, impl.id);\r
+ if(old == 0) return null;\r
+ return new ResourceImpl(session.resourceSupport, old);\r
+ }\r
+\r
+ @Override\r
+ public void add(int index, Resource resource) {\r
+ ResourceImpl impl = (ResourceImpl)resource;\r
+ backend.insert(index, impl.id);\r
+ }\r
+\r
+ @Override\r
+ public Resource remove(int index) {\r
+ int id = backend.removeAt(index);\r
+ return new ResourceImpl(session.resourceSupport, id);\r
+ }\r
+\r
+ @Override\r
+ public int indexOf(Object o) {\r
+ if(!(o instanceof ResourceImpl)) return -1;\r
+ ResourceImpl impl = (ResourceImpl)o;\r
+ return backend.indexOf(impl.id);\r
+ }\r
+\r
+ @Override\r
+ public int lastIndexOf(Object o) {\r
+ if(!(o instanceof ResourceImpl)) return -1;\r
+ ResourceImpl impl = (ResourceImpl)o;\r
+ return backend.lastIndexOf(impl.id);\r
+ }\r
+\r
+ @Override\r
+ public ListIterator<Resource> listIterator() {\r
+ throw new UnsupportedOperationException("Not implemented");\r
+ }\r
+\r
+ @Override\r
+ public ListIterator<Resource> listIterator(int index) {\r
+ throw new UnsupportedOperationException("Not implemented");\r
+ }\r
+\r
+ @Override\r
+ public List<Resource> subList(int fromIndex, int toIndex) {\r
+ ResourceList result = new ResourceList(session);\r
+ for(int i=fromIndex;i<toIndex;i++)\r
+ result.add(get(i));\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ return backend.hashCode();\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ if (this == obj)\r
+ return true;\r
+ if (obj == null)\r
+ return false;\r
+ if (getClass() != obj.getClass())\r
+ return false;\r
+ ResourceList other = (ResourceList) obj;\r
+ return session == other.session && backend.equals(other.backend);\r
+ }\r
+\r
+ }\r
+\r
+ @Override\r
+ public List<Resource> createList() {\r
+ return new ResourceList(session);\r
+ }\r
+\r
+ static final class StatementList implements Collection<Statement> {\r
+ \r
+ final private SessionImplSocket session;\r
+ final private TIntArrayList backend = new TIntArrayList();\r
+\r
+ StatementList(SessionImplSocket session) {\r
+ this.session = session;\r
+ }\r
+ \r
+ @Override\r
+ public void clear() {\r
+ throw new UnsupportedOperationException("Not implemented");\r
+ }\r
+\r
+ @Override\r
+ public int size() {\r
+ return backend.size() / 3;\r
+ }\r
+\r
+ @Override\r
+ public boolean add(Statement stm) {\r
+ ResourceImpl s = (ResourceImpl)stm.getSubject();\r
+ ResourceImpl p = (ResourceImpl)stm.getPredicate();\r
+ ResourceImpl o = (ResourceImpl)stm.getObject();\r
+ backend.add(s.id);\r
+ backend.add(p.id);\r
+ backend.add(o.id);\r
+ return true;\r
+ }\r
+\r
+ @Override\r
+ public boolean addAll(Collection<? extends Statement> rs) {\r
+ boolean result = true;\r
+ for(Statement r : rs) result &= add(r);\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public boolean contains(Object statement) {\r
+ throw new UnsupportedOperationException("Not implemented");\r
+ }\r
+\r
+ @Override\r
+ public boolean containsAll(Collection<?> rs) {\r
+ throw new UnsupportedOperationException("Not implemented");\r
+ }\r
+\r
+ @Override\r
+ public boolean isEmpty() {\r
+ return backend.isEmpty();\r
+ }\r
+\r
+ @Override\r
+ public Iterator<Statement> iterator() {\r
+ return new Iterator<Statement>() {\r
+\r
+ int index = 0;\r
+ int max = backend.size();\r
+ \r
+ @Override\r
+ public boolean hasNext() {\r
+ return index < max; \r
+ }\r
+\r
+ @Override\r
+ public Statement next() {\r
+ return new DirectStatementImpl(session.resourceSupport, backend.getQuick(index++), backend.getQuick(index++), backend.getQuick(index++));\r
+ }\r
+\r
+ @Override\r
+ public void remove() {\r
+ throw new UnsupportedOperationException("Not supported");\r
+ }\r
+ \r
+ };\r
+ }\r
+\r
+ @Override\r
+ public boolean remove(Object resource) {\r
+ throw new UnsupportedOperationException("Not implemented");\r
+ }\r
+\r
+ @Override\r
+ public boolean removeAll(Collection<?> rs) {\r
+ throw new UnsupportedOperationException("Not implemented");\r
+ }\r
+\r
+ @Override\r
+ public boolean retainAll(Collection<?> arg0) {\r
+ throw new UnsupportedOperationException("Not implemented");\r
+ }\r
+\r
+ @Override\r
+ public Object[] toArray() {\r
+ throw new UnsupportedOperationException("Not implemented");\r
+ }\r
+\r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public <T> T[] toArray(T[] arg0) {\r
+ final T[] result = (T[])Array.newInstance(arg0.getClass().getComponentType(), backend.size());\r
+ backend.forEach(new TIntProcedure() {\r
+ \r
+ int index = 0;\r
+ \r
+ @Override\r
+ public boolean execute(int value) {\r
+ result[index++] = (T)new ResourceImpl(session.resourceSupport, value);\r
+ return true;\r
+ }\r
+ });\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ return backend.hashCode();\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ if (this == obj)\r
+ return true;\r
+ if (obj == null)\r
+ return false;\r
+ if (getClass() != obj.getClass())\r
+ return false;\r
+ StatementList other = (StatementList) obj;\r
+ return session == other.session && backend.equals(other.backend);\r
+ }\r
+ \r
+ }\r
+\r
+ @Override\r
+ public Collection<Statement> createStatementList() {\r
+ return new StatementList(session);\r
+ }\r
+\r
+ private static Comparator<Resource> RESOURCE_COMPARATOR = new Comparator<Resource>() {\r
+ @Override\r
+ public int compare(Resource o1, Resource o2) {\r
+ ResourceImpl r1 = (ResourceImpl)o1;\r
+ ResourceImpl r2 = (ResourceImpl)o2;\r
+ return compare(r1.id, r2.id);\r
+ }\r
+\r
+ private int compare(int x, int y) {\r
+ return (x < y) ? -1 : ((x == y) ? 0 : 1);\r
+ }\r
+ };\r
+\r
+ @Override\r
+ public void sort(List<Resource> list) {\r
+ if(list instanceof ResourceList) {\r
+ ((ResourceList) list).sort();\r
+ } else {\r
+ Collections.sort(list, RESOURCE_COMPARATOR);\r
+ }\r
+ }\r
+ \r
+ @Override\r
+ public List<Resource> asSortedList(Collection<Resource> rs) {\r
+ ResourceList result = new ResourceList(session, rs);\r
+ result.sort();\r
+ return result;\r
+ }\r
+ \r
+ @Override\r
+ public org.simantics.db.ResourceSet getResourceSet(ReadGraph graph, Collection<Resource> resources) {\r
+ if(resources instanceof ResourceSet) return (org.simantics.db.ResourceSet)resources;\r
+ org.simantics.db.ResourceSet result = new IntSet(((ReadGraphImpl)graph).processor.querySupport);\r
+ for(Resource r : resources) result.add(r);\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public org.simantics.db.ResourceSet getResourceSet(ReadGraph graph, Resource ... rs) {\r
+ org.simantics.db.ResourceSet result = new IntSet(((ReadGraphImpl)graph).processor.querySupport);\r
+ for(Resource r : rs) result.add(r);\r
+ return result;\r
+ }\r
+ \r
+}\r