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

[import org::eclipse::lyo::oslc4j::codegenerator::services::services/]
[import org::eclipse::lyo::oslc4j::codegenerator::services::domainSpecificationServices/]

[query public directParentResource(aResource: Resource) : Resource =
    (if (aResource.extends->notEmpty()) then 
        aResource.extends->first()
    else
        null
    endif)
/]

[query public parentResources(aResource: Resource) : Set(Resource) =
    (if (directParentResource(aResource)->notEmpty()) then 
        directParentResource(aResource)->union(parentResources(directParentResource(aResource)))
    else
        Set{}
    endif)
/]

[query public allExtendingResources(aResource: Resource) : OrderedSet(Resource) =
	aResource.extends
	->union(
			aResource.extends->collectNested(r:Resource | allExtendingResources(r))->flatten()->asOrderedSet()
			)
	->asOrderedSet()
/]

[comment The interfaceResources of resource A, are its directInterfaceResources; plus for each such directInterfaceResource DIR, ALL the extendingResources of DIR.
However, if an extendingResource of DIR is also a ParentResource of A, then exclude this resource from the interface set.
It is a problem if a resource X is defined to be both an interface of A, as well as one of its (distant) parents. Since, the resource shape would end up defining each of X's properties twice/]
[query public interfaceResources(aResource: Resource) : OrderedSet(Resource) =
	((directInterfaceResources(aResource)
	->union(
			directInterfaceResources(aResource)->collectNested(r:Resource | allExtendingResources(r))->flatten()->asOrderedSet()
			)
	->asOrderedSet())
	- parentResources(aResource))
	->asOrderedSet()
/]

[query private directInterfaceResources(aResource: Resource) : OrderedSet(Resource) =
	(if (aResource.extends->size() > 1) then 
        aResource.extends->subOrderedSet(2, aResource.extends->size())
    else
        OrderedSet{}
    endif)

/]

[query public directlyRelatedResources(aResource: Resource) : Set(Resource) =
	(aResource.resourceProperties->collect(p : ResourceProperty | p.range))->flatten()->asSet()
	->union(
		aResource.extends
	)->flatten()->asSet()
/]

[comment allRelatedResources seems to hang for long & complicated hierarchy of resources. 
As an intermediate solution, the depth parameter is introduced to allow the recursive query to stop once a certain limit is reached /]
[query private allRelatedResources(aResource: Resource, alreadyAnalysed : Set(Resource), depth : Integer) : Set(Resource) =
let drr : Set(Resource) = directlyRelatedResources(aResource),
	newAlreadyAnalysed : Set(Resource) = (Set{aResource}->union(drr))->union(alreadyAnalysed),
	toAnalyse : Set(Resource) =  drr - alreadyAnalysed in 

	(if (depth > 20) then 
        drr - alreadyAnalysed 
    else
		toAnalyse->collect(r : Resource | 
			allRelatedResources(r, newAlreadyAnalysed, depth+1)
			->union(directlyRelatedResources(r))
			->union(Set{r})
		)->flatten()->asSet()
    endif)
/]

[comment allRelatedResources seems to hang for long & complicated hierarchy of resources. 
As an intermediate solution, the depth parameter is introduced to allow the recursive query to stop once a certain limit is reached. 
After that, we look at what related resources might be potentially missing, and then re-start the query for the remaining resources. 
This is not a complete solution, but seems to be working for the Autosar 800+ resources. 
It is not clear why the recursion is ending up in an endless loop otherwise. /]
[query public allRelatedResources(aResource: Resource) : Set(Resource) =
let arr : Set(Resource) = allRelatedResources(aResource, Set{}, 1),
	leftOut : Set(Resource) = arr->collect(r : Resource | directlyRelatedResources(r) - arr)->flatten()->asSet()
in
	arr
	->union(leftOut)
	->union(leftOut->collect(r : Resource | allRelatedResources(r, arr->union(Set{r}), 1))->flatten()->asSet())
/]

[query public allProperties(aResource: Resource) : Sequence(ResourceProperty) = 
((aResource.resourceProperties->asSequence())
	->union(inheritedProperties(aResource))
	->union(interfaceProperties(aResource))
)
/]

[query public inheritedProperties(aResource: Resource) : Sequence(ResourceProperty) = 
    (if (not aResource.directParentResource().oclIsUndefined()) then 
        (aResource.directParentResource().resourceProperties->asSequence())->union(inheritedProperties(aResource.directParentResource()))
    else
        Sequence{}
    endif)
/]

[query public interfaceProperties(aResource: Resource) : Sequence(ResourceProperty) =
	aResource.interfaceResources().resourceProperties
/]

[query public javaName(aResource: Resource, toUpperFirst : Boolean) : String = 
javaString(aResource.name, aResource.definingDomainSpecification().namespacePrefix.name, toUpperFirst)
/]

[query public javaInstanceName(aResource: Resource) : String = 
javaName(aResource, false)
/]

[query public javaClassPackageName(aResource: Resource, anAdaptorInterface : AdaptorInterface, defaultJavaPackageName : String) : String = 
javaPackageName(aResource.definingDomainSpecification(), anAdaptorInterface, defaultJavaPackageName)
/]

[query public javaClassName(aResource: Resource) : String = 
javaName(aResource, true)
/]

[query public javaClassFullName(aResource: Resource, anAdaptorInterface : AdaptorInterface, defaultJavaPackageName : String) : String = 
javaClassPackageName(aResource, anAdaptorInterface, defaultJavaPackageName).concat('.').concat(javaClassName(aResource))
/]

[query public javaClassFullFileName(aResource: Resource, anAdaptorInterface : AdaptorInterface, defaultJavaFullFilesPath : String, defaultJavaPackageName : String) : String =
    javaFullFilesPath(aResource.definingDomainSpecification(), anAdaptorInterface, defaultJavaFullFilesPath)
    .concatenatePaths(javaClassPackageName(aResource, anAdaptorInterface, defaultJavaPackageName).substituteAll('.', '/'))
    .concatenatePaths(javaClassName(aResource))
    .concat('.java')
/]

[query public javaInterfacePackageName(aResource: Resource, anAdaptorInterface : AdaptorInterface, defaultJavaPackageName : String) : String = 
javaClassPackageName(aResource, anAdaptorInterface, defaultJavaPackageName)
/]

[query public javaInterfaceName(aResource: Resource) : String = 
'I'.concat(javaName(aResource, true))
/]

[query public javaInterfaceFullName(aResource: Resource, anAdaptorInterface : AdaptorInterface, defaultJavaPackageName : String) : String = 
javaInterfacePackageName(aResource, anAdaptorInterface, defaultJavaPackageName).concat('.').concat(javaInterfaceName(aResource))
/]

[query public javaInterfaceFullFileName(aResource: Resource, anAdaptorInterface : AdaptorInterface, defaultJavaFullFilesPath : String, defaultJavaPackageName : String) : String = 
    javaFullFilesPath(aResource.definingDomainSpecification(), anAdaptorInterface, defaultJavaFullFilesPath)
    .concatenatePaths(javaInterfacePackageName(aResource, anAdaptorInterface, defaultJavaPackageName).substituteAll('.', '/'))
    .concatenatePaths(javaInterfaceName(aResource))
    .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(')')
/]

