]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/services/ComponentNamingUtil.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / services / ComponentNamingUtil.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.services;\r
13 \r
14 import java.util.Collections;\r
15 import java.util.List;\r
16 import java.util.Set;\r
17 \r
18 import org.simantics.databoard.Bindings;\r
19 import org.simantics.databoard.util.URIStringUtils;\r
20 import org.simantics.db.ReadGraph;\r
21 import org.simantics.db.Resource;\r
22 import org.simantics.db.common.primitiverequest.PossibleRelatedValueImplied2;\r
23 import org.simantics.db.common.procedure.adapter.TransientCacheListener;\r
24 import org.simantics.db.common.utils.NameUtils;\r
25 import org.simantics.db.exception.DatabaseException;\r
26 import org.simantics.layer0.Layer0;\r
27 import org.simantics.operation.Layer0X;\r
28 import org.simantics.project.IProject;\r
29 import org.simantics.structural.stubs.StructuralResource2;\r
30 \r
31 /**\r
32  * @author Tuukka Lehtonen\r
33  */\r
34 public final class ComponentNamingUtil {\r
35 \r
36     private final static boolean DEBUG = false;\r
37 \r
38     public static final String validateInstanceName(ReadGraph graph, IProject project, Resource configurationRoot,\r
39             Resource composite, Resource componentType, String proposition, boolean acceptProposition) throws DatabaseException, NamingException {\r
40         if (DEBUG) {\r
41             System.out.println("validateInstanceName(project=" + project + ", configurationRoot=" + configurationRoot\r
42                     + ", composite=" + composite + ", componentType=" + componentType + ", proposition=" + proposition + ")");\r
43             System.out.println("  INVOKED FROM: " + new Exception().getStackTrace()[1].toString());\r
44         }\r
45 \r
46         ComponentNamingStrategy strategy = findNamingStrategy(graph, project, composite);\r
47         if (strategy != null) {\r
48             proposition = strategy.validateInstanceName(graph, configurationRoot, composite, componentType, proposition, acceptProposition);\r
49         }\r
50 \r
51         // As a fallback method, try to deduce the name based on type properties.\r
52         if (proposition == null) {\r
53             proposition = fallbackNameGeneration(graph, composite, componentType);\r
54         }\r
55 \r
56         return proposition;\r
57     }\r
58 \r
59     public static final String validateInstanceName(ReadGraph graph, IProject project, Resource configurationRoot, Resource component, String proposition, boolean acceptProposition) throws DatabaseException, NamingException {\r
60         \r
61         Layer0 L0 = Layer0.getInstance(graph);\r
62         Resource composite = graph.getPossibleObject(component, L0.PartOf);\r
63         \r
64         ComponentNamingStrategy strategy = findNamingStrategy(graph, project, composite);\r
65         if (strategy != null) {\r
66             return strategy.validateInstanceName(graph, configurationRoot, component, proposition, acceptProposition);\r
67         } else {\r
68                 return null;\r
69         }\r
70         \r
71     }\r
72     \r
73     public static final String findFreshInstanceName(ReadGraph graph, IProject project, Resource configurationRoot,\r
74             Resource composite, Resource componentType) throws DatabaseException, NamingException {\r
75 \r
76         String proposition = null;\r
77 \r
78         if (DEBUG) {\r
79             System.out.println("findFreshInstanceName(project=" + project + ", configurationRoot=" + configurationRoot\r
80                     + ", composite=" + composite + ", componentType=" + componentType + ")");\r
81             System.out.println("  INVOKED FROM: " + new Exception().getStackTrace()[1].toString());\r
82         }\r
83 \r
84         ComponentNamingStrategy strategy = findNamingStrategy(graph, project, composite);\r
85         if (strategy != null) {\r
86             proposition = strategy.findFreshInstanceName(graph, configurationRoot, composite, componentType);\r
87         }\r
88 \r
89         // As a fallback method, try to deduce the name based on type properties.\r
90         if (proposition == null) {\r
91             proposition = fallbackNameGeneration(graph, composite, componentType);\r
92         }\r
93 \r
94         return proposition;\r
95     }\r
96 \r
97     public static final String findFreshEscapedInstanceName(ReadGraph graph, IProject project, Resource configurationRoot,\r
98             Resource composite, Resource componentType) throws DatabaseException, NamingException {\r
99         if (DEBUG) {\r
100             System.out.println("findFreshEscapedInstanceName(project=" + project + ", configurationRoot=" + configurationRoot\r
101                     + ", composite=" + composite + ", componentType=" + componentType + ")");\r
102             new Exception("trace").printStackTrace();\r
103         }\r
104         String proposition = findFreshInstanceName(graph, project, configurationRoot, composite, componentType);\r
105         proposition = URIStringUtils.escape(proposition);\r
106         return proposition;\r
107     }\r
108 \r
109     /**\r
110      * @param graph\r
111      * @param project\r
112      * @param configurationRoot\r
113      * @param composite\r
114      * @param componentType\r
115      * @param externallyReserved\r
116      * @return\r
117      * @throws DatabaseException\r
118      * @throws NamingException\r
119      */\r
120     public static final String validateInstanceName(\r
121             ReadGraph graph,\r
122             IProject project,\r
123             Resource configurationRoot,\r
124             Resource composite,\r
125             Resource componentType,\r
126             Set<String> externallyReserved)\r
127                     throws DatabaseException, NamingException\r
128     {\r
129         if (DEBUG) {\r
130             System.out.println("validateInstanceName(project=" + project + ", configurationRoot=" + configurationRoot\r
131                     + ", composite=" + composite + ", componentType=" + componentType + ")");\r
132             System.out.println("  INVOKED FROM: " + new Exception().getStackTrace()[1].toString());\r
133         }\r
134 \r
135         ComponentNamingStrategy strategy = findNamingStrategy(graph, project, composite);\r
136         if (strategy == null)\r
137             throw new NamingException("No naming strategy available, project=" + project + ", composite=" + composite + ", componentType=" + componentType);\r
138 \r
139         String proposition = ComponentNamingUtil.generateProposition(graph, composite, componentType);\r
140         List<String> validated = strategy.validateInstanceNames(graph, configurationRoot, Collections.singletonList(proposition), true, externallyReserved);\r
141         proposition = validated.get(0);\r
142 \r
143         return proposition;\r
144     }\r
145 \r
146     /**\r
147      * @param graph\r
148      * @param project\r
149      * @param configurationRoot\r
150      * @param propositions\r
151      * @param externallyReserved\r
152      * @return\r
153      * @throws DatabaseException\r
154      * @throws NamingException\r
155      */\r
156     public static final List<String> validateInstanceNames(\r
157             ReadGraph graph,\r
158             IProject project,\r
159             Resource configurationRoot,\r
160             List<String> propositions,\r
161             boolean acceptProposition,\r
162             Set<String> externallyReserved)\r
163                     throws DatabaseException, NamingException\r
164     {\r
165         ComponentNamingStrategy strategy = findNamingStrategy(graph, project, configurationRoot);\r
166         if (strategy == null)\r
167             throw new NamingException("No naming strategy available, project=" + project);\r
168         return strategy.validateInstanceNames(graph, configurationRoot, propositions, acceptProposition, externallyReserved);\r
169     }\r
170 \r
171     /**\r
172      * This is a fallback name generation method that deduces propositions\r
173      * container-locally based on component type prefixes or names.\r
174      * \r
175      * @param graph\r
176      * @param composite\r
177      * @param componentType\r
178      * @return\r
179      * @throws DatabaseException\r
180      */\r
181     private static String fallbackNameGeneration(ReadGraph graph, Resource container, Resource componentType)\r
182             throws DatabaseException {\r
183         return NameUtils.findFreshName(graph, generateProposition(graph, container, componentType), container);\r
184     }\r
185 \r
186     public static String generateProposition(ReadGraph graph, String containerGeneratedNamePrefix, Resource componentType) throws DatabaseException {\r
187         Layer0X L0X = Layer0X.getInstance(graph);\r
188         StringBuilder proposition = new StringBuilder();\r
189         if (containerGeneratedNamePrefix != null)\r
190             proposition.append(containerGeneratedNamePrefix);\r
191         String componentPrefix = graph.getPossibleRelatedValue(componentType, L0X.HasGeneratedNamePrefix, Bindings.STRING);\r
192         if (componentPrefix == null) {\r
193             Layer0 L0 = Layer0.getInstance(graph);\r
194             componentPrefix = graph.getPossibleRelatedValue(componentType, L0.HasName);\r
195             if (componentPrefix == null)\r
196                 componentPrefix = "Entity";\r
197         }\r
198         proposition.append(componentPrefix);\r
199         return proposition.toString();\r
200     }\r
201 \r
202     public static String generateProposition(ReadGraph graph, Resource container, Resource componentType) throws DatabaseException {\r
203         Layer0X L0X = Layer0X.getInstance(graph);\r
204         String containerPrefix = graph.getPossibleRelatedValue(container, L0X.HasGeneratedNamePrefix, Bindings.STRING);\r
205         return generateProposition(graph, containerPrefix != null ? containerPrefix : "", componentType);\r
206     }\r
207 \r
208     public static final ComponentNamingStrategy findNamingStrategy(ReadGraph graph, IProject project, Resource composite) throws DatabaseException {\r
209         // Primarily, use naming function from composite\r
210         ComponentNamingStrategy strategy = graph.syncRequest(\r
211                 new PossibleRelatedValueImplied2<ComponentNamingStrategy>(composite, StructuralResource2.getInstance(graph).Composite_namingFunction),\r
212                 TransientCacheListener.<ComponentNamingStrategy>instance());\r
213         if (strategy == null && project != null) {\r
214             // If not available, try to find ComponentNamingStrategy for project\r
215             strategy = project.getHint(ComponentNamingStrategy.PROJECT_KEY);\r
216         }\r
217         return strategy;\r
218     }\r
219 \r
220 }\r