<!--

    Copyright (c) 1997, 2020 Oracle and/or its affiliates. All rights reserved.

    This program and the accompanying materials are made available under the
    terms of the Eclipse Public License v. 2.0, which is available at
    http://www.eclipse.org/legal/epl-2.0.

    This Source Code may also be made available under the following Secondary
    Licenses when the conditions for such availability set forth in the
    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
    version 2 with the GNU Classpath Exception, which is available at
    https://www.gnu.org/software/classpath/license.html.

    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0

-->

<!-- resourceNode/resourceHandlers.inc -->

<!-- Input : tmpRows     - required
     Output: listOfRows
-->
<handler id="gfr.getResourcesTableData">
    gf.listClusters(clusters="#{pageSession.clusterList}");
    gf.listInstances(optionKeys={"standaloneonly"} optionValues={"true"}, instances="#{pageSession.standaloneList}" );
    listAdd(list="#{pageSession.standaloneList}", value="server" index="0");
    setPageSessionAttribute(key="targetList" value={});
    gf.listCombine(list="#{pageSession.targetList}",  list2="#{pageSession.clusterList}");
    gf.listCombine(list="#{pageSession.targetList}",  list2="#{pageSession.standaloneList}");

    setAttribute(key="one" value="$int{1}");
    setAttribute(key="zero" value="$int{0}");
    setAttribute(key="targetSize" value="#{pageSession.targetList.size()}");

    setPageSessionAttribute(key="listOfRows" value={});
    setAttribute(key="emptyStr" value="");

    foreach (var="oneRow" list="#{pageSession.tmpRows}") {
        setAttribute(key="resourceTargets" value={});
        setAttribute(key="enabledTargetsCount" value="$int{0}");
        setAttribute(key="enableURL" value="");
        createMap(result=>$attribute{targetsMap});
        setAttribute(key="targetUrls" value={});

        foreach (var="inst" list="#{pageSession.standaloneList}") {
            //getResourceRefTargets
            setAttribute(key="instUrl" value="#{sessionScope.REST_URL}/servers/server/#{inst}");
            gf.getChildrenNamesList(endpoint="#{instUrl}/resource-ref"
                                    result=>$attribute{serverRefs});
            gf.containedIn(list="#{serverRefs}" testStr="#{oneRow['name']}" contain=>$attribute{isTarget});
            if (#{isTarget}) {
                listAdd(list="#{resourceTargets}" value="#{oneRow['name']}");
                mapPut(map="#{targetsMap}" key="#{instUrl}" value="#{inst}");
                listAdd(list="#{targetUrls}" value="#{instUrl}");
                gf.getEntityAttrs(endpoint="#{instUrl}/resource-ref/#{oneRow['encodedName']}" valueMap="#{requestScope.refAttrs}");
                if ("#{refAttrs.enabled} = true") {
                    inc(number="#{enabledTargetsCount}" value="#{enabledTargetsCount}");
                }
            }
        }
        foreach (var="cluster" list="#{pageSession.clusterList}") {
            setAttribute(key="clusterUrl" value="#{sessionScope.REST_URL}/clusters/cluster/#{cluster}");
            gf.getChildrenNamesList(endpoint="#{clusterUrl}/resource-ref"
                                    result=>$attribute{clusterRefs});
            gf.containedIn(list="#{clusterRefs}" testStr="#{oneRow['name']}" contain=>$attribute{isTarget});
            if (#{isTarget}) {
                listAdd(list="#{resourceTargets}" value="#{oneRow['name']}");
                mapPut(map="#{targetsMap}" key="#{clusterUrl}" value="#{cluster}");
                listAdd(list="#{targetUrls}" value="#{clusterUrl}");
                gf.getEntityAttrs(endpoint="#{clusterUrl}/resource-ref/#{oneRow['encodedName']}" valueMap="#{requestScope.refAttrs}");
                if ("#{refAttrs.enabled} = true") {
                    inc(number="#{enabledTargetsCount}" value="#{enabledTargetsCount}");
                }
            }
        }
        setAttribute(key="resourceTargetSize" value="#{resourceTargets.size()}");
        //get Target Enable info
        if (#{requestScope.targetSize}=#{requestScope.one}) {
            setPageSessionAttribute(key="onlyDASExist" value="#{true}");
            if (#{resourceTargetSize} = #{zero}) {
               setAttribute(key="enabledVal" value="#{oneRow['enabled']}");
            }
            setAttribute(key="enabledVal" value="#{oneRow['enabled']}");
            //if the resource itself is disabled, only happen when user uses CLI to set the resource to false, instead of settng resource-ref to false,
            //it will be disabled, we don't even need to check the resource-ref status
            if ("#{requestScope.enabledVal} = true"){
                if (#{resourceTargetSize} > #{zero}) {
                    gf.getEntityAttrs(endpoint="#{sessionScope.REST_URL}/servers/server/server/resource-ref/#{oneRow['encodedName']}" valueMap="#{requestScope.refAttrs}");
                    setAttribute(key="enabledVal" value="#{refAttrs.enabled}");
                }
            }
            if ("#{enabledVal}=true") {
                setAttribute(key="enableURL" value="/resource/images/enabled.png");
            }
            if ("#{enabledVal}=false") {
                setAttribute(key="enableURL" value="/resource/images/disabled.png");
            }
        }
        if (#{requestScope.targetSize} > #{requestScope.one}){
            //"resourceTargetSize=0" means that there is no target associated with the resource.
            setPageSessionAttribute(key="onlyDASExist" value="#{false}");
            if (#{resourceTargetSize} = #{zero}) {
                setAttribute(key="enableURL" value="$resource{i18n.deploy.noTarget}");
            }
            if ("#{enableURL} = #{emptyStr}") {
                setAttribute(key="enableURL" value="$resource{i18n.deploy.someEnabled,$attribute{enabledTargetsCount},$attribute{resourceTargetSize}}");
            }
        }
        mapPut(map="#{oneRow}" key="targetUrls" value="#{targetUrls}");
        mapPut(map="#{oneRow}" key="targetsMap" value="#{targetsMap}");
        mapPut(map="#{oneRow}" key="enableURL" value="#{enableURL}");

        listAdd(list="#{pageSession.listOfRows}" value="#{oneRow}");
    }
</handler>

<!-- Input : selectedRows     - required
-->
<handler id="gfr.enableSelectedResources">
    // enable the resources for all targets
    foreach (var="row" list="#{pageSession.selectedRows}") {
        gf.createAttributeMap(keys={"enabled"} values={"true"} map="#{requestScope.attrMap}");
        urlencode(value="#{row['name']}" result="#{requestScope.encodedResName}");
        setAttribute(key="targetUrlsList" value="#{row['targetUrls']}");
        foreach (var="targetUrl" list="#{requestScope.targetUrlsList}") {
            gf.restRequest(
                endpoint="#{requestScope.targetUrl}/resource-ref/#{requestScope.encodedResName}"
                attrs="#{requestScope.attrMap}"
                method="POST"
                result="#{requestScope.foo}");
        }
    }
</handler>

<!-- Input : selectedRows     - required
-->
<handler id="gfr.disableSelectedResources">
    // disable the resource for all targets
    foreach (var="row" list="#{pageSession.selectedRows}") {
        gf.createAttributeMap(keys={"enabled"} values={"false"} map="#{requestScope.attrMap}");
        urlencode(value="#{row['name']}" result="#{requestScope.encodedResName}");
        setAttribute(key="targetUrlsList" value="#{row['targetUrls']}");
        foreach (var="targetUrl" list="#{requestScope.targetUrlsList}") {
            gf.restRequest(
                endpoint="#{requestScope.targetUrl}/resource-ref/#{requestScope.encodedResName}"
                attrs="#{requestScope.attrMap}"
                method="POST"
                result="#{requestScope.foo}");
        }
    }
</handler>

<!-- Input : selectedRows     - required
-->
<handler id="gfr.deleteSelectedResources">
    foreach (var="row" list="#{pageSession.selectedRows}") {
        urlencode(value="#{row['name']}" result="#{requestScope.encodedResName}");
        gf.onlyDASExist(onlyDAS="#{pageSession.onlyDASExist}");
        //if(!#{pageSession.onlyDASExist}){
            setAttribute(key="targetUrlsList" value="#{row['targetUrls']}");
            foreach (var="targetUrl" list="#{requestScope.targetUrlsList}") {
                createMap(result="#{requestScope.attrMap}");
                mapGet(Map="#{row['targetsMap']}" Key="#{requestScope.targetUrl}" Value="#{requestScope.targetVal}");
                mapPut(map="#{requestScope.attrMap}" key="target" value="#{targetVal}");
                gf.restRequest(
                    endpoint="#{requestScope.targetUrl}/resource-ref/#{requestScope.encodedResName}"
                    attrs="#{requestScope.attrMap}"
                    method="DELETE"
                    result="#{requestScope.foo}");
            }
        //}
        createMap(result="#{requestScope.attrMap}");
        if ("#{pageSession.childType}=admin-object-resource") {
            mapPut(map="#{requestScope.attrMap}" key="target" value="server-config");
        }
        if ("!(#{pageSession.childType}=admin-object-resource)") {
            mapPut(map="#{requestScope.attrMap}" key="target" value="domain");
        }
        gf.restRequest(
            endpoint="#{pageSession.parentUrl}/#{pageSession.childType}/#{requestScope.encodedResName}"
            attrs="#{requestScope.attrMap}"
            method="DELETE"
            result="#{requestScope.foo}");
    }
</handler>


<handler id="gfr.getJmsDestResources" >
        createMap(result="#{requestScope.resMap}");
        mapPut(map="#{requestScope.resMap}"  key="target" value="domain");
        mapPut(map="#{requestScope.resMap}"  key="resType" value="jakarta.jms.Queue");
        gf.restRequest(endpoint="#{sessionScope.REST_URL}/resources/list-jms-resources" attrs="#{requestScope.resMap}" method="get" result="#{requestScope.queue}");
        mapPut(map="#{requestScope.resMap}"  key="resType" value="jakarta.jms.Topic");
        gf.restRequest(endpoint="#{sessionScope.REST_URL}/resources/list-jms-resources" attrs="#{requestScope.resMap}" method="get" result="#{requestScope.topic}");
        gf.listCombine(list="#{requestScope.queue.data.extraProperties.jmsResources}" list2="#{requestScope.topic.data.extraProperties.jmsResources}" result="#{requestScope.children}");
</handler>   

<handler id="gfr.getJmsConnectionFactories" >
        createMap(result="#{requestScope.rMap}");
        mapPut(map="#{requestScope.rMap}"  key="target" value="domain");
        mapPut(map="#{requestScope.rMap}"  key="resType" value="jakarta.jms.ConnectionFactory");
        gf.restRequest(endpoint="#{sessionScope.REST_URL}/resources/list-jms-resources" attrs="#{requestScope.rMap}" method="get" result="#{requestScope.c1}");

        mapPut(map="#{requestScope.rMap}"  key="resType" value="jakarta.jms.TopicConnectionFactory");
        gf.restRequest(endpoint="#{sessionScope.REST_URL}/resources/list-jms-resources" attrs="#{requestScope.rMap}" method="get" result="#{requestScope.c2}");

        mapPut(map="#{requestScope.rMap}"  key="resType" value="jakarta.jms.QueueConnectionFactory");
        gf.restRequest(endpoint="#{sessionScope.REST_URL}/resources/list-jms-resources" attrs="#{requestScope.rMap}" method="get" result="#{requestScope.c3}");

        gf.listCombine(list="#{requestScope.c1.data.extraProperties.jmsResources}" list2="#{requestScope.c2.data.extraProperties.jmsResources}" result="#{requestScope.tmplist}");
        gf.listCombine(list="#{requestScope.tmplist}" list2="#{requestScope.c3.data.extraProperties.jmsResources}" result="#{requestScope.children}");
 
</handler>   
