<!--

    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

-->

<!-- jca/jcaResourceEdit.jsf -->
<!initPage
    setResourceBundle(key="i18n" bundle="org.glassfish.admingui.core.Strings")
    setResourceBundle(key="i18njca" bundle="org.glassfish.jca.admingui.Strings");
    setResourceBundle(key="help_jca" bundle="org.glassfish.jca.admingui.Helplinks")
/>
<!composition template="/templates/default.layout"  guiTitle="$resource{i18njca.connectorConnectionPool.editPageTitle}" >
<!define name="content">
<event>
    <!beforeCreate
        setSessionAttribute(key="connectorPoolTabs" value="general");
        getRequestValue(key="name" value="#{pageSession.Name}");
        urlencode(value="#{pageSession.Name}" encoding="UTF-8" result="#{pageSession.encodedName}");
        getRequestValue(key="isAppScopedRes" value="#{pageSession.isAppScopedRes}");
        if(#{pageSession.isAppScopedRes}){
            getRequestValue(key="appName" value="#{pageSession.encodedAppName}");
            getRequestValue(key="moduleName" value="#{pageSession.moduleName}");
            if(#{pageSession.moduleName}) {
                urlencode(value="#{pageSession.moduleName}" encoding="UTF-8" result="#{pageSession.encodedModuleName}");
                setPageSessionAttribute(key="selfPageArgs" value="&isAppScopedRes=$boolean{true}&appName=#{pageSession.encodedAppName}&moduleName=#{pageSession.encodedModuleName}");
                setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/applications/application/#{pageSession.encodedAppName}/module/#{pageSession.encodedModuleName}/resources");
            }
            if(!#{pageSession.moduleName}) {
                setPageSessionAttribute(key="selfPageArgs" value="&isAppScopedRes=$boolean{true}&appName=#{pageSession.encodedAppName}");
                setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/applications/application/#{pageSession.encodedAppName}/resources");
            }
            setPageSessionAttribute(key="parentPage" value="#{request.contextPath}/common/applications/resources/appScopedResources.jsf?appName=#{pageSession.encodedAppName}&listPageLink=/common/applications/applications.jsf");
        }
        if(!#{pageSession.isAppScopedRes}){            
            setPageSessionAttribute(key="parentPage" value="#{request.contextPath}/jca/connectorConnectionPools.jsf");
            setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/resources");
        }
        setPageSessionAttribute(key="selfPage" value="#{request.contextPath}/jca/connectorConnectionPoolEdit.jsf?name=#{pageSession.encodedName}#{pageSession.selfPageArgs}");
        setPageSessionAttribute(key="childType" value="connector-connection-pool");
        //REST related
        setPageSessionAttribute(key="selfUrl", value="#{pageSession.parentUrl}/#{pageSession.childType}/#{pageSession.encodedName}");
        setPageSessionAttribute(key="rest-api" value="true");
        setPageSessionAttribute(key="poolGeneralAttrs" value={"name" "resourceAdapterName" "connectionDefinitionName"
            "ping" "deploymentOrder" "description" "steadyPoolSize" "maxPoolSize" "poolResizeQuantity"
            "idleTimeoutInSeconds" "maxWaitTimeInMillis" "isConnectionValidationRequired"
            "failAllConnections" "transactionSupport"});
        gf.getEntityAttrs(endpoint="#{pageSession.selfUrl}", valueMap="#{pageSession.valueMap}");
        gf.filterMap(map="#{pageSession.valueMap}" attrNames="#{pageSession.poolGeneralAttrs}" resultMap="#{pageSession.valueMap}");

        setPageSessionAttribute(key="convertToFalseList" value={"ping" "isConnectionValidationRequired" "failAllConnections" "associateWithThread" "ConnectionLeakReclaim" "lazyConnectionAssociation" "lazyConnectionEnlistment" "matchConnections" });
        setPageSessionAttribute(key="skipAttrsList", value={"JndiName"});
        setPageSessionAttribute(key="edit" value="#{true}" );
        setPageSessionAttribute(key="showDefaultButton" value="#{true}" );

        //To get the connection definitions for RA
        if (!#{resAdapterChoosen}) {
            setAttribute(key="resAdapterName" value="#{pageSession.valueMap.resourceAdapterName}");
        }
        if (#{resAdapterChoosen}) {
            setAttribute(key="resAdapterName" value="#{resAdapterChoosen}");
            mapPut(map="#{pageSession.valueMap}" key="resourceAdapterName" value="#{resAdapterChoosen}");
        }
        if(#{resAdapterName}) {
            gf.createAttributeMap(keys={"rarName"} values={"$attribute{resAdapterName}"} map="#{requestScope.connDefAttrs}");
            gf.restRequest(endpoint="#{sessionScope.REST_URL}/resources/get-connection-definition-names"
                           attrs="#{requestScope.connDefAttrs}"
                           method="GET"
                           result="#{requestScope.result}");
            setPageSessionAttribute(key="cdList" value="#{requestScope.result.data.extraProperties.defnNames}");
        }
    />
</event>
<sun:form id="propertyForm">
#include "/common/applications/applicationHandlers.inc"
#include "/jca/connectorConnectionPoolTabs.inc"    
#include "/common/shared/alertMsg_1.inc"
    
    <!-- Page Title -->
    <sun:title id="propertyContentPage" title="$resource{i18njca.connectorConnectionPool.editPageTitle}" helpText="$resource{i18njca.connectorConnectionPool.editPageTitleHelp}" >
    <!beforeCreate
        setPageSessionAttribute(key="snifferType" value="connector");
        gfr.getApplicationsBySnifferType();
        setAttribute(key="rarList" value="#{pageSession.snifferTypeApplicationsList}");
        //Add SystemConnectors
        setPageSessionAttribute(key="modList" value={});
        if ("#{sessionScope._jms_exist}"){
            gf.restRequest(endpoint="#{sessionScope.REST_URL}/resources/get-system-rars-allowing-pool-creation"
                       method="GET"
                       result="#{requestScope.result}");
            setPageSessionAttribute(key="modList" value="#{requestScope.result.data.extraProperties.rarList}");
        }
        gf.listCombine(list="#{pageSession.modList}" list2="#{requestScope.rarList}");
        filterOutRarExtension(inList="#{pageSession.modList}" convertedList="#{pageSession.modList}");
    />
    <!facet pageButtonsTop>
    <sun:panelGroup id="topButtons">
        <sun:button id="saveButton" rendered="#{edit}" text="$resource{i18n.button.Save}"
                onClick="if (guiValidate('#{reqMsg}','#{reqInt}','#{reqPort}')) {submitAndDisable(this, '$resource{i18n.button.Processing}');}; return false;" >
            <!command
                gf.updateEntity(endpoint="#{pageSession.selfUrl}"  attrs="#{pageSession.valueMap}"
                    skipAttrs="#{pageSession.skipAttrsList}"
                    convertToFalse="#{pageSession.convertToFalseList}"
                    onlyUseAttrs="#{pageSession.onlyUseAttrs}"
                );
                prepareSuccessfulMsg();
                if ("#{valueMap['ping']}") {
                    urlencode(value="#{valueMap['name']}" encoding="UTF-8" result="#{pageSession.encodeName}");
                    gf.createAttributeMap(keys={"id"} values={"$pageSession{encodeName}"} map="#{requestScope.attrMap}");
                    if(#{pageSession.isAppScopedRes}){
                        mapPut(map="#{requestScope.attrMap}" key="appname" value="#{pageSession.encodedAppName}");
                        if(#{pageSession.moduleName}){
                            mapPut(map="#{requestScope.attrMap}" key="modulename" value="#{pageSession.encodedModuleName}");
                        }
                    }
                    gf.restRequest(endpoint="#{sessionScope.REST_URL}/resources/ping-connection-pool"
                                   attrs="#{requestScope.attrMap}"
                                   method="GET"
                                   result="#{requestScope.result}");
                    if ("#{requestScope.result.data['exit_code']} = SUCCESS") {
                         prepareAlertMsg(summary="$resource{i18n.msg.PingSucceed}", type="success");
                    }
                    if ("!(#{requestScope.result.data['exit_code']} = SUCCESS)") {
                         prepareAlertMsg(summary="$resource{i18njca.msg.warning.poolSavedPingFailed}", type="error");
                    }
                }
                gf.redirect(page="#{pageSession.selfPage}&alertType=${alertType}&alertSummary=${alertSummary}&alertDetail=${alertDetail}");
            />
            </sun:button>
            <sun:button id="cancelButton" immediate="#{true}" primary="#{false}" text="$resource{i18n.button.Cancel}" >
                <!command
                    gf.redirect(page="#{parentPage}");
                />
            </sun:button>
        </sun:panelGroup>
    </facet>
#include "/common/shared/editPageLoadDefaultButton.inc"
    <sun:button id="flush" text="$resource{i18njca.button.Flush}" primary="#{false}" >
        <!command
            gf.createAttributeMap(keys={"id"} values={"$pageSession{Name}"} map="#{requestScope.attrMap}");
            if(#{pageSession.isAppScopedRes}){
                mapPut(map="#{requestScope.attrMap}" key="appname" value="#{pageSession.encodedAppName}");
                if(#{pageSession.moduleName}){
                    mapPut(map="#{requestScope.attrMap}" key="modulename" value="#{pageSession.encodedModuleName}");
                }
            }
            gf.restRequest(endpoint="#{sessionScope.REST_URL}/resources/flush-connection-pool"
                           attrs="#{requestScope.attrMap}"
                           method="POST"
                           result="#{requestScope.result}");
            if ("#{requestScope.result.data['exit_code']} = SUCCESS") {
                 prepareAlertMsg(summary="$resource{i18n.msg.FlushSucceed}", type="success");
            }
        />
    </sun:button>
    <sun:button id="ping"  text="$resource{i18n.button.Ping}" primary="#{false}" >
        <!command
            gf.createAttributeMap(keys={"id"} values={"$pageSession{Name}"} map="#{requestScope.attrMap}");
            if(#{pageSession.isAppScopedRes}){
                mapPut(map="#{requestScope.attrMap}" key="appname" value="#{pageSession.encodedAppName}");
                if(#{pageSession.moduleName}){
                    mapPut(map="#{requestScope.attrMap}" key="modulename" value="#{pageSession.encodedModuleName}");
                }
            }
            gf.restRequest(endpoint="#{sessionScope.REST_URL}/resources/ping-connection-pool"
                           attrs="#{requestScope.attrMap}"
                           method="GET"
                           result="#{requestScope.result}");
            if ("#{requestScope.result.data['exit_code']} = SUCCESS") {
                 prepareAlertMsg(summary="$resource{i18n.msg.PingSucceed}", type="success");
            }
        />
    </sun:button>

    </sun:title>

#include "/jca/connectorConnectionPoolAttrEdit.inc"

    <sun:hidden id="helpKey" value="$resource{help_jca.connectorConnectionPoolEdit}" />
</sun:form>
            "<br/>
#include "/common/shared/changeButtonsJS.inc" 
</define>
</composition>


