[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 (422448)
 *     Matthieu Helleboid   - Support for multiple Service Providers.
 *     Anass Radouani       - Support for multiple Service Providers.
 *     Frédéric Loiret      - Switch the template to Bootstrap (519699)
 *******************************************************************************/
/]

[module generate('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::resourcePropertyServices/]
[import org::eclipse::lyo::oslc4j::codegenerator::services::adaptorInterfaceServices/]

[import org::eclipse::lyo::oslc4j::codegenerator::files::generateServiceProviderCatalogService/]
[import org::eclipse::lyo::oslc4j::codegenerator::files::generateServiceProviderCatalogSingleton/]
[import org::eclipse::lyo::oslc4j::codegenerator::files::generateAdaptorServiceProviderFactory/]
[import org::eclipse::lyo::oslc4j::codegenerator::files::generateAdaptorManager/]
[import org::eclipse::lyo::oslc4j::codegenerator::files::generateAdaptorResourcesFactory/]
[import org::eclipse::lyo::oslc4j::codegenerator::files::generateAdaptorServletListener/]
[import org::eclipse::lyo::oslc4j::codegenerator::files::generateAdaptorApplication/]
[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::generateAdaptorConstants/]
[import org::eclipse::lyo::oslc4j::codegenerator::files::generateServiceProviderService/]
[import org::eclipse::lyo::oslc4j::codegenerator::files::generateServiceProviderInfo/]
[import org::eclipse::lyo::oslc4j::codegenerator::files::generateResource/]
[import org::eclipse::lyo::oslc4j::codegenerator::files::generateResourceInterface/]
[import org::eclipse::lyo::oslc4j::codegenerator::files::generateResourceService/]
[import org::eclipse::lyo::oslc4j::codegenerator::staticFiles::generateLicenseFiles/]

[import org::eclipse::lyo::oslc4j::codegenerator::staticFiles::generateCssAndJsFiles/]
[import org::eclipse::lyo::oslc4j::codegenerator::jsp::generateResourceCollectionJsp/]
[import org::eclipse::lyo::oslc4j::codegenerator::jsp::generateFilteredResourceCollectionJsp/]
[import org::eclipse::lyo::oslc4j::codegenerator::jsp::generateGetResourceJsp/]
[import org::eclipse::lyo::oslc4j::codegenerator::jsp::generateGetResourceSmallPreviewJsp/]
[import org::eclipse::lyo::oslc4j::codegenerator::jsp::generateResourceCreatorJsp/]
[import org::eclipse::lyo::oslc4j::codegenerator::jsp::generateResourceSelectorJsp/]
[import org::eclipse::lyo::oslc4j::codegenerator::jsp::generateResourceSelectorClientJsp/]
[import org::eclipse::lyo::oslc4j::codegenerator::jsp::generateResourceCreatorClientJsp/]
[import org::eclipse::lyo::oslc4j::codegenerator::jsp::generateServiceProviderCatalogHTML/]
[import org::eclipse::lyo::oslc4j::codegenerator::jsp::generateServiceProviderHTML/]
[import org::eclipse::lyo::oslc4j::codegenerator::jsp::generateDelegatedUIJavaScripts/]
[import org::eclipse::lyo::oslc4j::codegenerator::jsp::generateIndexJsp/]
[import org::eclipse::lyo::oslc4j::codegenerator::jsp::generateResourceShapeJsp/]

[import org::eclipse::lyo::oslc4j::codegenerator::files::generateAdaptorClient/]
[import org::eclipse::lyo::oslc4j::codegenerator::files::generateResourceShapeService/]

[template public generateCommon(anAdaptorInterface : AdaptorInterface)]
[anAdaptorInterface.generateLicenseFiles() /]
[anAdaptorInterface.generateAdaptorConstants() /]
[anAdaptorInterface.generateAdaptorPackageInfo() /]
[/template]

[template public generateForServiceProviderCatalog(anAdaptorInterface : AdaptorInterface)]
[if (not anAdaptorInterface.serviceProviderCatalog.oclIsUndefined())]
[anAdaptorInterface.generateAdaptorApplication() /]
[anAdaptorInterface.generateAdaptorServletListener() /]
[anAdaptorInterface.generateAdaptorManager() /]
[anAdaptorInterface.generateAdaptorResourcesFactory() /]
[anAdaptorInterface.serviceProviderCatalog.generateServiceProviderCatalogService() /]
[anAdaptorInterface.serviceProviderCatalog.generateServiceProviderCatalogSingleton() /]

[anAdaptorInterface.generateCssAndJsFiles() /]
[anAdaptorInterface.serviceProviderCatalog.generateServiceProviderCatalogHTML() /]
[anAdaptorInterface.generateIndexJsp() /]
[anAdaptorInterface.generateDelegatedUIJavaScripts() /]
[anAdaptorInterface.generateResourceSelectorClientJsp() /]
[anAdaptorInterface.generateResourceCreatorClientJsp() /]
[anAdaptorInterface.generateResourceShapeService() /]
[anAdaptorInterface.generateResourceShapeJsp() /]
[/if]
[/template]

[template public generateForRelevantDomainSpecifications(anAdaptorInterface : AdaptorInterface)]
[for (aDomainSpecification: DomainSpecification | relevantDomainSpecifications(anAdaptorInterface))]
    [aDomainSpecification.generateDomainSpecificationConstants(anAdaptorInterface, null, null)/]
[/for]
[/template]

[template public generateForRelevantResources(anAdaptorInterface : AdaptorInterface)]
[for (aResource: Resource | relevantResources(anAdaptorInterface))]
    [aResource.generateResource(anAdaptorInterface, null, null) /]
    [aResource.generateResourceInterface(anAdaptorInterface, anAdaptorInterface, null, null) /]
[/for]
[/template]

[template public generateForServiceProviders(anAdaptorInterface : AdaptorInterface)]
[for (aServiceProvider: ServiceProvider | anAdaptorInterface.serviceProviders())]
    [aServiceProvider.generateServiceProviderInfo() /]
    [aServiceProvider.generateServiceProviderService()/]
    [aServiceProvider.generateAdaptorServiceProviderFactory() /]
    [aServiceProvider.generateServiceProviderHTML() /]

    [for (aService: Service | aServiceProvider.services)]
        [aService.generateResourceService()/]

        [for (aQueryCapability: QueryCapability | aService.queryCapabilities)]
        [comment Produce one only jsp-file for each set of QueryCapabilities that have the same Sequence (not Set) of ResourceTypes. /]
        [let allQueryCapabilities: Sequence(QueryCapability) = anAdaptorInterface.serviceProviderCatalog.serviceProviders.services.queryCapabilities]
            [if not (allQueryCapabilities->excluding(aQueryCapability)->exists(anotherQueryCapability: QueryCapability |
                    (anotherQueryCapability.resourceTypes = aQueryCapability.resourceTypes).
                    _and(allQueryCapabilities->indexOf(anotherQueryCapability) > allQueryCapabilities->indexOf(aQueryCapability))))]
                [aQueryCapability.generateResourceCollectionJsp() /]
            [/if]
        [/let]
        [/for]

        [for (aSelectionDialog: Dialog | aService.selectionDialogs)]
        [comment Produce one only set of jsp-files for each set of selectionDialogs that have the same Sequence (not Set) of ResourceTypes. /]
        [let allSelectionDialogs: Sequence(Dialog) = anAdaptorInterface.serviceProviderCatalog.serviceProviders.services.selectionDialogs]
            [if not (allSelectionDialogs->excluding(aSelectionDialog)->exists(anotherSelectionDialog: Dialog |
                    (anotherSelectionDialog.resourceTypes = aSelectionDialog.resourceTypes).
                    _and(allSelectionDialogs->indexOf(anotherSelectionDialog) > allSelectionDialogs->indexOf(aSelectionDialog))))]
                [aSelectionDialog.generateFilteredResourceCollectionJsp() /]
                [aSelectionDialog.generateResourceSelectorJsp() /]
            [/if]
        [/let]
        [/for]

        [for (aCreationDialog: Dialog | aService.creationDialogs)]
        [comment Produce one only jsp-file for each set of creationDialogs that have the same Sequence (not Set) of ResourceTypes. /]
        [let allCreationDialogs: Sequence(Dialog) = anAdaptorInterface.serviceProviderCatalog.serviceProviders.services.creationDialogs]
            [if not (allCreationDialogs->excluding(aCreationDialog)->exists(anotherCreationDialog: Dialog |
                    (anotherCreationDialog.resourceTypes = aCreationDialog.resourceTypes).
                    _and(allCreationDialogs->indexOf(anotherCreationDialog) > allCreationDialogs->indexOf(aCreationDialog))))]
                [aCreationDialog.generateResourceCreatorJsp() /]
            [/if]
        [/let]
        [/for]
    [/for]
[/for]

[for (aResource: Resource | relevantResources(anAdaptorInterface))]
    [if (not basicCapabilities(anAdaptorInterface, aResource)->isEmpty())]
        [aResource.generateGetResourceJsp(anAdaptorInterface, anAdaptorInterface) /]
        [aResource.generateGetResourceSmallPreviewJsp(anAdaptorInterface, anAdaptorInterface) /]
    [/if]
[/for]
[/template]

[template public generateForRequiredAdaptors(anAdaptorInterface : AdaptorInterface)]
[for (aRequiredAdaptor: RequiredAdaptor | anAdaptorInterface.requiredAdaptors)]
    [aRequiredAdaptor.generateAdaptorClient(anAdaptorInterface) /]
[/for]
[/template]

[template public generate(anAdaptorInterface : AdaptorInterface)]
[comment @main/]
[generateCommon(anAdaptorInterface)/]
[if (not anAdaptorInterface.serviceProviderCatalog.oclIsUndefined())]
    [generateForServiceProviderCatalog(anAdaptorInterface)/]
    [generateForServiceProviders(anAdaptorInterface)/]
[else]
    [generateClientOnlyMainApplication(anAdaptorInterface)/]
[/if]
[generateForRelevantDomainSpecifications(anAdaptorInterface)/]
[generateForRelevantResources(anAdaptorInterface)/]
[generateForRequiredAdaptors(anAdaptorInterface)/]
[/template]
