[comment encoding = UTF-8 /]
[comment
/*******************************************************************************
 * Copyright (c) 2014 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 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 = 
anAdaptorInterface.javaClassBaseNamespace
/]

[query public javaFilesBasePath(anAdaptorInterface : AdaptorInterface) : String = 
anAdaptorInterface.javaFilesBasePath
/]

[query public jspFilesBasePath(anAdaptorInterface : AdaptorInterface) : String = 
anAdaptorInterface.jspFilesBasePath
/]

[query public javascriptFilesBasePath(anAdaptorInterface : AdaptorInterface) : String = 
anAdaptorInterface.javascriptFilesBasePath
/]


[query public jspFilesWebappPath(anAdaptorInterface : AdaptorInterface) : String = 
'/'.concat(javaClassBaseNamespace(anAdaptorInterface)).substituteAll('.', '/')
/]

[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))
/]

[query public methodParameterList(parameters: Sequence(String)) : String =  
concatenate(parameters->sep(', ').oclAsType(String))
/]

[query public JAXRSPathAnnotation(pathAnnotation : String) : String = 
    (if (pathAnnotation.size() >= 1) then 
        '@Path("'.concat(pathAnnotation).concat('")')
    else 
        ''
    endif)
/]

[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 
     URISegment
else 
    (if (URISegment.size() = 1) then 
         (if (URISegment.endsWith('/')) then '' else URISegment endif)
    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 
     URISegment
else 
    (if (URISegment.size() = 1) then 
         (if (URISegment.startsWith('/')) then '' else URISegment endif)
    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 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 = 
(if prependIfNotEmpty._and(commaSeparatedString.size() > 0) then ', ' else ''endif)
.concat(commaSeparatedString)
.concat(
(if appendIfNotEmpty._and(commaSeparatedString.size() > 0) then ' ,' else ''endif)
)
/]

[query public javaSimpleStringFromUri(uriString: String, toUpperFirst : Boolean) : String = 
javaString(uriString.tokenize('/\\#')->last(), toUpperFirst)
/]

[query public javaConstantString (aString : String) : String = 
concatenate(
	aString.replaceAll('\\W+', '_').tokenize('_')->sep('_').oclAsType(String)
).toUpperCase()
/]

[query public javaString (aString : String) : String = 
concatenate(
	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 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))
/]


