[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 serviceServices('http://org.eclipse.lyo/oslc4j/adaptorInterface')/]

[import org::eclipse::lyo::oslc4j::codegenerator::services::services/]
[import org::eclipse::lyo::oslc4j::codegenerator::services::resourceServices/]
[import org::eclipse::lyo::oslc4j::codegenerator::services::serviceProviderServices/]

[query public containingAdaptorInterface(aService: Service) : AdaptorInterface =
aService.eContainer(AdaptorInterface).oclAsType(AdaptorInterface)
/]

[query public containingAdaptorInterface (aQueryCapability: QueryCapability) : AdaptorInterface = 
aQueryCapability.eContainer(AdaptorInterface).oclAsType(AdaptorInterface)
/]

[query public containingAdaptorInterface (aDialog: Dialog) : AdaptorInterface = 
aDialog.eContainer(AdaptorInterface).oclAsType(AdaptorInterface)
/]

[query public containingAdaptorInterface (aCreationFactory: CreationFactory) : AdaptorInterface = 
aCreationFactory.eContainer(AdaptorInterface).oclAsType(AdaptorInterface)
/]

[query public containingAdaptorInterface (aBasicCapability: BasicCapability) : AdaptorInterface = 
aBasicCapability.eContainer(AdaptorInterface).oclAsType(AdaptorInterface)
/]

[query public containingServiceProvider(aService: Service) : ServiceProvider =
aService.eContainer(ServiceProvider).oclAsType(ServiceProvider)
/]

[query public javaClassPackageName(aService: Service) : String = 
javaClassBaseNamespace(containingAdaptorInterface(aService)).concat('.services')
/]

[query public javaClassName(aService: Service) : String = 
(concatenate(servicedResources(aService)->sortedBy(name).javaName(true)->sep('', 'And', '').oclAsType(String))).toUpperFirst()
.concat('Service')
/]

[query public javaClassFullName(aService: Service) : String = 
javaClassPackageName(aService).concat('.').concat(javaClassName(aService))
/]

[query public javaClassFullFileName(aService: Service) : String = 
javaFilesBasePath(containingAdaptorInterface(aService)).concatenatePaths(javaClassPackageName(aService).substituteAll('.', '/')).concat('/').concat(javaClassName(aService)).concat('.java')
/]

[comment default to true if the property is not explicitly defined /]
[query public serviceNamespaceRelativeToServiceProvider (aService: Service) : Boolean = 
    (if (not aService.serviceNamespace.oclIsUndefined()) then
        (if (aService.serviceNamespace = ResourceServiceNamespace::relativeToServiceProvider) then
            true
        else
            false
        endif)
    else
        true
    endif)
/]

[query public serviceBaseURI (aService: Service) : String = 
(if (serviceNamespaceRelativeToServiceProvider(aService)) then
	aService.containingServiceProvider().instanceURI().concat('/')
else
    ''
endif)
.concat(
	(if (containingServiceProvider(aService).services->size() = 1) then
	    ''
	else
	    'service'.concat(containingServiceProvider(aService).services->indexOf(aService).toString()).concat('/')
	endif)
)
.concat(
	(if (servicedResources(aService)->size() = 1) then
		javaName(servicedResources(aService)->any(true), false).concat('s')
	else
	    'resources'
	endif)
)
/]

[comment QueryCapability /]
[query public URISegment (aQueryCapability: QueryCapability) : String = 
if (aQueryCapability.queryBaseURI.oclIsUndefined())._or (aQueryCapability.queryBaseURI.equalsIgnoreCase('')) then
	''
else
	aQueryCapability.queryBaseURI
endif
/]

[query public URI (aQueryCapability: QueryCapability) : String = 
JAXRSConcatURISegments(aQueryCapability.eContainer(Service).serviceBaseURI(), aQueryCapability.URISegment())
/]

[query public queryCompositeID(aQueryCapability: QueryCapability) : Sequence(String) =  
JAXRSPathParameters(aQueryCapability.URI())
/]

[query public queryMethodName(aQueryCapability: QueryCapability, forRDF : Boolean) : String = 
concatenate(aQueryCapability.resourceTypes.javaName(true)->sep('query', 'sAnd', 's').oclAsType(String))
	.concat((if forRDF then '' else 'AsHtml' endif))
/]

[query public queryMethodResourceType(aQueryCapability: QueryCapability) : String = 
if (aQueryCapability.resourceTypes->size() = 1) then 
	 javaClassName(aQueryCapability.resourceTypes->first())
else 
	'AbstractResource' 
endif
/]

[query public queryMethodReturnType(aQueryCapability: QueryCapability, forRDF : Boolean) : String = 
if forRDF then 
	 queryMethodResourceType(aQueryCapability).concat('[]')
else 
	'Response' 
endif
/]

[query public queryMethodSignature(aQueryCapability: QueryCapability, forJAXRSMethod : Boolean) : String =  
methodSignature(queryCompositeID(aQueryCapability), forJAXRSMethod)
/]

[query public queryMethodParameterList(aQueryCapability: QueryCapability) : String =  
methodParameterList(JAXRSPathParameters(aQueryCapability.URI()))
/]

[comment CreationFactory /]
[query public URISegment (aCreationFactory: CreationFactory) : String = 
if (aCreationFactory.creationURI.oclIsUndefined())._or (aCreationFactory.creationURI.equalsIgnoreCase('')) then
	'create'
else
	aCreationFactory.creationURI
endif
/]

[query public URI (aCreationFactory: CreationFactory) : String =  
JAXRSConcatURISegments(aCreationFactory.eContainer(Service).serviceBaseURI(), aCreationFactory.URISegment())
/]

[query public creationCompositeID(aCreationFactory: CreationFactory) : Sequence(String) =  
JAXRSPathParameters(aCreationFactory.URI())
/]

[query public creationMethodName(aCreationFactory: CreationFactory) : String = 
concatenate(aCreationFactory.resourceTypes.javaName(true)->sep('create', 'And', '').oclAsType(String))
.concat('')
/]

[query public creationMethodResourceType(aCreationFactory: CreationFactory) : String = 
if (aCreationFactory.resourceTypes->size() = 1) then 
	 javaClassName(aCreationFactory.resourceTypes->first())
else 
	'AbstractResource' 
endif
/]

[query public creationMethodReturnType(aCreationFactory: CreationFactory) : String = 
'Response'
/]

[query public creationMethodSignature(aCreationFactory: CreationFactory, forJAXRSMethod : Boolean) : String =  
methodSignature(creationCompositeID(aCreationFactory), forJAXRSMethod)
/]

[query public creationMethodParameterList(aCreationFactory: CreationFactory) : String =  
methodParameterList(JAXRSPathParameters(aCreationFactory.URI()))
/]

[query public getResourceETagMethodName(resources : Set(Resource)) : String = 
concatenate(resources.javaName(true)->sep('getETagFrom', 'And', '').oclAsType(String))
.concat('')
/]

[query public getResourceETagMethodName(aResource: Resource) : String = 
getResourceETagMethodName(Set{aResource})
/]

[comment Dialog /]
[query public URISegment (aDialog: Dialog, selectionDialog : Boolean) : String = 
if (aDialog.dialogURI.oclIsUndefined())._or (aDialog.dialogURI.equalsIgnoreCase('')) then
	(if selectionDialog then 'selector' else 'creator' endif)
else
	aDialog.dialogURI
endif
/]

[query public URI (aDialog: Dialog, selectionDialog : Boolean) : String =  
JAXRSConcatURISegments(aDialog.eContainer(Service).serviceBaseURI(), aDialog.URISegment(selectionDialog))
/]

[query public dialogCompositeID(aDialog: Dialog, selectionDialog : Boolean) : Sequence(String) =  
JAXRSPathParameters(aDialog.URI(selectionDialog))
/]

[query public dialogMethodName(aDialog: Dialog, selectionDialog : Boolean) : String = 
concatenate(aDialog.resourceTypes.javaName(true)->sep('', 'And', '').oclAsType(String))
	.concat((if selectionDialog then 'Selector' else 'Creator' endif))
/]

[query public dialogMethodResourceType(aDialog: Dialog) : String = 
if (aDialog.resourceTypes->size() = 1) then 
	 javaClassName(aDialog.resourceTypes->first())
else 
	'AbstractResource' 
endif
/]

[query public dialogMethodReturnType(aDialog: Dialog, selectionDialog : Boolean) : String = 
'void'
/]

[query public dialogMethodSignature(aDialog: Dialog, selectionDialog : Boolean, forJAXRSMethod : Boolean) : String =  
methodSignature(dialogCompositeID(aDialog, selectionDialog), forJAXRSMethod)
/]

[query public dialogMethodParameterList(aDialog: Dialog, selectionDialog : Boolean) : String =  
methodParameterList(JAXRSPathParameters(aDialog.URI(selectionDialog)))
/]

[query public creationMethodName(aCreationDialog: Dialog) : String = 
concatenate(aCreationDialog.resourceTypes.javaName(true)->sep('create', 'And', '').oclAsType(String))
.concat('')
/]

[query public creationMethodResourceType(aCreationDialog: Dialog) : String = 
if (aCreationDialog.resourceTypes->size() = 1) then 
	 javaClassName(aCreationDialog.resourceTypes->first())
else 
	'AbstractResource' 
endif
/]

[query public creationMethodReturnType(aCreationDialog: Dialog) : String = 
'void'
/]

[comment BasicCapability /]
[query public instanceURISegment (aResource: Resource, aBasicCapability: BasicCapability) : String = 
(if (servicedResources(aBasicCapability.eContainer(Service))->size() = 1) then
    ''
else
	javaName(aResource, false).concat('s/')
endif)
.concat(
    (if (not aBasicCapability.instanceID.oclIsUndefined())._and(not aBasicCapability.instanceID.equalsIgnoreCase('')) then
        aBasicCapability.instanceID
    else
        '{'.concat(javaName(aResource, false)).concat('Id}')
    endif)
)
/]

[query public instanceURI (aResource: Resource, aBasicCapability: BasicCapability) : String = 
    JAXRSConcatURISegments(aBasicCapability.eContainer(Service).serviceBaseURI(), aResource.instanceURISegment(aBasicCapability))
/]

[query public instanceCompositeID (aResource: Resource, aBasicCapability: BasicCapability) : Sequence(String) = 
JAXRSPathParameters(aResource.instanceURI(aBasicCapability))
/]

[query public getResourceMethodName(aBasicCapability: BasicCapability, aResource: Resource, forRDF : Boolean) : String = 
'get'.concat(javaName(aResource, true))
	.concat((if forRDF then '' else 'AsHtml' endif))
/]

[query public deleteResourceMethodName(aBasicCapability: BasicCapability, aResource: Resource) : String = 
'delete'.concat(javaName(aResource, true))
/]

[query public updateResourceMethodName(aBasicCapability: BasicCapability, aResource: Resource) : String = 
'update'.concat(javaName(aResource, true))
/]

[query public getResourceMethodResourceType(aBasicCapability: BasicCapability, aResource: Resource) : String = 
javaClassName(aResource)
/]

[query public getResourceMethodReturnType(aBasicCapability: BasicCapability, aResource: Resource, forRDF : Boolean) : String = 
if forRDF then 
	 aBasicCapability.getResourceMethodResourceType(aResource)
else 
	'Response' 
endif
/]

[query public updateResourceMethodResourceType(aBasicCapability: BasicCapability, aResource: Resource) : String = 
javaClassName(aResource)
/]

[query public updateResourceMethodReturnType(aBasicCapability: BasicCapability, aResource: Resource) : String = 
'Response' 
/]

[query public deleteResourceMethodResourceType(aBasicCapability: BasicCapability, aResource: Resource) : String = 
javaClassName(aResource)
/]

[query public deleteResourceMethodReturnType(aBasicCapability: BasicCapability, aResource: Resource) : String = 
'Response' 
/]

[query public instanceMethodSignature(aResource: Resource, aBasicCapability: BasicCapability, forJAXRSMethod : Boolean) : String =  
methodSignature(instanceCompositeID(aResource, aBasicCapability), forJAXRSMethod)
/]

[query public instanceMethodParameterList(aResource: Resource, aBasicCapability: BasicCapability) : String =  
methodParameterList(instanceCompositeID(aResource, aBasicCapability))
/]

