]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.objmap2/src/org/simantics/objmap/graph/rules/MappedElementsRule.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.objmap2 / src / org / simantics / objmap / graph / rules / MappedElementsRule.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2013 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.objmap.graph.rules;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Collection;\r
16 \r
17 import org.apache.log4j.Logger;\r
18 import org.simantics.db.ReadGraph;\r
19 import org.simantics.db.WriteGraph;\r
20 import org.simantics.objmap.backward.IBackwardMapping;\r
21 import org.simantics.objmap.bidirectional.IBidirectionalMappingRule;\r
22 import org.simantics.objmap.exceptions.MappingException;\r
23 import org.simantics.objmap.forward.IForwardMapping;\r
24 import org.simantics.objmap.graph.rules.domain.IDomainAccessor;\r
25 import org.simantics.objmap.graph.rules.range.IRangeAccessor;\r
26 \r
27 \r
28 /**\r
29  * A rule that synchronizes collection of elements between\r
30  * domain and range accessors. Elements are mapped from\r
31  * between domain and range during the synchronization.\r
32  * @author Hannu Niemistö\r
33  */\r
34 public class MappedElementsRule<Domain, Range> implements IBidirectionalMappingRule<Domain, Range> {\r
35 \r
36     static Logger LOGGER = Logger.getLogger("org.simantics.objmap");\r
37 \r
38     IDomainAccessor<Domain,Collection<Domain>> domainAccessor;\r
39     IRangeAccessor<Range,Collection<Range>> rangeAccessor;\r
40 \r
41     public MappedElementsRule(IDomainAccessor<Domain,Collection<Domain>> domainAccessor,\r
42             IRangeAccessor<Range,Collection<Range>> rangeAccessor) {\r
43         this.domainAccessor = domainAccessor;\r
44         this.rangeAccessor = rangeAccessor;\r
45     }\r
46 \r
47     @Override\r
48     public boolean updateDomain(WriteGraph g, IBackwardMapping<Domain, Range> map,\r
49             Domain domainElement, Range rangeElement)\r
50     throws MappingException {\r
51         LOGGER.info("    MappedElementsRule.updateDomain");\r
52         // Snapshot the accessed range value for concurrency safety.\r
53         // NOTE: still assumes that the accessed collection is concurrent or\r
54         // synchronized for toArray to be atomic.\r
55         Collection<Range> value = rangeAccessor.get(rangeElement);\r
56         Object[] rangeSnapshot = value.toArray();\r
57         ArrayList<Domain> mappedValue = new ArrayList<Domain>(rangeSnapshot.length);\r
58         for (Object obj : rangeSnapshot)\r
59             mappedValue.add(map.inverseMap(g, (Range)obj));//map.inverseGet((Range)obj));\r
60         return domainAccessor.set(g, domainElement, mappedValue);\r
61     }\r
62 \r
63     @Override\r
64     public boolean updateRange(ReadGraph g, IForwardMapping<Domain, Range> map,\r
65             Domain domainElement, Range rangeElement)\r
66     throws MappingException {\r
67         LOGGER.info("    MappedElementsRule.updateRange");\r
68         Collection<Domain> value = domainAccessor.get(g, domainElement);\r
69         ArrayList<Range> mappedValue = new ArrayList<Range>(value.size());\r
70         for(Domain r : value)\r
71             mappedValue.add(map.map(g, r));//map.get(r));\r
72         return rangeAccessor.set(rangeElement, mappedValue);\r
73     }\r
74     \r
75     public void createDomain(WriteGraph g, IBackwardMapping<Domain,Range> map, Domain domainElement, Range rangeElement) throws MappingException {\r
76         updateDomain(g, map, domainElement, rangeElement);\r
77     };\r
78     \r
79     public void createRange(ReadGraph g, IForwardMapping<Domain,Range> map, Domain domainElement, Range rangeElement) throws MappingException {\r
80         updateRange(g, map, domainElement, rangeElement);\r
81     };\r
82 }\r