Merge "Bug 519430 - Allow the possibility to set a specification prefix in Lyo Modeller"
diff --git a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateAdaptorConstants.mtl b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateAdaptorConstants.mtl
index 9fd6026..3696b73 100644
--- a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateAdaptorConstants.mtl
+++ b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/files/generateAdaptorConstants.mtl
@@ -38,9 +38,9 @@
 
 
 [template public generateResourceConstants(aResource : Resource)]
-public static String [resourceConstantName(aResource)/] = "[aResource.javaName()/]";
+public static String [resourceConstantName(aResource)/] = "[aResource.javaName(true)/]";
 public static String [resourcePathConstantName(aResource)/] = "[aResource.javaName(false)/]";
-public static String [resourceTypeConstantName(aResource)/] = [domainSpecificationNamespaceConstantName(aResource.definingDomainSpecification())/] + "[aResource.javaName()/]";
+public static String [resourceTypeConstantName(aResource)/] = [domainSpecificationNamespaceConstantName(aResource.definingDomainSpecification())/] + "[aResource.javaName(false)/]";
 [/template]
 
 [template public generateAdaptorConstants(anAdaptorInterface : AdaptorInterface)]
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 60300c3..19cdfbc 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
@@ -34,7 +34,7 @@
 /]
 
 [query public javaName(anAdaptorInterface : AdaptorInterface, toUpperFirst : Boolean) : String = 
-javaString(anAdaptorInterface.name, toUpperFirst)
+javaString(anAdaptorInterface.name, 'oslc', toUpperFirst)
 /]
 
 [query public serviceProviders(anAdaptorInterface : AdaptorInterface) : Sequence(ServiceProvider) = 
diff --git a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/requiredAdaptorServices.mtl b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/requiredAdaptorServices.mtl
index 2c70c8f..cd87836 100644
--- a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/requiredAdaptorServices.mtl
+++ b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/requiredAdaptorServices.mtl
@@ -30,7 +30,7 @@
 
 [query public javaClassNameForClient(aRequiredAdaptor : RequiredAdaptor) : String = 
 if (aRequiredAdaptor.oclIsTypeOf(GenericRequiredAdaptor)) then
-	javaString(aRequiredAdaptor.oclAsType(GenericRequiredAdaptor).name, true).concat('Client')
+	javaString(aRequiredAdaptor.oclAsType(GenericRequiredAdaptor).name, 'oslc', true).concat('Client')
 else
 	javaName(aRequiredAdaptor.oclAsType(ModelledRequiredAdaptor).adaptorInterface, true).concat('Client')
 endif
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 b66501c..03e66ea 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
@@ -25,13 +25,8 @@
 [import org::eclipse::lyo::oslc4j::codegenerator::services::adaptorInterfaceServices/]
 [import org::eclipse::lyo::oslc4j::codegenerator::services::domainSpecificationServices/]
 
-
-[query public javaName(aProperty: ResourceProperty) : String = 
-javaString(aProperty.name)
-/]
-
 [query public javaName(aProperty: ResourceProperty, toUpperFirst : Boolean) : String = 
-javaString(aProperty.name, toUpperFirst)
+javaString(aProperty.name, aProperty.definingDomainSpecification().namespacePrefix.name, toUpperFirst)
 /]
 
 [comment TODO: "URI" should actually not be a valueType since it is not OSLC-standard. However, this is one way to allow user to specify a URI as a type.
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 ccce756..b5c69cf 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
@@ -127,12 +127,8 @@
 	aResource.interfaceResources().resourceProperties
 /]
 
-[query public javaName(aResource: Resource) : String = 
-javaString(aResource.name)
-/]
-
 [query public javaName(aResource: Resource, toUpperFirst : Boolean) : String = 
-javaString(aResource.name, toUpperFirst)
+javaString(aResource.name, aResource.definingDomainSpecification().namespacePrefix.name, toUpperFirst)
 /]
 
 [query public javaInstanceName(aResource: Resource) : String = 
diff --git a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/serviceProviderServices.mtl b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/serviceProviderServices.mtl
index c4d0967..2437a0b 100644
--- a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/serviceProviderServices.mtl
+++ b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/serviceProviderServices.mtl
@@ -44,7 +44,7 @@
 	    'ServiceProvider'
 	else
 		(if (not aServiceProvider.serviceNamespace.oclIsUndefined())._and(not aServiceProvider.serviceNamespace.equalsIgnoreCase('')) then
-		    javaString(aServiceProvider.serviceNamespace, true).concat('ServiceProvider')
+		    javaString(aServiceProvider.serviceNamespace, 'oslc', true).concat('ServiceProvider')
 		else
 			'ServiceProvider'
 			.concat(containingAdaptorInterface(aServiceProvider).serviceProviderCatalog.serviceProviders->indexOf(aServiceProvider).toString())
diff --git a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/services.mtl b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/services.mtl
index 533bebb..b698b54 100644
--- a/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/services.mtl
+++ b/org.eclipse.lyo.oslc4j.codegenerator/src/org/eclipse/lyo/oslc4j/codegenerator/services/services.mtl
@@ -14,103 +14,122 @@
  * Contributors:
  *
  *     Jad El-khoury        - initial implementation of code generator (https://bugs.eclipse.org/bugs/show_bug.cgi?id=422448)
- *     
+ *    
  *******************************************************************************/
 /]
 
 [module services('http://org.eclipse.lyo/oslc4j/adaptorInterface')/]
 
-[query public javaClassBaseNamespace(anAdaptorInterface : AdaptorInterface) : String = 
+[query private javaKeywords(traceabilityContext : OclAny) : Set(String) =
+Set{'abstract', 'continue', 'for', 'new', 'switch', 'assert', 'default', 'goto', 'package', 'synchronized', 'boolean', 'do',
+'if', 'private', 'this', 'break', 'double', 'implements', 'protected', 'throw', 'byte', 'else', 'import', 'public', 'throws',
+'case', 'enum', 'instanceof', 'return', 'transient', 'catch', 'extends', 'int', 'short', 'try', 'char', 'final', 'interface',
+'static', 'void', 'class', 'finally', 'long', 'strictfp', 'volatile', 'const', 'float', 'native', 'super', 'while'}
+/]
+
+[query private javaLangWords(traceabilityContext : OclAny) : Set(String) =
+Set{'appendable', 'autocloseable', 'charsequence', 'cloneable', 'comparable', 'iterable', 'readable', 'runnable', 'thread',
+'boolean', 'byte', 'character', 'class', 'classloader', 'classvalue', 'compiler', 'double', 'enum', 'float',
+'inheritablethreadlocal', 'integer', 'long', 'math', 'number', 'object', 'package', 'process', 'processbuilder',
+'runtime', 'runtimepermission', 'securitymanager', 'short', 'stacktraceelement', 'strictmath', 'string', 'stringbuffer',
+'stringbuilder', 'system', 'thread', 'threadgroup', 'threadlocal', 'throwable', 'void'}
+/]
+
+[query private isJavaSpecialWord(aString : String) : Boolean =
+((javaKeywords(aString)->union(javaLangWords(aString)))->includes(aString.toLower()))
+/]
+
+[query public javaClassBaseNamespace(anAdaptorInterface : AdaptorInterface) : String =
 anAdaptorInterface.javaClassBaseNamespace
 /]
 
-[query public javaFilesBasePath(anAdaptorInterface : AdaptorInterface) : String = 
+[query public javaFilesBasePath(anAdaptorInterface : AdaptorInterface) : String =
 anAdaptorInterface.javaFilesBasePath
 /]
 
-[query public jspFilesBasePath(anAdaptorInterface : AdaptorInterface) : String = 
+[query public jspFilesBasePath(anAdaptorInterface : AdaptorInterface) : String =
 anAdaptorInterface.jspFilesBasePath
 /]
 
-[query public javascriptFilesBasePath(anAdaptorInterface : AdaptorInterface) : String = 
+[query public javascriptFilesBasePath(anAdaptorInterface : AdaptorInterface) : String =
 anAdaptorInterface.javascriptFilesBasePath
 /]
 
 
-[query public jspFilesWebappPath(anAdaptorInterface : AdaptorInterface) : String = 
+[query public jspFilesWebappPath(anAdaptorInterface : AdaptorInterface) : String =
 '/'.concat(javaClassBaseNamespace(anAdaptorInterface)).substituteAll('.', '/')
 /]
 
-[query public methodSignature(parameters: Sequence(String), forJAXRSMethod : Boolean) : String =  
+[query public methodSignature(parameters: Sequence(String), forJAXRSMethod : Boolean) : String = 
 concatenate(
-	parameters->collect(aParameter: String |
-					    (if (forJAXRSMethod) then 
-					        '@PathParam("'.concat(aParameter).concat('") final String ').concat(aParameter)
-					    else 
-					        'final String '.concat(aParameter)
-					    endif)
-	)->sep(', ').oclAsType(String))
+    parameters->collect(aParameter: String |
+                        (if (forJAXRSMethod) then
+                            '@PathParam("'.concat(aParameter).concat('") final String ').concat(aParameter)
+                        else
+                            'final String '.concat(aParameter)
+                        endif)
+    )->sep(', ').oclAsType(String))
 /]
 
-[query public methodParameterList(parameters: Sequence(String)) : String =  
+[query public methodParameterList(parameters: Sequence(String)) : String = 
 concatenate(parameters->sep(', ').oclAsType(String))
 /]
 
-[query public JAXRSPathAnnotation(pathAnnotation : String) : String = 
-    (if (pathAnnotation.size() >= 1) then 
+[query public JAXRSPathAnnotation(pathAnnotation : String) : String =
+    (if (pathAnnotation.size() >= 1) then
         '@Path("'.concat(pathAnnotation).concat('")')
-    else 
+    else
         ''
     endif)
 /]
 
-[query public JAXRSPathParameters(uriSegment : String) : Sequence(String) = 
+[query public JAXRSPathParameters(uriSegment : String) : Sequence(String) =
 uriSegment.tokenize('}')
     ->select(token : String | token.index('{') <> -1)
     ->collect(token : String | token.substring(token.index('{')+1))
 /]
 
-[query private stripURISegmentEnd(URISegment : String) : String = 
-(if (URISegment.size() = 0) then 
+[query private stripURISegmentEnd(URISegment : String) : String =
+(if (URISegment.size() = 0) then
      URISegment
-else 
-    (if (URISegment.size() = 1) then 
+else
+    (if (URISegment.size() = 1) then
          (if (URISegment.endsWith('/')) then '' else URISegment endif)
-    else 
+    else
         URISegment.substring(1, URISegment.size()-(if (URISegment.endsWith('/')) then 1 else 0 endif))
     endif)
 endif)
 /]
 
-[query private stripURISegmentStart(URISegment : String) : String = 
-(if (URISegment.size() = 0) then 
+[query private stripURISegmentStart(URISegment : String) : String =
+(if (URISegment.size() = 0) then
      URISegment
-else 
-    (if (URISegment.size() = 1) then 
+else
+    (if (URISegment.size() = 1) then
          (if (URISegment.startsWith('/')) then '' else URISegment endif)
-    else 
+    else
         URISegment.substring((if (URISegment.startsWith('/')) then 2 else 1 endif), URISegment.size())
     endif)
 endif)
 /]
 
-[query public JAXRSConcatURISegments(leftURISegment : String, rightURISegment : String) : String = 
-	concatenatePaths(leftURISegment, rightURISegment) 
+[query public JAXRSConcatURISegments(leftURISegment : String, rightURISegment : String) : String =
+    concatenatePaths(leftURISegment, rightURISegment)
 /]
 
-[query public concatenatePaths (leftSegment : String, rightSegment : String) : String = 
-(if (stripURISegmentEnd(leftSegment).size() = 0) then 
-    stripURISegmentStart(rightSegment) 
-else 
-    (if (stripURISegmentStart(rightSegment).size() = 0) then 
-        stripURISegmentEnd(leftSegment) 
-    else 
-        stripURISegmentEnd(leftSegment).concat('/').concat(stripURISegmentStart(rightSegment)) 
+[query public concatenatePaths (leftSegment : String, rightSegment : String) : String =
+(if (stripURISegmentEnd(leftSegment).size() = 0) then
+    stripURISegmentStart(rightSegment)
+else
+    (if (stripURISegmentStart(rightSegment).size() = 0) then
+        stripURISegmentEnd(leftSegment)
+    else
+        stripURISegmentEnd(leftSegment).concat('/').concat(stripURISegmentStart(rightSegment))
     endif)
 endif)
 /]
 
-[query public commaSeparate(commaSeparatedString : String, prependIfNotEmpty : Boolean, appendIfNotEmpty : Boolean) : String = 
+[query public commaSeparate(commaSeparatedString : String, prependIfNotEmpty : Boolean, appendIfNotEmpty : Boolean) : String =
 (if prependIfNotEmpty._and(commaSeparatedString.size() > 0) then ', ' else ''endif)
 .concat(commaSeparatedString)
 .concat(
@@ -118,44 +137,46 @@
 )
 /]
 
-[query public javaSimpleStringFromUri(uriString: String, toUpperFirst : Boolean) : String = 
-javaString(uriString.tokenize('/\\#')->last(), toUpperFirst)
+[query public javaSimpleStringFromUri(uriString: String, toUpperFirst : Boolean) : String =
+javaString(uriString.tokenize('/\\#')->last(), '', toUpperFirst)
 /]
 
-[query public javaConstantString (aString : String) : String = 
+[query public javaConstantString (aString : String) : String =
 concatenate(
-	aString.replaceAll('\\W+', '_').tokenize('_')->sep('_').oclAsType(String)
+    aString.replaceAll('\\W+', '_').tokenize('_')->sep('_').oclAsType(String)
 ).toUpperCase()
 /]
 
-[query public javaString (aString : String) : String = 
+[query private javaString (aString : String) : String =
 concatenate(
-	aString.replaceAll('\\W+', ' ').tokenize(' ')->collect(s : String  | s.toUpperFirst())
+    aString.replaceAll('\\W+', ' ').tokenize(' ')->collect(s : String  | s.toUpperFirst())
 )
 /]
 
-[query public javaString (aString : String, toUpperFirst : Boolean) : String = 
-if (toUpperFirst) then javaString(aString).toUpperFirst() else javaString(aString).toLowerFirst() endif
+[query public javaString (aString : String, prefixIfNecessary : String, toUpperFirst : Boolean) : String =
+let base : String = (if (isJavaSpecialWord(aString)) then prefixIfNecessary.concat(javaString(aString).toUpperFirst()) else javaString(aString) endif)
+in 
+if (toUpperFirst) then base.toUpperFirst() else base.toLowerFirst() endif
 /]
 
-[query public concatenate (aStringSequence : Sequence(String)) : String = 
-(if (aStringSequence->size() = 0) then 
-    '' 
-else 
-    (if (aStringSequence->size() = 1) then 
-		aStringSequence->at(1)
-    else 
-	    (if (aStringSequence->size() = 2) then 
-			aStringSequence->at(1).concat(aStringSequence->at(2))
-	    else 
-			aStringSequence->at(1).concat(aStringSequence->at(2)).concat(concatenate(aStringSequence->subSequence(3, aStringSequence->size())))
-	    endif)
+[query public concatenate (aStringSequence : Sequence(String)) : String =
+(if (aStringSequence->size() = 0) then
+    ''
+else
+    (if (aStringSequence->size() = 1) then
+        aStringSequence->at(1)
+    else
+        (if (aStringSequence->size() = 2) then
+            aStringSequence->at(1).concat(aStringSequence->at(2))
+        else
+            aStringSequence->at(1).concat(aStringSequence->at(2)).concat(concatenate(aStringSequence->subSequence(3, aStringSequence->size())))
+        endif)
     endif)
 endif)
 /]
 
-[query public concatenate (aStringSequence : Sequence(String), separatorString : String) : String = 
-	concatenate(aStringSequence->sep(separatorString).oclAsType(String))
+[query public concatenate (aStringSequence : Sequence(String), separatorString : String) : String =
+    concatenate(aStringSequence->sep(separatorString).oclAsType(String))
 /]