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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.objmap.graph.rules.domain;
\r
14 import java.util.Arrays;
\r
15 import java.util.Collection;
\r
16 import java.util.HashMap;
\r
17 import java.util.Map;
\r
19 import org.apache.log4j.Logger;
\r
20 import org.simantics.db.ReadGraph;
\r
21 import org.simantics.db.Resource;
\r
22 import org.simantics.db.Statement;
\r
23 import org.simantics.db.WriteGraph;
\r
24 import org.simantics.db.exception.DatabaseException;
\r
25 import org.simantics.layer0.Layer0;
\r
26 import org.simantics.objmap.exceptions.MappingException;
\r
27 import org.simantics.objmap.graph.annotations.factories.CompoundRelatedGetSetValueRuleFactory;
\r
31 * @author Marko Luukkainen
\r
33 public class CompoundValueAccessor implements IDomainAccessor<Resource,Object> {
\r
35 static Logger LOGGER = Logger.getLogger("org.simantics.objmap");
\r
37 Resource objRelation;
\r
39 Resource valRelation;
\r
41 public CompoundValueAccessor(Resource objRelation, Resource objType, Resource valRelation) {
\r
42 this.objRelation = objRelation;
\r
43 this.objType = objType;
\r
44 this.valRelation = valRelation;
\r
48 public Object get(ReadGraph g, Resource element) throws MappingException {
\r
50 Layer0 l0 = Layer0.getInstance(g);
\r
51 LOGGER.info(" CompoundValueAccessor.get");
\r
52 Collection<Statement> coll = g.getStatements(element, objRelation);
\r
53 Map<String,Object> map = new HashMap<String, Object>();
\r
54 for (Statement c : coll) {
\r
55 String name = g.getRelatedValue(c.getObject(), l0.HasName);
\r
56 if (!map.containsKey(name) || !c.isAsserted(element))
\r
57 map.put(name, g.getRelatedValue(c.getObject(), valRelation));
\r
60 } catch (DatabaseException e) {
\r
61 throw new MappingException(e);
\r
66 public boolean set(WriteGraph g, Resource element, Object v)
\r
67 throws MappingException {
\r
69 Layer0 l0 = Layer0.getInstance(g);
\r
70 LOGGER.info(" CompoundValueAccessor.set");
\r
71 Map<String,Object> values = (Map<String, Object>)v;
\r
73 Collection<Statement> coll = g.getStatements(element, objRelation);
\r
74 Map<String,Statement> stmMap = new HashMap<String, Statement>();
\r
75 Map<String,Object> valueMap = new HashMap<String, Object>();
\r
76 for (Statement c : coll) {
\r
77 String name = g.getRelatedValue(c.getObject(), l0.HasName);
\r
78 if (!stmMap.containsKey(name) || !c.isAsserted(element)) {
\r
79 stmMap.put(name, c);
\r
80 valueMap.put(name, g.getRelatedValue(c.getObject(), valRelation));
\r
83 boolean changed = false;
\r
84 for (String key : values.keySet()) {
\r
85 Object value = values.get(key);
\r
86 if (value.equals(valueMap.get(key)))
\r
89 Statement stm = stmMap.get(key);
\r
90 if (stm == null || stm.isAsserted(element)) {
\r
91 Resource obj = g.newResource();
\r
92 g.claim(obj, l0.InstanceOf, objType);
\r
93 g.claimLiteral(obj, l0.HasName, key);
\r
94 g.claim(element, objRelation, obj);
\r
95 stm = getStatement(g, element, objRelation, obj);
\r
98 Statement valueStatement = g.getPossibleStatement(stm.getObject(), valRelation);
\r
99 Resource valueType = CompoundRelatedGetSetValueRuleFactory.dataTypeOfClass(g, value.getClass());
\r
100 if(valueStatement == null) {
\r
102 Resource valueResource = g.newResource();
\r
103 g.claim(valueResource, Layer0.getInstance(g).InstanceOf, null, valueType);
\r
104 g.claim(stm.getObject(), valRelation, valueResource);
\r
105 g.claimValue(valueResource, value);
\r
109 if (!valueStatement.isAsserted(stm.getObject()))
\r
110 g.claimValue(valueStatement.getObject(), value);
\r
112 Resource valueResource = g.newResource();
\r
113 g.claim(valueResource, Layer0.getInstance(g).InstanceOf, null,
\r
115 g.claim(stm.getObject(), valRelation, valueResource);
\r
116 g.claimValue(valueResource, value);
\r
122 } catch (DatabaseException e) {
\r
123 throw new MappingException(e);
\r
128 private Statement getStatement(ReadGraph g, Resource s, Resource p, Resource o) throws DatabaseException{
\r
129 for (Statement stm : g.getStatements(s, p)) {
\r
130 if (stm.getObject().equals(o))
\r
136 private boolean equals(Object o1, Object o2) {
\r
137 if (o1 instanceof boolean[])
\r
138 Arrays.equals((boolean[])o1,(boolean[])o2);
\r
139 if (o1 instanceof int[])
\r
140 Arrays.equals((int[])o1,(int[])o2);
\r
141 if (o1 instanceof float[])
\r
142 Arrays.equals((float[])o1,(float[])o2);
\r
143 if (o1 instanceof double[])
\r
144 Arrays.equals((double[])o1,(double[])o2);
\r
145 if (o1 instanceof byte[])
\r
146 Arrays.equals((byte[])o1,(byte[])o2);
\r
147 return o1.equals(o2);
\r