<!--

    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="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.resourceAdapterConfig.editPageTitle}" >
<!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="selfPage" value="#{request.contextPath}/jca/resourceAdapterConfigEdit.jsf?name=#{pageSession.encodedName}&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="selfPage" value="#{request.contextPath}/jca/resourceAdapterConfigEdit.jsf?name=#{pageSession.encodedName}&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="selfPage" value="#{request.contextPath}/jca/resourceAdapterConfigEdit.jsf?name=#{pageSession.encodedName}");
        setPageSessionAttribute(key="parentPage" value="#{request.contextPath}/jca/resourceAdapterConfigs.jsf");
        setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/resources");
    }
    setPageSessionAttribute(key="childType" value="resource-adapter-config");
    setPageSessionAttribute(key="selfUrl", value="#{pageSession.parentUrl}/#{pageSession.childType}/#{pageSession.encodedName}");
    setPageSessionAttribute(key="rest-api" value="true");

    gf.getEntityAttrs(endpoint="#{pageSession.selfUrl}", valueMap="#{pageSession.valueMap}");
    
    gf.restRequest(endpoint="#{pageSession.selfUrl}/property.json", method="GET", result="#{requestScope.propTable}");
    createMap(result="#{pageSession.argMap}");
    mapPut(map="#{pageSession.argMap}" key="rarName" value="#{pageSession.Name}");
    gf.restRequest(endpoint="#{sessionScope.REST_URL}/resources/get-resource-adapter-config-properties"
            attrs="#{pageSession.argMap}"
            method="GET"
            result="#{requestScope.result}");
            
    gf.buildConfidentialPropsTable(propsMaps="#{requestScope.propTable.data.extraProperties.properties}", confidentialList="#{requestScope.result.data.extraProperties.confidentialConfigProps}",   result="#{pageSession.tableList}" hasConfidentialProps="#{pageSession.hasConfidential}");
    setPageSessionAttribute(key="edit" value="#{true}" );
    setPageSessionAttribute(key="skipAttrsList", value={"resourceAdapterName"});
    />
</event>
<sun:form id="propertyForm">
#include "/common/shared/alertMsg_1.inc"
    
    <!-- Page Title -->
    <sun:title id="propertyContentPage" title="$resource{i18njca.resourceAdapterConfig.editPageTitle}" helpText="$resource{i18njca.resourceAdapterConfig.editPageTitleHelp}" >
#include "/jca/resourceAdapterConfigButtons.inc"
    </sun:title>
    
#include "/jca/resourceAdapterConfigAttr.inc"
#include "/common/resourceNode/confidentialPropsTable.inc"
    
    <sun:hidden id="helpKey" value="$resource{help_jca.resourceAdapterConfigEdit}" />
</sun:form>
            "<br/>
#include "/common/shared/changeButtonsJS.inc" 
</define>
</composition>


