]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/mapping/ElementCopyAdvisor.java
Sync git svn branch with SVN repository r33158.
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / mapping / ElementCopyAdvisor.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 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.modeling.mapping;\r
13 \r
14 import gnu.trove.map.hash.THashMap;\r
15 \r
16 import java.util.Map;\r
17 \r
18 import org.simantics.db.ReadGraph;\r
19 import org.simantics.db.Resource;\r
20 import org.simantics.db.Statement;\r
21 import org.simantics.db.WriteGraph;\r
22 import org.simantics.db.common.utils.NameUtils;\r
23 import org.simantics.db.common.utils.OrderedSetUtils;\r
24 import org.simantics.db.exception.CancelTransactionException;\r
25 import org.simantics.db.exception.DatabaseException;\r
26 import org.simantics.db.layer0.request.PossibleModel;\r
27 import org.simantics.diagram.stubs.DiagramResource;\r
28 import org.simantics.diagram.stubs.G2DResource;\r
29 import org.simantics.diagram.synchronization.ISynchronizationContext;\r
30 import org.simantics.diagram.synchronization.StatementEvaluation;\r
31 import org.simantics.diagram.synchronization.graph.BasicResources;\r
32 import org.simantics.diagram.synchronization.graph.CopyAdvisorUtil;\r
33 import org.simantics.diagram.synchronization.graph.GraphCopyAdvisor;\r
34 import org.simantics.diagram.synchronization.graph.GraphSynchronizationHints;\r
35 import org.simantics.layer0.Layer0;\r
36 import org.simantics.utils.datastructures.BinaryFunction;\r
37 \r
38 /**\r
39  * @author Tuukka Lehtonen\r
40  */\r
41 public class ElementCopyAdvisor extends GraphCopyAdvisor {\r
42 \r
43     G2DResource G2D;\r
44     DiagramResource DIA;\r
45 \r
46     /**\r
47      * This is necessary to have DIA.Flag type copied over to the copied flag.\r
48      * Diagram mapping will have problems and potentially break the\r
49      * configuration if the type is not the same as in the source.\r
50      */\r
51     BinaryFunction<StatementEvaluation, ReadGraph, Statement> statementAdvisor =\r
52             new BinaryFunction<StatementEvaluation, ReadGraph, Statement>() {\r
53         @Override\r
54         public StatementEvaluation call(ReadGraph graph, Statement stm) {\r
55             if (DIA.HasFlagType.equals(stm.getPredicate()))\r
56                 return StatementEvaluation.INCLUDE;\r
57             if (G2D.HasFontStyle.equals(stm.getPredicate()))\r
58                 return StatementEvaluation.INCLUDE;\r
59             return StatementEvaluation.USE_DEFAULT;\r
60         }\r
61     };\r
62 \r
63     @Override\r
64     public Evaluation canCopy(ISynchronizationContext context, WriteGraph graph, Resource source, Resource sourcecontainer, Resource targetContainer) throws DatabaseException {\r
65         BasicResources br = context.get(GraphSynchronizationHints.BASIC_RESOURCES);\r
66         return graph.isInstanceOf(source, br.DIA.Element) ? Evaluation.SUPPORTED : Evaluation.NOT_SUPPORTED;\r
67     }\r
68 \r
69     @Override\r
70     public Object copy(ISynchronizationContext context, WriteGraph graph, Resource source, Resource sourceContainer, Resource targetContainer) throws DatabaseException {\r
71         return copy(context, graph, source, sourceContainer, targetContainer, new THashMap<Object, Object>());\r
72     }\r
73 \r
74     @Override\r
75     public Object copy(ISynchronizationContext context, WriteGraph graph, Resource source, Resource sourceContainer,\r
76             Resource targetContainer, Map<Object, Object> map) throws DatabaseException {\r
77         Resource model = graph.syncRequest(new PossibleModel(targetContainer));\r
78         //if (model == null)\r
79         //    throw new IllegalArgumentException("no model found for copy target container " + NameUtils.getSafeName(graph, targetContainer, true));\r
80 \r
81         Layer0 L0 = Layer0.getInstance(graph);\r
82         G2D = G2DResource.getInstance(graph);\r
83         DIA = DiagramResource.getInstance(graph);\r
84 \r
85         Resource copy = (model != null) ?\r
86                 CopyAdvisorUtil.copy3(graph, source, model, statementAdvisor, map) :\r
87                     CopyAdvisorUtil.copy2(graph, source, statementAdvisor, map);\r
88 \r
89         if (graph.hasStatement(sourceContainer, L0.ConsistsOf, source))\r
90             graph.claim(targetContainer, L0.ConsistsOf, copy);\r
91 \r
92         return copy;\r
93     }\r
94 \r
95     @Override\r
96     public Object cut(ISynchronizationContext context, WriteGraph graph, Resource source, Resource sourceContainer,\r
97             Resource targetContainer) throws DatabaseException {\r
98 \r
99         Layer0 L0 = Layer0.getInstance(graph);\r
100         DiagramResource DIA = DiagramResource.getInstance(graph);\r
101 \r
102         if (sourceContainer.equals(targetContainer))\r
103             return null;\r
104 \r
105         // disconnect from source diagram\r
106         if (!OrderedSetUtils.remove(graph, sourceContainer, source))\r
107             // Unlink failed for some reason.\r
108             throw new CancelTransactionException("Failed to unlink element "\r
109                     + NameUtils.getSafeName(graph, source) + " from source diagram "\r
110                     + NameUtils.getSafeName(graph, sourceContainer));\r
111 \r
112         // connect to target diagram\r
113         boolean prepend = graph.isInstanceOf(source, DIA.Connection);\r
114         boolean add = true;\r
115         if (prepend)\r
116             add = OrderedSetUtils.addFirst(graph, targetContainer, source);\r
117         else\r
118             add = OrderedSetUtils.add(graph, targetContainer, source);\r
119         if (!add)\r
120             // Link failed for some reason.\r
121             throw new CancelTransactionException("Failed to link element "\r
122                     + NameUtils.getSafeName(graph, source) + " to target diagram "\r
123                     + NameUtils.getSafeName(graph, targetContainer));\r
124 \r
125         // This handles e.g. connections, which are not part of container\r
126         if(graph.hasStatement(sourceContainer, L0.ConsistsOf, source)) {\r
127             graph.deny(sourceContainer, L0.ConsistsOf, source);\r
128             graph.claim(targetContainer, L0.ConsistsOf, source);\r
129         }\r
130 \r
131         return source;\r
132     }\r
133 \r
134 }\r