--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2013 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.objmap.graph.rules.domain;\r
+\r
+import java.util.Arrays;\r
+import java.util.Collection;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.apache.log4j.Logger;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.Statement;\r
+import org.simantics.db.WriteGraph;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.objmap.exceptions.MappingException;\r
+import org.simantics.objmap.graph.annotations.factories.CompoundRelatedGetSetValueRuleFactory;\r
+\r
+/**\r
+ * \r
+ * @author Marko Luukkainen\r
+ */\r
+public class CompoundValueAccessor implements IDomainAccessor<Resource,Object> {\r
+\r
+ static Logger LOGGER = Logger.getLogger("org.simantics.objmap");\r
+ \r
+ Resource objRelation;\r
+ Resource objType;\r
+ Resource valRelation;\r
+\r
+ public CompoundValueAccessor(Resource objRelation, Resource objType, Resource valRelation) {\r
+ this.objRelation = objRelation;\r
+ this.objType = objType;\r
+ this.valRelation = valRelation;\r
+ }\r
+\r
+ @Override\r
+ public Object get(ReadGraph g, Resource element) throws MappingException {\r
+ try {\r
+ Layer0 l0 = Layer0.getInstance(g);\r
+ LOGGER.info(" CompoundValueAccessor.get");\r
+ Collection<Statement> coll = g.getStatements(element, objRelation);\r
+ Map<String,Object> map = new HashMap<String, Object>();\r
+ for (Statement c : coll) {\r
+ String name = g.getRelatedValue(c.getObject(), l0.HasName);\r
+ if (!map.containsKey(name) || !c.isAsserted(element))\r
+ map.put(name, g.getRelatedValue(c.getObject(), valRelation));\r
+ }\r
+ return map;\r
+ } catch (DatabaseException e) {\r
+ throw new MappingException(e);\r
+ }\r
+ }\r
+ \r
+ @Override\r
+ public boolean set(WriteGraph g, Resource element, Object v)\r
+ throws MappingException {\r
+ try {\r
+ Layer0 l0 = Layer0.getInstance(g);\r
+ LOGGER.info(" CompoundValueAccessor.set");\r
+ @SuppressWarnings("unchecked")\r
+ Map<String,Object> values = (Map<String, Object>)v;\r
+ \r
+ Collection<Statement> coll = g.getStatements(element, objRelation);\r
+ Map<String,Statement> stmMap = new HashMap<String, Statement>();\r
+ Map<String,Object> valueMap = new HashMap<String, Object>();\r
+ for (Statement c : coll) {\r
+ String name = g.getRelatedValue(c.getObject(), l0.HasName);\r
+ if (!stmMap.containsKey(name) || !c.isAsserted(element)) {\r
+ stmMap.put(name, c);\r
+ valueMap.put(name, g.getRelatedValue(c.getObject(), valRelation));\r
+ }\r
+ }\r
+ boolean changed = false;\r
+ for (String key : values.keySet()) {\r
+ Object value = values.get(key);\r
+ if (value.equals(valueMap.get(key)))\r
+ continue;\r
+ changed = true;\r
+ Statement stm = stmMap.get(key);\r
+ if (stm == null || stm.isAsserted(element)) {\r
+ Resource obj = g.newResource();\r
+ g.claim(obj, l0.InstanceOf, objType);\r
+ g.claimLiteral(obj, l0.HasName, key);\r
+ g.claim(element, objRelation, obj);\r
+ stm = getStatement(g, element, objRelation, obj);\r
+ }\r
+ \r
+ Statement valueStatement = g.getPossibleStatement(stm.getObject(), valRelation);\r
+ Resource valueType = CompoundRelatedGetSetValueRuleFactory.dataTypeOfClass(g, value.getClass());\r
+ if(valueStatement == null) {\r
+ \r
+ Resource valueResource = g.newResource();\r
+ g.claim(valueResource, Layer0.getInstance(g).InstanceOf, null, valueType);\r
+ g.claim(stm.getObject(), valRelation, valueResource);\r
+ g.claimValue(valueResource, value); \r
+ } else {\r
+ \r
+ \r
+ if (!valueStatement.isAsserted(stm.getObject()))\r
+ g.claimValue(valueStatement.getObject(), value);\r
+ else {\r
+ Resource valueResource = g.newResource();\r
+ g.claim(valueResource, Layer0.getInstance(g).InstanceOf, null,\r
+ valueType);\r
+ g.claim(stm.getObject(), valRelation, valueResource);\r
+ g.claimValue(valueResource, value);\r
+ }\r
+ }\r
+ }\r
+ return changed;\r
+ \r
+ } catch (DatabaseException e) {\r
+ throw new MappingException(e);\r
+ }\r
+ \r
+ }\r
+ \r
+ private Statement getStatement(ReadGraph g, Resource s, Resource p, Resource o) throws DatabaseException{\r
+ for (Statement stm : g.getStatements(s, p)) {\r
+ if (stm.getObject().equals(o))\r
+ return stm;\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ private boolean equals(Object o1, Object o2) {\r
+ if (o1 instanceof boolean[])\r
+ Arrays.equals((boolean[])o1,(boolean[])o2);\r
+ if (o1 instanceof int[])\r
+ Arrays.equals((int[])o1,(int[])o2);\r
+ if (o1 instanceof float[])\r
+ Arrays.equals((float[])o1,(float[])o2);\r
+ if (o1 instanceof double[])\r
+ Arrays.equals((double[])o1,(double[])o2);\r
+ if (o1 instanceof byte[])\r
+ Arrays.equals((byte[])o1,(byte[])o2);\r
+ return o1.equals(o2);\r
+ \r
+ }\r
+\r
+}\r