Bug 531137 - Take consideration of Vocabulary definitions in the
generated resource classes

For a Resource that define a "describes" attribute pointing to an
rdfs:class, the rdf:type of the Resource should point to that rdfs:class
(change annotations to be based on the Vocabulary properties, and not
the Domain properties.)

Similarly for a ResourceProperty that defines a "propertyDefinition".

This patch also deals with Bug 530292 (generated
OslcDomainsConstants.java should use the same names (and naming
conventions) as OSLC4J OslcConstants.java)


Change-Id: I6e66eec25c3b338ca88d0d85d7d086d3cf98ddb5
Signed-off-by: Jad El-khoury <jad@kth.se>
diff --git a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateDomainSpecificationConstants.mtl b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateDomainSpecificationConstants.mtl
index aa4efe8..ee52fb0 100644
--- a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateDomainSpecificationConstants.mtl
+++ b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateDomainSpecificationConstants.mtl
@@ -22,18 +22,36 @@
  *******************************************************************************/
 /]
 
-[module generateDomainSpecificationConstants('http://org.eclipse.lyo/oslc4j/adaptorInterface')]
+[module generateDomainSpecificationConstants('http://org.eclipse.lyo/oslc4j/adaptorInterface', 'http://org.eclipse.lyo/oslc4j/vocabulary')]
 
 [import org::eclipse::lyo::oslc4j::codegenerator::services::services/]
 [import org::eclipse::lyo::oslc4j::codegenerator::services::serviceServices/]
 [import org::eclipse::lyo::oslc4j::codegenerator::services::resourceServices/]
 [import org::eclipse::lyo::oslc4j::codegenerator::services::adaptorInterfaceServices/]
 [import org::eclipse::lyo::oslc4j::codegenerator::services::domainSpecificationServices/]
+[import org::eclipse::lyo::oslc4j::codegenerator::services::vocabularyServices/]
+
+[query public resourceTypeNamespace(aResource: Resource) : String =
+(if (aResource.describes.oclIsUndefined()) then
+    domainSpecificationNamespaceConstantName(aResource.definingDomainSpecification())
+else
+    javaInterfaceNameForConstants(aResource.describes.definingVocabulary()).concat('.').concat(vocabularyNamespaceConstantName(aResource.describes.definingVocabulary()))
+endif)
+/]
+
+[query public resourceTypeLocalName(aResource: Resource) : String =
+(if (aResource.describes.oclIsUndefined()) then
+    '"'.concat(aResource.javaName(true)).concat('"')
+else
+	'"'.concat(aResource.describes.javaName(true)).concat('"')
+endif)
+/]
 
 [template public generateResourceConstants(aResource : Resource)]
-public static String [resourceConstantName(aResource)/] = "[aResource.javaName(true)/]";
 public static String [resourcePathConstantName(aResource)/] = "[aResource.javaName(false)/]";
-public static String [resourceTypeConstantName(aResource)/] = [domainSpecificationNamespaceConstantName(aResource.definingDomainSpecification())/] + [resourceConstantName(aResource)/];
+public static String [resourceTypeNamespaceConstantName(aResource)/] = [resourceTypeNamespace(aResource)/]; //namespace of the rdfs:class the resource describes
+public static String [resourceTypeLocalNameConstantName(aResource)/] = [resourceTypeLocalName(aResource)/]; //localName of the rdfs:class the resource describes
+public static String [resourceTypeConstantName(aResource)/] = [resourceTypeNamespaceConstantName(aResource)/] + [resourceTypeLocalNameConstantName(aResource)/]; //fullname of the rdfs:class the resource describes
 [/template]
 
 [template public generateDomainSpecificationConstants(aDomainSpecification: DomainSpecification, anAdaptorInterface : AdaptorInterface, defaultJavaFilesPath : String, defaultJavaClassPackageName : String)]
@@ -66,6 +84,7 @@
 package [javaInterfacePackageNameForConstants(aDomainSpecification, anAdaptorInterface, defaultJavaClassPackageName) /];
 
 import org.eclipse.lyo.oslc4j.core.model.OslcConstants;
+[for (aVocabulary: Vocabulary | relevantVocabularies(aDomainSpecification)->sortedBy(label)) separator(lineSeparator())]import [javaInterfaceFullNameForConstants(aVocabulary, anAdaptorInterface, defaultJavaClassPackageName) /];[/for]
 
 // [protected ('imports')]
 // [/protected]
diff --git a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateResource.mtl b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateResource.mtl
index bfdfcdb..fe2a7ed 100644
--- a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateResource.mtl
+++ b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateResource.mtl
@@ -169,9 +169,9 @@
 [template public generateClassAnnotations(aResource : Resource, contextAdaptorInterface : AdaptorInterface)]
 // [protected ('classAnnotations')]
 // [/protected]
-@OslcNamespace([javaInterfaceNameForConstants(aResource.definingDomainSpecification())/].[domainSpecificationNamespaceConstantName(aResource.definingDomainSpecification()) /])
-@OslcName([javaInterfaceNameForConstants(aResource.definingDomainSpecification())/].[resourceConstantName(aResource) /])
-@OslcResourceShape(title = "[aResource.name /] Resource Shape", describes = [javaInterfaceNameForConstants(aResource.definingDomainSpecification())/].[resourceTypeConstantName(aResource) /])
+[namespaceAnnotation(aResource)/]
+[nameAnnotation(aResource)/]
+[resourceShapeAnnotation(aResource)/]
 [/template]
 
 [template public generateClassDeclaration(aResource : Resource, contextAdaptorInterface : AdaptorInterface)]
diff --git a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateResourceInterface.mtl b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateResourceInterface.mtl
index 6078b9a..c669528 100644
--- a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateResourceInterface.mtl
+++ b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateResourceInterface.mtl
@@ -112,9 +112,9 @@
 // [protected ('imports')]
 // [/protected]
 
-@OslcNamespace([javaInterfaceNameForConstants(aResource.definingDomainSpecification())/].[domainSpecificationNamespaceConstantName(aResource.definingDomainSpecification()) /])
-@OslcName([javaInterfaceNameForConstants(aResource.definingDomainSpecification())/].[resourceConstantName(aResource) /])
-@OslcResourceShape(title = "[aResource.name /] Resource Shape", describes = [javaInterfaceNameForConstants(aResource.definingDomainSpecification())/].[resourceTypeConstantName(aResource) /])
+[namespaceAnnotation(aResource)/]
+[nameAnnotation(aResource)/]
+[resourceShapeAnnotation(aResource)/]
 public interface [javaInterfaceName(aResource) /]
 {
 
diff --git a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateVocabularyConstants.mtl b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateVocabularyConstants.mtl
new file mode 100644
index 0000000..c88c2da
--- /dev/null
+++ b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateVocabularyConstants.mtl
@@ -0,0 +1,75 @@
+[comment encoding = UTF-8 /]
+[comment
+/*******************************************************************************
+ * Copyright (c) 2018 Jad El-khoury.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Eclipse Distribution License v. 1.0 which accompanies this distribution.
+ *  
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *
+ *     Jad El-khoury        - initial implementation
+ *******************************************************************************/
+/]
+
+[module generateVocabularyConstants('http://org.eclipse.lyo/oslc4j/adaptorInterface', 'http://org.eclipse.lyo/oslc4j/vocabulary')]
+
+[import org::eclipse::lyo::oslc4j::codegenerator::services::services/]
+[import org::eclipse::lyo::oslc4j::codegenerator::services::serviceServices/]
+[import org::eclipse::lyo::oslc4j::codegenerator::services::resourceServices/]
+[import org::eclipse::lyo::oslc4j::codegenerator::services::adaptorInterfaceServices/]
+[import org::eclipse::lyo::oslc4j::codegenerator::services::vocabularyServices/]
+
+[template public generateClassConstants(aClass : Class)]
+public static String [classConstantName(aClass)/] = "[aClass.javaName(true)/]";
+public static String [classTypeConstantName(aClass)/] = [vocabularyNamespaceConstantName(aClass.definingVocabulary())/] + [classConstantName(aClass)/];
+[/template]
+
+[template public generateVocabularyConstants(aVocabulary: Vocabulary, anAdaptorInterface : AdaptorInterface, defaultJavaFilesPath : String, defaultJavaClassPackageName : String)]
+[file (javaInterfaceFullFileNameForConstants(aVocabulary, anAdaptorInterface, defaultJavaFilesPath, defaultJavaClassPackageName), false, 'UTF-8')]
+// [protected ('Copyright')]
+/*******************************************************************************
+ * Copyright (c) 2018 Jad El-khoury.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Eclipse Distribution License v. 1.0 which accompanies this distribution.
+ *  
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *
+ *     Jad El-khoury        initial implementation
+ * 
+ * This file is generated by org.eclipse.lyo.oslc4j.codegenerator
+ *******************************************************************************/
+// [/protected]
+
+package [javaInterfacePackageNameForConstants(aVocabulary, anAdaptorInterface, defaultJavaClassPackageName) /];
+
+import org.eclipse.lyo.oslc4j.core.model.OslcConstants;
+
+// [protected ('imports')]
+// [/protected]
+
+public interface [javaInterfaceNameForConstants(aVocabulary) /]
+{
+    // [protected ('user constants')]
+    // [/protected]
+
+    public static String [vocabularyNamespaceConstantName(aVocabulary)/] = "[aVocabulary.namespaceURI/]";
+    public static String [vocabularyPreferredNamespacePrefixConstantName(aVocabulary)/] = "[aVocabulary.preferredNamespacePrefix/]";
+
+    [for (aClass: Class | aVocabulary.classes->sortedBy(name))]
+    [generateClassConstants(aClass) /]
+    [/for]
+}
+[/file]
+[/template]
diff --git a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/main/generate.mtl b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/main/generate.mtl
index e0999c6..9dfefc1 100644
--- a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/main/generate.mtl
+++ b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/main/generate.mtl
@@ -20,12 +20,13 @@
  *******************************************************************************/
 /]
 
-[module generate('http://org.eclipse.lyo/oslc4j/adaptorInterface')]
+[module generate('http://org.eclipse.lyo/oslc4j/adaptorInterface', 'http://org.eclipse.lyo/oslc4j/vocabulary')]
 
 [import org::eclipse::lyo::oslc4j::codegenerator::services::services/]
 [import org::eclipse::lyo::oslc4j::codegenerator::services::resourceServices/]
 [import org::eclipse::lyo::oslc4j::codegenerator::services::resourcePropertyServices/]
 [import org::eclipse::lyo::oslc4j::codegenerator::services::adaptorInterfaceServices/]
+[import org::eclipse::lyo::oslc4j::codegenerator::services::vocabularyServices/]
 
 [import org::eclipse::lyo::oslc4j::codegenerator::files::generateServiceProviderCatalogService/]
 [import org::eclipse::lyo::oslc4j::codegenerator::files::generateServiceProviderCatalogSingleton/]
@@ -37,6 +38,7 @@
 [import org::eclipse::lyo::oslc4j::codegenerator::files::generateClientOnlyMainApplication/]
 [import org::eclipse::lyo::oslc4j::codegenerator::files::generateAdaptorPackageInfo/]
 [import org::eclipse::lyo::oslc4j::codegenerator::files::generateDomainSpecificationConstants/]
+[import org::eclipse::lyo::oslc4j::codegenerator::files::generateVocabularyConstants/]
 [import org::eclipse::lyo::oslc4j::codegenerator::files::generateAdaptorConstants/]
 [import org::eclipse::lyo::oslc4j::codegenerator::files::generateServiceProviderService/]
 [import org::eclipse::lyo::oslc4j::codegenerator::files::generateServiceProviderInfo/]
@@ -95,6 +97,12 @@
 [/for]
 [/template]
 
+[template public generateForRelevantVocabularies(anAdaptorInterface : AdaptorInterface)]
+[for (aVocabulary: Vocabulary | relevantVocabularies(anAdaptorInterface))]
+    [aVocabulary.generateVocabularyConstants(anAdaptorInterface, null, null)/]
+[/for]
+[/template]
+
 [template public generateForRelevantResources(anAdaptorInterface : AdaptorInterface)]
 [for (aResource: Resource | relevantResources(anAdaptorInterface))]
     [aResource.generateResource(anAdaptorInterface, null, null) /]
@@ -172,6 +180,7 @@
     [generateClientOnlyMainApplication(anAdaptorInterface)/]
 [/if]
 [generateForRelevantDomainSpecifications(anAdaptorInterface)/]
+[generateForRelevantVocabularies(anAdaptorInterface)/]
 [generateForRelevantResources(anAdaptorInterface)/]
 [generateForRequiredAdaptors(anAdaptorInterface)/]
 [/template]
diff --git a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/main/generateSpecification.mtl b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/main/generateSpecification.mtl
index 1740be9..edcecb6 100644
--- a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/main/generateSpecification.mtl
+++ b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/main/generateSpecification.mtl
@@ -17,15 +17,17 @@
  *******************************************************************************/
 /]
 
-[module generateSpecification('http://org.eclipse.lyo/oslc4j/adaptorInterface')]
+[module generateSpecification('http://org.eclipse.lyo/oslc4j/adaptorInterface', 'http://org.eclipse.lyo/oslc4j/vocabulary')]
 
 [import org::eclipse::lyo::oslc4j::codegenerator::services::services/]
 [import org::eclipse::lyo::oslc4j::codegenerator::services::resourceServices/]
 [import org::eclipse::lyo::oslc4j::codegenerator::services::domainSpecificationServices/]
+[import org::eclipse::lyo::oslc4j::codegenerator::services::vocabularyServices/]
 [import org::eclipse::lyo::oslc4j::codegenerator::services::resourcePropertyServices/]
 [import org::eclipse::lyo::oslc4j::codegenerator::services::adaptorInterfaceServices/]
 
 [import org::eclipse::lyo::oslc4j::codegenerator::files::generateDomainSpecificationConstants/]
+[import org::eclipse::lyo::oslc4j::codegenerator::files::generateVocabularyConstants/]
 [import org::eclipse::lyo::oslc4j::codegenerator::files::generateResource/]
 [import org::eclipse::lyo::oslc4j::codegenerator::files::generateResourceInterface/]
 [import org::eclipse::lyo::oslc4j::codegenerator::staticFiles::generateLicenseFiles/]
@@ -47,6 +49,12 @@
 relevantResources(aSpecification)->collectNested(aResource : Resource | aResource.definingDomainSpecification())->flatten()->asSet()
 /]
 
+[query public relevantVocabularies(aSpecification : Specification) : Set(Vocabulary) =
+relevantDomainSpecifications(aSpecification)->collectNested(aDomainSpecification : DomainSpecification | 
+	relevantVocabularies(aDomainSpecification)
+)->flatten()->asSet()
+/]
+
 [template public generateSpecification(aSpecification : Specification)]
 [comment @main/]
 [if (canGenerate(aSpecification))]
@@ -54,6 +62,10 @@
     [for (aDomainSpecification: DomainSpecification | aSpecification.relevantDomainSpecifications())]
         [aDomainSpecification.generateDomainSpecificationConstants(null, aSpecification.generationSetting.javaFilesPath, aSpecification.generationSetting.javaClassPackageName)/]
     [/for]
+
+    [for (aVocabulary: Vocabulary | aSpecification.relevantVocabularies())]
+        [aVocabulary.generateVocabularyConstants(null, aSpecification.generationSetting.javaFilesPath, aSpecification.generationSetting.javaClassPackageName)/]
+    [/for]
     
     [for (aResource: Resource | aSpecification.relevantResources())]
         [aResource.generateResource(null, aSpecification.generationSetting.javaFilesPath, aSpecification.generationSetting.javaClassPackageName) /]
diff --git a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/adaptorInterfaceServices.mtl b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/adaptorInterfaceServices.mtl
index deafb03..771cab3 100644
--- a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/adaptorInterfaceServices.mtl
+++ b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/adaptorInterfaceServices.mtl
@@ -251,18 +251,6 @@
 javaConstantName(aDomainSpecification).concat('_NAMSPACE_PREFIX')
 /]
 
-[query public resourceConstantName(aResource : Resource) : String = 
-aResource.javaName(true).toUpperCase()
-/]
-
-[query public resourcePathConstantName(aResource : Resource) : String = 
-'PATH_'.concat(aResource.javaName(true).toUpperCase())
-/]
-
-[query public resourceTypeConstantName(aResource : Resource) : String = 
-'TYPE_'.concat(aResource.javaName(true).toUpperCase())
-/]
-
 [comment Services for RequiredAdaptor /]
 [query public servicedResources(aRequiredAdaptor : RequiredAdaptor) : Set(Resource) =
 if (aRequiredAdaptor.oclIsTypeOf(GenericRequiredAdaptor)) then
diff --git a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/resourcePropertyServices.mtl b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/resourcePropertyServices.mtl
index 6abc8df..d4afaf7 100644
--- a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/resourcePropertyServices.mtl
+++ b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/resourcePropertyServices.mtl
@@ -24,6 +24,7 @@
 [import org::eclipse::lyo::oslc4j::codegenerator::services::resourceServices/]
 [import org::eclipse::lyo::oslc4j::codegenerator::services::adaptorInterfaceServices/]
 [import org::eclipse::lyo::oslc4j::codegenerator::services::domainSpecificationServices/]
+[import org::eclipse::lyo::oslc4j::codegenerator::services::vocabularyServices/]
 
 [query public javaName(aProperty: ResourceProperty, toUpperFirst : Boolean) : String = 
 javaString(aProperty.name, aProperty.definingDomainSpecification().namespacePrefix.name, toUpperFirst)
@@ -36,12 +37,34 @@
 not (Sequence{'URI'}->includes(aProperty.valueType.toString()))
 /]
 
+[query public resourcePropertyDefinitionNamespace(aResourceProperty: ResourceProperty) : String =
+(if (aResourceProperty.propertyDefinition.oclIsUndefined()) then
+    javaInterfaceNameForConstants(aResourceProperty.definingDomainSpecification()).concat('.').concat(domainSpecificationNamespaceConstantName(aResourceProperty.definingDomainSpecification()))
+else
+    javaInterfaceNameForConstants(aResourceProperty.propertyDefinition.definingVocabulary()).concat('.').concat(vocabularyNamespaceConstantName(aResourceProperty.propertyDefinition.definingVocabulary()))
+endif)
+/]
+
+[query public resourcePropertyDefinitionLocalName(aResourceProperty: ResourceProperty) : String =
+(if (aResourceProperty.propertyDefinition.oclIsUndefined()) then
+    '"'.concat(aResourceProperty.javaName(false)).concat('"')
+else
+	'"'.concat(aResourceProperty.propertyDefinition.javaName(false)).concat('"')
+endif)
+/]
+
 [query public nameAnnotation(aProperty: ResourceProperty) : String = 
-'@OslcName("'.concat(javaName(aProperty, false)). concat('")')
+'@OslcName('
+.concat(resourcePropertyDefinitionLocalName(aProperty))
+.concat(')')
 /]
 
 [query public propertyDefinitionAnnotation(aProperty: ResourceProperty, aResource: Resource, anAdaptorInterface: AdaptorInterface) : String = 
-'@OslcPropertyDefinition('.concat(javaInterfaceNameForConstants(aProperty.definingDomainSpecification())).concat('.').concat(domainSpecificationNamespaceConstantName(aProperty.definingDomainSpecification())) . concat(' + "').concat(javaName(aProperty, false)).concat('")')
+'@OslcPropertyDefinition('
+.concat(resourcePropertyDefinitionNamespace(aProperty))
+.concat(' + ')
+.concat(resourcePropertyDefinitionLocalName(aProperty))
+.concat(')')
 /]
 
 [query public descriptionAnnotation(aProperty: ResourceProperty) : String = 
diff --git a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/resourceServices.mtl b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/resourceServices.mtl
index dfd619a..1d6017b 100644
--- a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/resourceServices.mtl
+++ b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/resourceServices.mtl
@@ -173,3 +173,49 @@
     .concat('.java')
 /]
 
+[query public resourceConstantName(aResource : Resource) : String = 
+javaConstantString(aResource.name)
+/]
+
+[query public resourcePathConstantName(aResource : Resource) : String = 
+resourceConstantName(aResource).concat('_PATH')
+/]
+
+[query public resourceTypeNamespaceConstantName(aResource : Resource) : String = 
+resourceConstantName(aResource).concat('_NAMESPACE')
+/]
+
+[query public resourceTypeLocalNameConstantName(aResource : Resource) : String = 
+resourceConstantName(aResource).concat('_LOCALNAME')
+/]
+
+[query public resourceTypeConstantName(aResource : Resource) : String = 
+resourceConstantName(aResource).concat('_TYPE')
+/]
+
+[query public nameAnnotation(aResource : Resource) : String = 
+'@OslcName('
+.concat(javaInterfaceNameForConstants(aResource.definingDomainSpecification()))
+.concat('.')
+.concat(resourceTypeLocalNameConstantName(aResource))
+.concat(')')
+/]
+
+[query public namespaceAnnotation(aResource : Resource) : String = 
+'@OslcNamespace('
+.concat(javaInterfaceNameForConstants(aResource.definingDomainSpecification()))
+.concat('.')
+.concat(resourceTypeNamespaceConstantName(aResource))
+.concat(')')
+/]
+
+[query public resourceShapeAnnotation(aResource : Resource) : String = 
+'@OslcResourceShape(title = "'
+.concat(aResource.name).concat(' ').concat('Resource Shape')
+.concat('", describes = ')
+.concat(javaInterfaceNameForConstants(aResource.definingDomainSpecification()))
+.concat('.')
+.concat(resourceTypeConstantName(aResource))
+.concat(')')
+/]
+
diff --git a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/vocabularyServices.mtl b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/vocabularyServices.mtl
new file mode 100644
index 0000000..8979263
--- /dev/null
+++ b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/vocabularyServices.mtl
@@ -0,0 +1,117 @@
+[comment encoding = UTF-8 /]
+[comment
+/*******************************************************************************
+ * Copyright (c) 2018 Jad El-khoury.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Eclipse Distribution License v. 1.0 which accompanies this distribution.
+ *
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *
+ *     Jad El-khoury        - initial implementation
+ *     
+ *******************************************************************************/
+/]
+
+[module vocabularyServices('http://org.eclipse.lyo/oslc4j/adaptorInterface', 'http://org.eclipse.lyo/oslc4j/vocabulary')/]
+
+[import org::eclipse::lyo::oslc4j::codegenerator::services::adaptorInterfaceServices/]
+[import org::eclipse::lyo::oslc4j::codegenerator::services::services/]
+
+[query public relevantVocabularies(aDomainSpecification: DomainSpecification) : Set(Vocabulary) =
+aDomainSpecification.resources->select(not describes.oclIsUndefined())->collect(aResource : Resource | definingVocabulary(aResource.describes))
+->union(
+	aDomainSpecification.resourceProperties->select(not propertyDefinition.oclIsUndefined())->collect(aResourceProperty : ResourceProperty | definingVocabulary(aResourceProperty.propertyDefinition))
+)->asSet()
+/]
+
+[query public relevantVocabularies(anAdaptorInterface : AdaptorInterface) : Set(Vocabulary) =
+anAdaptorInterface.relevantDomainSpecifications()->collectNested(aDomainSpecification : DomainSpecification | 
+	relevantVocabularies(aDomainSpecification)
+)->flatten()->asSet()
+/]
+
+[query public definingVocabulary(aProperty: Property) : Vocabulary =
+aProperty.eContainer(Vocabulary)
+/]
+
+[query public definingVocabulary(aClass: Class) : Vocabulary =
+aClass.eContainer(Vocabulary)
+/]
+
+[query public javaFullFilesPath(aVocabularies: Vocabularies, anAdaptorInterface : AdaptorInterface, default : String) : String = 
+(if (anAdaptorInterface.oclIsUndefined()) then 
+    default
+else
+    javaFilesBasePath(anAdaptorInterface, default)
+endif)
+/]
+
+[query public javaPackageName(aVocabularies: Vocabularies, anAdaptorInterface : AdaptorInterface, default : String) : String = 
+(if (anAdaptorInterface.oclIsUndefined()) then 
+    default
+else
+    javaClassBaseNamespace(anAdaptorInterface, default).concat('.resources')
+endif)
+/]
+
+[query public javaFullFilesPath(aVocabulary: Vocabulary, anAdaptorInterface : AdaptorInterface, default : String) : String = 
+javaFullFilesPath(aVocabulary.eContainer(Vocabularies), anAdaptorInterface, default)
+/]
+
+[query public javaPackageName(aVocabulary: Vocabulary, anAdaptorInterface : AdaptorInterface, default : String) : String = 
+javaPackageName(aVocabulary.eContainer(Vocabularies), anAdaptorInterface, default)
+/]
+
+[query public javaInterfacePackageNameForConstants(aVocabulary: Vocabulary, anAdaptorInterface : AdaptorInterface, defaultJavaPackageName : String) : String = 
+javaPackageName(aVocabulary, anAdaptorInterface, defaultJavaPackageName)
+/]
+
+[query public javaInterfaceNameForConstants(aVocabulary: Vocabulary) : String =
+javaString(aVocabulary.preferredNamespacePrefix, 'oslc', true).concat('VocabularyConstants')
+/]
+
+[query public javaInterfaceFullNameForConstants(aVocabulary: Vocabulary, anAdaptorInterface : AdaptorInterface, defaultJavaPackageName : String) : String = 
+javaInterfacePackageNameForConstants(aVocabulary, anAdaptorInterface, defaultJavaPackageName).concat('.').concat(javaInterfaceNameForConstants(aVocabulary))
+/]
+
+[query public javaInterfaceFullFileNameForConstants(aVocabulary: Vocabulary, anAdaptorInterface : AdaptorInterface, defaultJavaFullFilesPath : String, defaultJavaPackageName : String) : String = 
+    javaFullFilesPath(aVocabulary, anAdaptorInterface, defaultJavaFullFilesPath)
+    .concatenatePaths(javaInterfacePackageNameForConstants(aVocabulary, anAdaptorInterface, defaultJavaPackageName).substituteAll('.', '/'))
+    .concatenatePaths(javaInterfaceNameForConstants(aVocabulary))
+    .concat('.java')
+/]
+
+[query public javaName(aClass: Class, toUpperFirst : Boolean) : String = 
+javaString(aClass.name, aClass.definingVocabulary().preferredNamespacePrefix, toUpperFirst)
+/]
+
+[query public javaName(aProperty: Property, toUpperFirst : Boolean) : String = 
+javaString(aProperty.name, aProperty.definingVocabulary().preferredNamespacePrefix, toUpperFirst)
+/]
+
+[comment Services for VocabularyConstants /]
+[query public javaConstantName(aVocabulary : Vocabulary) : String = 
+javaConstantString(aVocabulary.label)
+/]
+
+[query public vocabularyNamespaceConstantName(aVocabulary : Vocabulary) : String = 
+javaConstantName(aVocabulary).concat('_NAMSPACE')
+/]
+
+[query public vocabularyPreferredNamespacePrefixConstantName(aVocabulary : Vocabulary) : String = 
+javaConstantName(aVocabulary).concat('_NAMSPACE_PREFIX')
+/]
+
+[query public classConstantName(aClass : Class) : String = 
+aClass.javaName(true).toUpperCase()
+/]
+
+[query public classTypeConstantName(aClass : Class) : String = 
+'TYPE_'.concat(aClass.javaName(true).toUpperCase())
+/]