1 package org.simantics.db.common.utils;
\r
3 import java.util.ArrayList;
\r
4 import java.util.List;
\r
5 import java.util.Set;
\r
7 import org.simantics.db.ReadGraph;
\r
8 import org.simantics.db.Resource;
\r
9 import org.simantics.db.WriteGraph;
\r
10 import org.simantics.db.WriteOnlyGraph;
\r
11 import org.simantics.db.exception.DatabaseException;
\r
12 import org.simantics.layer0.Layer0;
\r
14 public class ListUtils {
\r
17 * Inserts {@code elements} between list nodes
\r
18 * {@code before} and {@code after}.
\r
20 private static void insertBetween(
\r
21 WriteGraph g, Layer0 L0, Resource list,
\r
22 Resource before, Resource after,
\r
23 Iterable<Resource> elements) throws DatabaseException {
\r
24 for(Resource item : elements) {
\r
25 Resource cur = g.newResource();
\r
26 g.claim(cur, L0.InstanceOf, null, L0.List_Entry);
\r
27 g.claim(cur, L0.IsOwnedBy, L0.IsComposedOf, list);
\r
28 g.claim(before, L0.List_Next, L0.List_Previous, cur);
\r
29 g.claim(cur, L0.List_Element, item);
\r
32 g.claim(before, L0.List_Next, L0.List_Previous, after);
\r
35 private static void insertBetween(
\r
36 WriteGraph g, Layer0 L0, Resource list,
\r
37 Resource before, Resource after,
\r
38 Resource[] elements) throws DatabaseException {
\r
39 for(Resource item : elements) {
\r
40 Resource cur = g.newResource();
\r
41 g.claim(cur, L0.InstanceOf, null, L0.List_Entry);
\r
42 g.claim(cur, L0.IsOwnedBy, L0.IsComposedOf, list);
\r
43 g.claim(before, L0.List_Next, L0.List_Previous, cur);
\r
44 g.claim(cur, L0.List_Element, item);
\r
47 g.claim(before, L0.List_Next, L0.List_Previous, after);
\r
51 * Creates a list containing the givens {@code elements}.
\r
53 public static Resource create(WriteGraph g, Iterable<Resource> elements) throws DatabaseException {
\r
54 Layer0 L0 = Layer0.getInstance(g);
\r
56 Resource list = g.newResource();
\r
57 g.claim(list, L0.InstanceOf, L0.List);
\r
59 insertBetween(g, L0, list, list, list, elements);
\r
64 * Creates a list containing the givens {@code elements}.
\r
66 public static Resource create(WriteGraph g, Resource type, Iterable<Resource> elements) throws DatabaseException {
\r
67 Layer0 L0 = Layer0.getInstance(g);
\r
69 Resource list = g.newResource();
\r
70 g.claim(list, L0.InstanceOf, null, type);
\r
72 insertBetween(g, L0, list, list, list, elements);
\r
76 public static Resource create(WriteGraph g, Resource type, Resource ... elements) throws DatabaseException {
\r
77 Layer0 L0 = Layer0.getInstance(g);
\r
79 Resource list = g.newResource();
\r
80 g.claim(list, L0.InstanceOf, null, type);
\r
82 insertBetween(g, L0, list, list, list, elements);
\r
87 * Inserts given {@code elements} into the front of the list.
\r
89 public static void insertFront(WriteGraph g, Resource list, Iterable<Resource> elements) throws DatabaseException {
\r
90 if (!elements.iterator().hasNext())
\r
92 Layer0 L0 = Layer0.getInstance(g);
\r
94 Resource first = g.getSingleObject(list, L0.List_Next);
\r
95 g.deny(list, L0.List_Next, L0.List_Previous, first);
\r
96 insertBetween(g, L0, list, list, first, elements);
\r
99 public static void createExisting(WriteOnlyGraph g, Resource list, Iterable<Resource> elements) throws DatabaseException {
\r
101 Layer0 L0 = g.getService(Layer0.class);
\r
102 Resource before = list;
\r
103 for(Resource item : elements) {
\r
104 Resource cur = g.newResource();
\r
105 g.claim(cur, L0.InstanceOf, null, L0.List_Entry);
\r
106 g.claim(cur, L0.IsOwnedBy, L0.IsComposedOf, list);
\r
107 g.claim(before, L0.List_Next, L0.List_Previous, cur);
\r
108 g.claim(cur, L0.List_Element, null, item);
\r
111 g.claim(before, L0.List_Next, L0.List_Previous, list);
\r
116 * Inserts given {@code elements} into the back of the list.
\r
118 public static void insertBack(WriteGraph g, Resource list, Iterable<Resource> elements) throws DatabaseException {
\r
119 if (!elements.iterator().hasNext())
\r
121 Layer0 L0 = Layer0.getInstance(g);
\r
123 Resource last = g.getSingleObject(list, L0.List_Previous);
\r
124 g.deny(last, L0.List_Next, L0.List_Previous, list);
\r
125 insertBetween(g, L0, list, last, list, elements);
\r
129 * Replaces a given element in the a given list
\r
130 * @param g WriteGraph
\r
131 * @param list List resource
\r
132 * @param element Element to be replaced
\r
133 * @param replacement Resource that replaces element
\r
134 * @return true if successful replacement, false otherwise
\r
135 * @throws DatabaseException
\r
137 public static boolean replace(WriteGraph g, Resource list, Resource element, Resource replacement) throws DatabaseException {
\r
138 if(list == null || element == null || replacement == null)
\r
141 Layer0 L0 = Layer0.getInstance(g);
\r
143 Resource node = getNode(g, list, element);
\r
145 g.deny(node, L0.List_Element);
\r
146 g.claim(node, L0.List_Element, replacement);
\r
153 private static void toList(ReadGraph g, List<Resource> result, Resource list) throws DatabaseException {
\r
155 Layer0 L0 = Layer0.getInstance(g);
\r
157 Resource cur = g.getSingleObject(list, L0.List_Next);
\r
158 while(!cur.equals(list)) {
\r
159 Resource el = g.getPossibleObject(cur, L0.List_Element);
\r
162 cur = g.getSingleObject(cur, L0.List_Next);
\r
168 * Converts a list in the graph to a Java List.
\r
170 public static List<Resource> toList(ReadGraph g, Resource list) throws DatabaseException {
\r
171 ArrayList<Resource> result = new ArrayList<Resource>();
\r
172 toList(g, result, list);
\r
176 public static List<Resource> toPossibleList(ReadGraph g, Resource list) throws DatabaseException {
\r
178 return toList(g, list);
\r
179 } catch (DatabaseException e) {
\r
185 * Removes an element from a list. Returns true if actually removed something.
\r
187 public static boolean removeElement(WriteGraph g, Resource list, Resource element) throws DatabaseException {
\r
188 Layer0 L0 = Layer0.getInstance(g);
\r
189 Resource prev = list;
\r
190 Resource cur = g.getSingleObject(list, L0.List_Next);
\r
191 while(!cur.equals(list)) {
\r
192 Resource el = g.getPossibleObject(cur, L0.List_Element);
\r
193 Resource next = g.getSingleObject(cur, L0.List_Next);
\r
194 if(element.equals(el)) {
\r
196 g.claim(prev, L0.List_Next, next);
\r
206 * Removes an elements from a list. Returns true if actually removed something.
\r
208 public static boolean removeElements(WriteGraph g, Resource list, Set<Resource> elements) throws DatabaseException {
\r
209 Layer0 L0 = Layer0.getInstance(g);
\r
210 Resource prev = list;
\r
211 Resource cur = g.getSingleObject(list, L0.List_Next);
\r
212 boolean removed = false;
\r
213 while(!cur.equals(list)) {
\r
214 Resource el = g.getPossibleObject(cur, L0.List_Element);
\r
215 Resource next = g.getSingleObject(cur, L0.List_Next);
\r
216 if(elements.contains(el)) {
\r
218 g.claim(prev, L0.List_Next, next);
\r
228 private static void getListNodes(ReadGraph g, List<Resource> result, Resource list) throws DatabaseException {
\r
230 Layer0 L0 = Layer0.getInstance(g);
\r
232 Resource cur = g.getSingleObject(list, L0.List_Next);
\r
233 while(!cur.equals(list)) {
\r
235 cur = g.getSingleObject(cur, L0.List_Next);
\r
240 public static List<Resource> getListNodes(ReadGraph g, Resource list) throws DatabaseException {
\r
241 ArrayList<Resource> result = new ArrayList<Resource>();
\r
242 getListNodes(g, result, list);
\r
246 public static Resource getNode(ReadGraph g, Resource list, Resource element) throws DatabaseException {
\r
247 Layer0 L0 = Layer0.getInstance(g);
\r
249 Resource cur = g.getSingleObject(list, L0.List_Next);
\r
250 while(!cur.equals(list)) {
\r
251 Resource el = g.getPossibleObject(cur, L0.List_Element);
\r
252 if(element.equals(el))
\r
254 cur = g.getSingleObject(cur, L0.List_Next);
\r
259 public static boolean swapWithPrevious(WriteGraph g, Resource list, Resource element) throws DatabaseException {
\r
260 Resource node = getNode(g, list, element);
\r
263 Layer0 L0 = Layer0.getInstance(g);
\r
264 Resource prev = g.getSingleObject(node, L0.List_Previous);
\r
265 if(list.equals(prev))
\r
267 swap(g, node, prev);
\r
271 public static boolean swapWithNext(WriteGraph g, Resource list, Resource element) throws DatabaseException {
\r
272 Resource node = getNode(g, list, element);
\r
275 Layer0 L0 = Layer0.getInstance(g);
\r
276 Resource next = g.getSingleObject(node, L0.List_Next);
\r
277 if(list.equals(next))
\r
279 swap(g, node, next);
\r
283 private static void swap(WriteGraph g, Resource a, Resource b) throws DatabaseException {
\r
284 Layer0 L0 = Layer0.getInstance(g);
\r
285 Resource ea = g.getPossibleObject(a, L0.List_Element);
\r
286 Resource eb = g.getPossibleObject(b, L0.List_Element);
\r
288 g.deny(a, L0.List_Element);
\r
289 g.deny(b, L0.List_Element);
\r
292 g.claim(a, L0.List_Element, eb);
\r
294 g.claim(b, L0.List_Element, ea);
\r