<!--

    Copyright (c) 1997, 2018 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

-->

<!-- jmsConnectionEdit.jsf -->

<!initPage
    setResourceBundle(key="i18njms" bundle="org.glassfish.jms.admingui.Strings");
    setResourceBundle(key="helpjms" bundle="org.glassfish.jms.admingui.Helplinks")
/>

<!composition template="/templates/default.layout"  guiTitle="$resource{i18njms.connectionFactory.editPageTitle}" >
<!define name="content">
    <event>
        <!beforeCreate
            getRequestValue(key="name" value="#{pageSession.Name}");
            urlencode(value="#{pageSession.Name}" encoding="UTF-8" result="#{pageSession.encodedName}");
            
            gf.getEntityAttrs(endpoint="#{sessionScope.REST_URL}/resources/connector-resource/#{pageSession.encodedName}", valueMap="#{pageSession.resValueMap}");

            setPageSessionAttribute(key="poolName", value="#{pageSession.resValueMap['poolName']}" );
            urlencode(value="#{pageSession.poolName}" encoding="UTF-8" result="#{pageSession.encodedPoolName}");

            setPageSessionAttribute(key="selfPage" value="#{request.contextPath}/jms/jmsConnectionEdit.jsf?name=#{pageSession.encodedName}");
            setPageSessionAttribute(key="parentPage" value="#{request.contextPath}/jms/jmsConnections.jsf");

            setPageSessionAttribute(key="childType" value="connector-connection-pool");
            setPageSessionAttribute(key="resChildType" value="connector-resource");
            
            setPageSessionAttribute(key="convertToFalseList" value={"failAllConnections", "isConnectionValidationRequired"});
            setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/resources");
            setPageSessionAttribute(key="selfUrl", value="#{pageSession.parentUrl}/#{pageSession.childType}/#{pageSession.encodedPoolName}");
            
            gf.getEntityAttrs(endpoint="#{pageSession.selfUrl}", valueMap="#{pageSession.valueMap}");
            gf.restRequest(endpoint="#{pageSession.selfUrl}/property.json", method="GET", result="#{requestScope.propTable}");
            setPageSessionAttribute(key="tableList", value="#{requestScope.propTable.data.extraProperties.properties}");

            //Get LogicalJndiName
            createMap(result="#{requestScope.rMap}");
            mapPut(map="#{requestScope.rMap}"  key="resType" value="#{pageSession.valueMap['connectionDefinitionName']}");
            gf.restRequest(endpoint="#{sessionScope.REST_URL}/resources/list-jms-resources" attrs="#{requestScope.rMap}" method="get" result="#{requestScope.c1}");
            
            setPageSessionAttribute(key="renderLogic" value="#{false}");
            foreach (var="oneR" list="#{requestScope.c1.data.extraProperties.jmsResources}") {
                if("#{oneR['name']} = #{pageSession.Name}" ){
                    setPageSessionAttribute(key="logicalJndiName" value="#{oneR['logical-jndi-name']}" );
                    setPageSessionAttribute(key="renderLogic" value="#{true}");
                }
             }
            //set the following for including buttons.inc
            setPageSessionAttribute(key="edit" value="#{true}" );
            setPageSessionAttribute(key="showDefaultButton" value="#{false}" );
            setPageSessionAttribute(key="showCancelButton" value="#{true}" );
            setPageSessionAttribute(key="hasPropertySheet" value="#{true}" );
            setPageSessionAttribute(key="hasPropertyTable" value="#{true}" );
            //For resourceEditTabs.inc
            setSessionAttribute(key="resEditTabs" value="general");
            setPageSessionAttribute(key="generalPage" value="#{pageSession.selfPage}");
            setPageSessionAttribute(key="targetPage" value="#{request.contextPath}/common/resourceNode/resourceEditTargets.jsf?name=#{pageSession.encodedName}");

        />
    </event>

    <sun:form id="propertyForm" >
#include "/common/resourceNode/resourceEditTabs.inc"
#include "/common/shared/alertMsg_1.inc"
    <!-- Page Title -->
        <sun:title id="propertyContentPage" title="$resource{i18njms.connectionFactory.editPageTitle}" helpText="$resource{i18njms.connectionFactory.editPageTitleHelp}">
            <sun:button id="loadDefaults" style="margin-left: 8pt" primary="#{false}" text="$resource{i18n.button.LoadDefaults}" >
                <!command
                    gf.getDefaultValues( endpoint="#{pageSession.parentUrl}/#{pageSession.childType}", orig="#{pageSession.valueMap}", valueMap="#{pageSession.valueMap}")
                    gf.getDefaultValues( endpoint="#{sessionScope.REST_URL}/servers/server/server/resource-ref",  orig="#{pageSession.resourceRef}", valueMap="#{pageSession.resourceRef}");
                />
            </sun:button>
            <!facet pageButtonsTop>
                <sun:panelGroup id="topButtons">
#include "/jms/jmsConnectionButtons.inc"
                </sun:panelGroup>
            </facet>
#include "/jms/poolProperties.inc"
#include "/common/shared/propertyDescTable.inc"
        </sun:title>
        <sun:title id="title2" >
            <!facet pageButtonsBottom>
                <sun:panelGroup id="bottomButtons">
#include "/jms/jmsConnectionButtons.inc"
                </sun:panelGroup>
            </facet>
        </sun:title>
        <sun:hidden id="helpKey" value="$resource{helpjms.jmsConnectionEdit}" />
    </sun:form>
</define>
</composition>
