<!--

    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/connectorSecurityMaps.jsf -->

<!initPage
    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.connectorSecurityMaps.pageTitle}">
<!define name="content">
    <event>
    <!beforeCreate
        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/connector-connection-pool/#{pageSession.encodedName}");
            }
            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/connector-connection-pool/#{pageSession.encodedName}");
            }
            setPageSessionAttribute(key="parentPage" value="#{request.contextPath}/common/applications/resources/appScopedResources.jsf?appName=#{pageSession.encodedAppName}&listPageLink=/common/applications/applications.jsf");
            setPageSessionAttribute(key="showSecurityButtons" value="#{false}");
        }
        if(!#{pageSession.isAppScopedRes}){
            setPageSessionAttribute(key="isAppScopedRes" value="$boolean{false}");
            setPageSessionAttribute(key="parentPage" value="#{request.contextPath}/jca/connectorConnectionPools.jsf");
            setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/resources/connector-connection-pool/#{pageSession.encodedName}");
            setPageSessionAttribute(key="showSecurityButtons" value="#{true}");
        }
        setSessionAttribute(key="connectorPoolTabs" value="securityMapTab");
        setPageSessionAttribute(key="childType" value="security-map");
        gf.getChildList(parentEndpoint="#{pageSession.parentUrl}", childType="#{pageSession.childType}", result="#{requestScope.tmpRows}");
        setAttribute(key="listOfRows" value="#{requestScope.tmpRows}");
        setPageSessionAttribute(key="confirmDeleteMsg" value="$resource{i18njca.msg.JS.confirmDeleteSM}");
        setPageSessionAttribute(key="createLink" value="#{request.contextPath}/jca/connectorSecurityMapNew.jsf?name=#{pageSession.encodedName}");
        setPageSessionAttribute(key="listLink" value="#{request.contextPath}/jca/connectorSecurityMaps.jsf?name=#{pageSession.encodedName}#{pageSession.selfPageArgs}");
        setPageSessionAttribute(key="editLink" value="#{request.contextPath}/jca/connectorSecurityMapEdit.jsf?name=#{pageSession.encodedName}#{pageSession.selfPageArgs}");
        setPageSessionAttribute(key="tableTitle" value="$resource{i18njca.connectorSecurityMaps.tableTitle}");
    />
    </event>

            <sun:form id="propertyForm">
#include "/jca/connectorConnectionPoolTabs.inc"
#include "/common/shared/alertMsg_1.inc"
                 <sun:title id="propertyContentPage" title="$resource{i18njca.connectorSecurityMaps.pageTitle}"
                 helpText="$resource{i18njca.connectorSecurityMaps.pageTitleHelp}" />
     "<br /> <br />
#include "/common/resourceNode/poolNameSection.inc"
#include "/jca/securityMapsTable.inc"

  <sun:hidden id="helpKey" value="$resource{help_jca.connectorSecurityMaps}" />
            </sun:form>
</define>
</composition>
