<!--

    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

-->

<!-- resourceNode/externalResourceEdit.jsf -->

<!initPage
    setResourceBundle(key="i18njmail" bundle="org.glassfish.full.admingui.Strings");
    setResourceBundle(key="help_jmail" bundle="org.glassfish.full.admingui.Helplinks")
/>
<!composition template="/templates/default.layout"  guiTitle="$resource{i18njmail.jndiResource.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}/full/externalResourceEdit.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}/full/externalResourceEdit.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}/full/externalResourceEdit.jsf?name=#{pageSession.encodedName}");
        setPageSessionAttribute(key="parentPage" value="#{request.contextPath}/full/externalResources.jsf");
        setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/resources");
    }
    setPageSessionAttribute(key="childType" value="external-jndi-resource");
    //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}");
    
    setPageSessionAttribute(key="selfUrl", value="#{pageSession.parentUrl}/#{pageSession.childType}/#{pageSession.encodedName}");
    gf.getEntityAttrs(endpoint="#{pageSession.selfUrl}", valueMap="#{pageSession.valueMap}");
    setPageSessionAttribute(key="convertToFalseList" value={"enabled"});
    setPageSessionAttribute(key="skipAttrsList", value={"jndiName"});
    setPageSessionAttribute(key="factoryClassHelpText" value="$resource{i18njmail.jndiResource.factoryClassHelp}");
    setPageSessionAttribute(key="showJndiLookup" value="#{true}");
    
    gf.restRequest(endpoint="#{pageSession.selfUrl}/property.json" method="GET" result="#{requestScope.propTable}");
    setPageSessionAttribute(key="tableList" value="#{requestScope.propTable.data.extraProperties.properties}");

    gf.restRequest(endpoint="#{sessionScope.REST_URL}/resources/get-built-in-custom-resources"
                   method="GET"
                   result="#{requestScope.result}");
    setPageSessionAttribute(key="propsMap" value="#{requestScope.result.data.extraProperties.builtInCustomResources}");
    
    if(#{resChosen}) {
            setPageSessionAttribute(key="factoryClass", value="#{pageSession.propsMap['$attribute{resChosen}']");
            mapPut(map="#{pageSession.valueMap}" key="jndiName" value="#{jndiName}")
            mapPut(map="#{pageSession.valueMap}" key="description" value="#{desc}")
            mapPut(map="#{pageSession.valueMap}" key="enabled" value="#{status}")
            mapPut(map="#{pageSession.valueMap}" key="factoryClass" value="#{pageSession.factoryClass}")
            mapPut(map="#{pageSession.valueMap}" key="resType" value="#{resChosen}")
            mapPut(map="#{pageSession.valueMap}" key="jndiLookupName" value="#{jndiLookup}")
            setPageSessionAttribute(key="tableList" value="#{newList}");
    }
    gf.getJndiResourceAttrForEdit(resources="#{pageSession.propsMap}" resType="#{pageSession.valueMap['resType']}", result="#{pageSession.builtInEntries}", classnameOption=>$page{classnameOption}, attrMap="#{pageSession.attrMap}", factoryMap="#{pageSession.factoryMap}");
    setPageSessionAttribute(key="myOption" value="#{classnameOption}");
    //set the following for including buttons.inc
    setPageSessionAttribute(key="edit" value="#{true}" );
    setPageSessionAttribute(key="showCancelButton" value="#{true}" );
    setPageSessionAttribute(key="hasPropertySheet" value="#{true}" );
    setPageSessionAttribute(key="hasPropertyTable" value="#{true}" );

    setPageSessionAttribute(key="convertToFalseList2" value={"enabled"});
    
    />
</event>
<sun:form id="form">
#include "/common/resourceNode/resourceEditTabs.inc"
#include "/common/shared/alertMsg_1.inc"
    
    <!-- Page Title -->
    <sun:title id="propertyContentPage" title="$resource{i18njmail.jndiResource.editPageTitle}" helpText="$resource{i18njmail.jndiResource.editPageTitleHelp}" >
#include "/full/jndiButtons.inc"
    </sun:title>
    "<br><br>
    
#include "/full/jndiResourceAttr.inc"
#include "/common/shared/propertyDescTable.inc"
    
    <sun:hidden id="helpKey" value="$resource{help_jmail.customResourceEdit}" />
</sun:form>
#include "/full/jndijs.inc"
            "<br/>
#include "/common/shared/changeButtonsJS.inc"
</define>
</composition>
