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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.modeling.services;
\r
14 import java.util.Collections;
\r
15 import java.util.List;
\r
16 import java.util.Set;
\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
32 * @author Tuukka Lehtonen
\r
34 public final class ComponentNamingUtil {
\r
36 private final static boolean DEBUG = false;
\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
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
46 ComponentNamingStrategy strategy = findNamingStrategy(graph, project, composite);
\r
47 if (strategy != null) {
\r
48 proposition = strategy.validateInstanceName(graph, configurationRoot, composite, componentType, proposition, acceptProposition);
\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
59 public static final String validateInstanceName(ReadGraph graph, IProject project, Resource configurationRoot, Resource component, String proposition, boolean acceptProposition) throws DatabaseException, NamingException {
\r
61 Layer0 L0 = Layer0.getInstance(graph);
\r
62 Resource composite = graph.getPossibleObject(component, L0.PartOf);
\r
64 ComponentNamingStrategy strategy = findNamingStrategy(graph, project, composite);
\r
65 if (strategy != null) {
\r
66 return strategy.validateInstanceName(graph, configurationRoot, component, proposition, acceptProposition);
\r
73 public static final String findFreshInstanceName(ReadGraph graph, IProject project, Resource configurationRoot,
\r
74 Resource composite, Resource componentType) throws DatabaseException, NamingException {
\r
76 String proposition = null;
\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
84 ComponentNamingStrategy strategy = findNamingStrategy(graph, project, composite);
\r
85 if (strategy != null) {
\r
86 proposition = strategy.findFreshInstanceName(graph, configurationRoot, composite, componentType);
\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
97 public static final String findFreshEscapedInstanceName(ReadGraph graph, IProject project, Resource configurationRoot,
\r
98 Resource composite, Resource componentType) throws DatabaseException, NamingException {
\r
100 System.out.println("findFreshEscapedInstanceName(project=" + project + ", configurationRoot=" + configurationRoot
\r
101 + ", composite=" + composite + ", componentType=" + componentType + ")");
\r
102 new Exception("trace").printStackTrace();
\r
104 String proposition = findFreshInstanceName(graph, project, configurationRoot, composite, componentType);
\r
105 proposition = URIStringUtils.escape(proposition);
\r
106 return proposition;
\r
112 * @param configurationRoot
\r
114 * @param componentType
\r
115 * @param externallyReserved
\r
117 * @throws DatabaseException
\r
118 * @throws NamingException
\r
120 public static final String validateInstanceName(
\r
123 Resource configurationRoot,
\r
124 Resource composite,
\r
125 Resource componentType,
\r
126 Set<String> externallyReserved)
\r
127 throws DatabaseException, NamingException
\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
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
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
143 return proposition;
\r
149 * @param configurationRoot
\r
150 * @param propositions
\r
151 * @param externallyReserved
\r
153 * @throws DatabaseException
\r
154 * @throws NamingException
\r
156 public static final List<String> validateInstanceNames(
\r
159 Resource configurationRoot,
\r
160 List<String> propositions,
\r
161 boolean acceptProposition,
\r
162 Set<String> externallyReserved)
\r
163 throws DatabaseException, NamingException
\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
172 * This is a fallback name generation method that deduces propositions
\r
173 * container-locally based on component type prefixes or names.
\r
177 * @param componentType
\r
179 * @throws DatabaseException
\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
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
198 proposition.append(componentPrefix);
\r
199 return proposition.toString();
\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
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