<!--

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

-->

<!-- lifecycleEdit.jsf -->

<!initPage
    setResourceBundle(key="i18nc" bundle="org.glassfish.common.admingui.Strings")
    setResourceBundle(key="help_common" bundle="org.glassfish.common.admingui.Helplinks");
/>
<!composition template="/templates/default.layout"  guiTitle="$resource{i18nc.lifecycleModule.editPageTitle}" 
    guiOnLoad="admingui.nav.selectTreeNodeWithURL('#{request.contextPath}/common/applications/lifecycleEdit.jsf?appName=#{pageSession.encodedName}');"
    >
<!define name="content">
    <event>
    <!beforeCreate

        setSessionAttribute(key="lcGeneralTabs" value="general");
        setPageSessionAttribute(key="edit" value="true")
        getRequestValue(key="appName" value="#{pageSession.name}");
        urlencode(value="#{pageSession.name}" encoding="UTF-8" result="#{pageSession.encodedName}");
        setPageSessionAttribute(key="selfPage" value="#{request.contextPath}/common/applications/lifecycleEdit.jsf?appName=#{pageSession.encodedName}");
        setPageSessionAttribute(key="listPageLink" value="#{request.contextPath}/common/applications/lifecycles.jsf");
        gf.onlyDASExist(onlyDAS="#{pageSession.onlyDASExist}");
        setPageSessionAttribute(key="selfUrl" value="#{sessionScope.REST_URL}/applications/application/#{pageSession.encodedName}");
        setPageSessionAttribute(key="appRefUrl" value="#{sessionScope.REST_URL}/servers/server/server/application-ref/#{pageSession.encodedName}");
        gf.getEntityAttrs(endpoint="#{pageSession.selfUrl}", valueMap="#{pageSession.valueMap}");

        gf.restRequest(endpoint="#{sessionScope.REST_URL}/applications/application/#{pageSession.encodedName}/property.json"  method="GET" result="#{requestScope.resp}");
        setPageSessionAttribute(key="propsMap" value="#{requestScope.resp.data.extraProperties.properties}");
        gf.getTargetEnableInfo(appName="#{pageSession.name}" status="#{pageSession.status}")
        if (#{pageSession.onlyDASExist}){
            mapPut(map="#{pageSession.valueMap}"  key="enabled" value="#{pageSession.status}");
        }
        setPageSessionAttribute(key="attrList" value={"classpath" , "is-failure-fatal", "class-name", "load-order", "isLifecycle"} );
        setPageSessionAttribute(key="tableList" value={});
        foreach( var="oneProp" list="#{pageSession.propsMap}"){
            gf.containedIn(list="#{pageSession.attrList}" testStr="#{requestScope.oneProp.name}" contain="#{requestScope.contain}");
            if( #{requestScope.contain}){
                if (#{requestScope.oneProp.name}=classpath){
                    mapPut(map="#{pageSession.valueMap}"  key="classpath" value="#{requestScope.oneProp.value}");
                }
                if (#{requestScope.oneProp.name}=is-failure-fatal){
                    mapPut(map="#{pageSession.valueMap}"  key="failurefatal" value="#{requestScope.oneProp.value}");
                }
                if (#{requestScope.oneProp.name}=class-name){
                    mapPut(map="#{pageSession.valueMap}"  key="classname" value="#{requestScope.oneProp.value}");
                }
                if (#{requestScope.oneProp.name}=load-order){
                    mapPut(map="#{pageSession.valueMap}"  key="loadorder" value="#{requestScope.oneProp.value}");
                }
            }
            if (!#{requestScope.contain}){
                listAdd(list="#{pageSession.tableList}", value="#{requestScope.oneProp}")
            }
        }
        />
    </event>

            <sun:form id="propertyForm">

#include "/common/applications/lifecycleTabs.inc"
#include "/common/shared/alertMsg_1.inc"

        <!-- Page Title -->
<sun:title id="propertyContentPage" title="$resource{i18nc.lifecycleModule.editPageTitle}" helpText="$resource{i18nc.lifecycleModule.editPageTitleHelp}">
#include "/common/applications/lifecycleButtons.inc"
</sun:title>
        "<br><br>
#include "/common/applications/lifecycleAttr.inc"
#include "/common/shared/propertyDescTable.inc"
	<sun:hidden id="helpKey" value="$resource{help_common.lifecycleEdit}" />
        </sun:form>
</define>
</composition>

