[comment encoding = UTF-8 /]
[comment
/*******************************************************************************
 * Copyright (c) 2017 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        - Migrating complex queries into mtl files.
 *     
 *******************************************************************************/
/]

[module queries('http://org.eclipse.lyo/oslc4j/adaptorInterface', 'http://www.eclipse.org/sirius/diagram/1.1.0')/]

[import org::eclipse::lyo::tools::toolchain::design::DialogInputServices/]

[query public visibleResources(diagram : DDiagram) : Sequence(Resource) = 
(diagram.containers->select(c : DDiagramElementContainer | 
    (c.actualMapping.name = 'Specification.DomainSpecification.Resource')._and(c.visible))).target.oclAsType(Resource)
/]

[query public invisibleParentResources(aResource : Resource, diagram : DDiagram) : OrderedSet(Resource) = 
aResource.extends->select(parent : Resource | not(visibleResources(diagram)->includes(parent)))
/]

[comment If at least one parent resource is not visible in the diagram, show textually the parent resources.
Show at least the first invisible parent resource./]
[query public labelInDomainSpecification(aResource : Resource, diagram : DDiagram) : String = 
aResource.name + 
    (if (aResource.invisibleParentResources(diagram)->size() = 0) 
    then 
        ''
    else 
        (lineSeparator() + 'extends: ' + aResource.invisibleParentResources(diagram)->first().name) 
        + (if (aResource.invisibleParentResources(diagram)->size() > 1) then ' & ...' else '' endif) 
    endif)
/]

[comment specificationDiagram/]

[query public promptForJavaFilesPath(aDomainSpecification : DomainSpecification) : String = 
let userInput : String = aDomainSpecification.promptForString('Enter relative file path',
                        'For the resources of this domain specification, enter the relative file path for their corresponding java classes.' +
                            lineSeparator() +
                            'This path will override any setting on the whole Specification, and/or a specific adaptor', 
                        aDomainSpecification.generationSetting.javaFilesPath) in
    (if (userInput = null) then 
        aDomainSpecification.generationSetting.javaFilesPath 
    else 
        userInput 
    endif) 
/]


[query public promptForJavaClassPackageName(aDomainSpecification : DomainSpecification) : String = 
let userInput : String = aDomainSpecification.promptForString('Enter the java package name',
                        'For the resources of this domain specification, enter the package name for their corresponding java classes.' +
                            lineSeparator() +
                            'This package name will override any setting on the whole Specification, and/or a specific adaptor.', 
                        aDomainSpecification.generationSetting.javaClassPackageName) in
    (if (userInput = null) then 
        aDomainSpecification.generationSetting.javaClassPackageName 
    else 
        userInput 
    endif) 
/]

[query public promptForJavaFilesPath(aSpecification : Specification) : String = 
let userInput : String = aSpecification.promptForString('Enter relative file path',
                        'For the resources of this specification, enter the relative file path for their corresponding java classes.' +
                            lineSeparator() +
                            'This path will override any setting on a specific adaptor', 
                        aSpecification.generationSetting.javaFilesPath) in
    (if (userInput = null) then 
        aSpecification.generationSetting.javaFilesPath 
    else 
        userInput 
    endif) 
/]


[query public promptForJavaClassPackageName(aSpecification : Specification) : String = 
let userInput : String = aSpecification.promptForString('Enter the java package name',
                        'For the resources of this specification, enter the package name for their corresponding java classes.' +
                            lineSeparator() +
                            'This package name will override any setting on a specific adaptor.', 
                        aSpecification.generationSetting.javaClassPackageName) in
    (if (userInput = null) then 
        aSpecification.generationSetting.javaClassPackageName 
    else 
        userInput 
    endif) 
/]
