1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.modeling.services;
14 import java.util.Collections;
15 import java.util.List;
18 import org.simantics.databoard.Bindings;
19 import org.simantics.databoard.util.URIStringUtils;
20 import org.simantics.db.ReadGraph;
21 import org.simantics.db.Resource;
22 import org.simantics.db.common.primitiverequest.PossibleRelatedValueImplied2;
23 import org.simantics.db.common.procedure.adapter.TransientCacheListener;
24 import org.simantics.db.common.utils.NameUtils;
25 import org.simantics.db.common.utils.Versions;
26 import org.simantics.db.exception.DatabaseException;
27 import org.simantics.layer0.Layer0;
28 import org.simantics.operation.Layer0X;
29 import org.simantics.project.IProject;
30 import org.simantics.structural.stubs.StructuralResource2;
33 * @author Tuukka Lehtonen
35 public final class ComponentNamingUtil {
37 private final static boolean DEBUG = false;
39 public static final String validateInstanceName(ReadGraph graph, IProject project, Resource configurationRoot,
40 Resource composite, Resource componentType, String proposition, boolean acceptProposition) throws DatabaseException, NamingException {
42 System.out.println("validateInstanceName(project=" + project + ", configurationRoot=" + configurationRoot
43 + ", composite=" + composite + ", componentType=" + componentType + ", proposition=" + proposition + ")");
44 System.out.println(" INVOKED FROM: " + new Exception().getStackTrace()[1].toString());
47 ComponentNamingStrategy strategy = findNamingStrategy(graph, project, composite);
48 if (strategy != null) {
49 proposition = strategy.validateInstanceName(graph, configurationRoot, composite, componentType, proposition, acceptProposition);
52 // As a fallback method, try to deduce the name based on type properties.
53 if (proposition == null) {
54 proposition = fallbackNameGeneration(graph, composite, componentType);
60 public static final String validateInstanceName(ReadGraph graph, IProject project, Resource configurationRoot, Resource component, String proposition, boolean acceptProposition) throws DatabaseException, NamingException {
62 Layer0 L0 = Layer0.getInstance(graph);
63 Resource composite = graph.getPossibleObject(component, L0.PartOf);
65 ComponentNamingStrategy strategy = findNamingStrategy(graph, project, composite);
66 if (strategy != null) {
67 return strategy.validateInstanceName(graph, configurationRoot, component, proposition, acceptProposition);
74 public static final String findFreshInstanceName(ReadGraph graph, IProject project, Resource configurationRoot,
75 Resource composite, Resource componentType) throws DatabaseException, NamingException {
77 String proposition = null;
80 System.out.println("findFreshInstanceName(project=" + project + ", configurationRoot=" + configurationRoot
81 + ", composite=" + composite + ", componentType=" + componentType + ")");
82 System.out.println(" INVOKED FROM: " + new Exception().getStackTrace()[1].toString());
85 ComponentNamingStrategy strategy = findNamingStrategy(graph, project, composite);
86 if (strategy != null) {
87 proposition = strategy.findFreshInstanceName(graph, configurationRoot, composite, componentType);
90 // As a fallback method, try to deduce the name based on type properties.
91 if (proposition == null) {
92 proposition = fallbackNameGeneration(graph, composite, componentType);
98 public static final String findFreshEscapedInstanceName(ReadGraph graph, IProject project, Resource configurationRoot,
99 Resource composite, Resource componentType) throws DatabaseException, NamingException {
101 System.out.println("findFreshEscapedInstanceName(project=" + project + ", configurationRoot=" + configurationRoot
102 + ", composite=" + composite + ", componentType=" + componentType + ")");
103 new Exception("trace").printStackTrace();
105 String proposition = findFreshInstanceName(graph, project, configurationRoot, composite, componentType);
106 proposition = URIStringUtils.escape(proposition);
113 * @param configurationRoot
115 * @param componentType
116 * @param externallyReserved
118 * @throws DatabaseException
119 * @throws NamingException
121 public static final String validateInstanceName(
124 Resource configurationRoot,
126 Resource componentType,
127 Set<String> externallyReserved)
128 throws DatabaseException, NamingException
131 System.out.println("validateInstanceName(project=" + project + ", configurationRoot=" + configurationRoot
132 + ", composite=" + composite + ", componentType=" + componentType + ")");
133 System.out.println(" INVOKED FROM: " + new Exception().getStackTrace()[1].toString());
136 ComponentNamingStrategy strategy = findNamingStrategy(graph, project, composite);
137 if (strategy == null)
138 throw new NamingException("No naming strategy available, project=" + project + ", composite=" + composite + ", componentType=" + componentType);
140 String proposition = ComponentNamingUtil.generateProposition(graph, composite, componentType);
141 List<String> validated = strategy.validateInstanceNames(graph, configurationRoot, Collections.singletonList(proposition), true, externallyReserved);
142 proposition = validated.get(0);
150 * @param configurationRoot
151 * @param propositions
152 * @param externallyReserved
154 * @throws DatabaseException
155 * @throws NamingException
157 public static final List<String> validateInstanceNames(
160 Resource configurationRoot,
161 List<String> propositions,
162 boolean acceptProposition,
163 Set<String> externallyReserved)
164 throws DatabaseException, NamingException
166 ComponentNamingStrategy strategy = findNamingStrategy(graph, project, configurationRoot);
167 if (strategy == null)
168 throw new NamingException("No naming strategy available, project=" + project);
169 return strategy.validateInstanceNames(graph, configurationRoot, propositions, acceptProposition, externallyReserved);
173 * This is a fallback name generation method that deduces propositions
174 * container-locally based on component type prefixes or names.
178 * @param componentType
180 * @throws DatabaseException
182 private static String fallbackNameGeneration(ReadGraph graph, Resource container, Resource componentType)
183 throws DatabaseException {
184 return NameUtils.findFreshName(graph, generateProposition(graph, container, componentType), container);
187 public static String generateProposition(ReadGraph graph, String containerGeneratedNamePrefix, Resource componentType) throws DatabaseException {
188 Layer0X L0X = Layer0X.getInstance(graph);
189 StringBuilder proposition = new StringBuilder();
190 if (containerGeneratedNamePrefix != null)
191 proposition.append(containerGeneratedNamePrefix);
192 String componentPrefix = graph.getPossibleRelatedValue(componentType, L0X.HasGeneratedNamePrefix, Bindings.STRING);
193 if (componentPrefix == null || "".equals(componentPrefix)) {
194 Layer0 L0 = Layer0.getInstance(graph);
195 String name = graph.getPossibleRelatedValue(componentType, L0.HasName);
197 componentPrefix = "Entity";
199 componentPrefix = Versions.getBaseName(name);
201 proposition.append(componentPrefix);
202 return proposition.toString();
205 public static String generateProposition(ReadGraph graph, Resource container, Resource componentType) throws DatabaseException {
206 Layer0X L0X = Layer0X.getInstance(graph);
207 String containerPrefix = graph.getPossibleRelatedValue(container, L0X.HasGeneratedNamePrefix, Bindings.STRING);
208 return generateProposition(graph, containerPrefix != null ? containerPrefix : "", componentType);
211 public static final ComponentNamingStrategy findNamingStrategy(ReadGraph graph, IProject project, Resource composite) throws DatabaseException {
212 // Primarily, use naming function from composite
213 ComponentNamingStrategy strategy = graph.syncRequest(
214 new PossibleRelatedValueImplied2<ComponentNamingStrategy>(composite, StructuralResource2.getInstance(graph).Composite_namingFunction),
215 TransientCacheListener.<ComponentNamingStrategy>instance());
216 if (strategy == null && project != null) {
217 // If not available, try to find ComponentNamingStrategy for project
218 strategy = project.getHint(ComponentNamingStrategy.PROJECT_KEY);