]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.objmap2/src/org/simantics/objmap/structural/rules/domain/RelatedObjectAccessor.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.objmap2 / src / org / simantics / objmap / structural / rules / domain / RelatedObjectAccessor.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.structural.rules.domain;\r
13 \r
14 import org.apache.log4j.Logger;\r
15 import org.simantics.db.ReadGraph;\r
16 import org.simantics.db.Resource;\r
17 import org.simantics.db.WriteGraph;\r
18 import org.simantics.db.exception.DatabaseException;\r
19 import org.simantics.objmap.exceptions.MappingException;\r
20 import org.simantics.objmap.graph.rules.domain.IDomainAccessor;\r
21 import org.simantics.objmap.structural.StructuralResource;\r
22 \r
23 \r
24 public class RelatedObjectAccessor implements IDomainAccessor<StructuralResource,StructuralResource> {\r
25 \r
26     static Logger LOGGER = Logger.getLogger("org.simantics.objmap");\r
27     \r
28         Resource relation;\r
29         boolean useTypeResource;\r
30         \r
31         private boolean preventStructuralChanges = true;\r
32         private boolean preventStructuralRootChanges = true;\r
33         \r
34         public RelatedObjectAccessor(Resource relation, boolean useTypeResource) {\r
35                 this.relation = relation;\r
36                 this.useTypeResource = useTypeResource;\r
37         }\r
38         \r
39         public RelatedObjectAccessor(Resource relation, boolean useTypeResource, boolean preventStructuralChanges, boolean preventStructuralRootChanges) {\r
40                 this.relation = relation;\r
41                 this.useTypeResource = useTypeResource;\r
42                 this.preventStructuralChanges = preventStructuralChanges;\r
43                 this.preventStructuralRootChanges = preventStructuralRootChanges;\r
44         }\r
45         \r
46  private boolean preventChange(StructuralResource element) {\r
47         return preventStructuralChanges && element.isStructural() && (!element.isStructuralRoot()||preventStructuralRootChanges);       \r
48     }\r
49 \r
50         @Override\r
51         public StructuralResource get(ReadGraph g, StructuralResource element) throws MappingException {\r
52                 try {\r
53                     LOGGER.info("        RelatedObjectAccessor.get");\r
54                     Resource res = getServiceResource(g, element);\r
55                     if (res == null)\r
56                         return null;\r
57                         Resource r =  g.getPossibleObject(res, relation);\r
58                         if (r == null)\r
59                                 return null;\r
60                         if (StructuralUtils.isStructuralInstance(g, r)) {\r
61                                 return new StructuralResource(g, r, element.getContext(),r);\r
62                         } else {\r
63                                 return new StructuralResource(g, r, element.getContext());\r
64                         }\r
65                 } catch (DatabaseException e) {\r
66                         throw new MappingException(e);\r
67                 }\r
68         }\r
69         \r
70         @Override\r
71         public boolean set(WriteGraph g, StructuralResource selement, StructuralResource value)\r
72                         throws MappingException {\r
73                 try {\r
74                     LOGGER.info("        RelatedObjectAccessor.set");\r
75                     Resource element = getServiceResource(g, selement);\r
76                     if (element == null)\r
77                         return false;\r
78                     Resource resource = g.getPossibleObject(element, relation);\r
79                         if(resource == null) {\r
80                             if(value == null)\r
81                                 return false;\r
82                             if (preventChange(selement))\r
83                                         return false;\r
84                             g.claim(element, relation, value.getResource());\r
85                             return true;\r
86                         }\r
87                         else if(resource.equals(value))\r
88                             return false;\r
89                         else {\r
90                                 if (preventChange(selement))\r
91                                         return false;\r
92                             g.deny(element, relation);\r
93                             if(value != null)\r
94                                 g.claim(element, relation, value.getResource());\r
95                             return true;\r
96                         }\r
97                 } catch (DatabaseException e) {\r
98                         throw new MappingException(e);\r
99                 }\r
100                 \r
101         }\r
102         \r
103                 \r
104         \r
105         private Resource getServiceResource(ReadGraph g, StructuralResource element) {\r
106                 if(!useTypeResource)\r
107                         return element.getResource();\r
108                 return element.getTypeResource();\r
109         }\r
110 \r
111 }\r