<!--

    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

-->

<!initPage
    setResourceBundle(key="i18n_ejb" bundle="org.glassfish.ejb.admingui.Strings");
    setResourceBundle(key="i18ncs" bundle="org.glassfish.cluster.admingui.Strings")
    setResourceBundle(key="help_ejb" bundle="org.glassfish.ejb.admingui.Helplinks");
/>

<!composition template="/templates/default.layout"  guiTitle="$resource{i18n_ejb.availability.ejbContainerAvailability}" >

<!define name="content">
    <event>
    <!beforeCreate
        setSessionAttribute(key="availabilityTabs" value="ejbAvailabilityTab");
        getRequestValue(key="configName" value=>$page{configName} default="server-config");
        setPageSessionAttribute(key="childType" value="ejb-container-availability");
        setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/configs/config/#{pageSession.configName}/availability-service");
        setPageSessionAttribute(key="selfUrl", value="#{pageSession.parentUrl}/#{pageSession.childType}");
        setPageSessionAttribute(key="rest-api" value="true");
        gf.checkIfEndPointExist(endpoint="#{pageSession.selfUrl}/property" exists="#{pageSession.edit}");
        if(!#{edit}) {
            gf.restRequest(endpoint="#{pageSession.selfUrl}" method="POST");
        }
        gf.getEntityAttrs(endpoint="#{pageSession.selfUrl}.json", valueMap="#{pageSession.valueMap}");
        gf.restRequest(endpoint="#{pageSession.selfUrl}/property.json" method="GET" result="#{requestScope.propTable}");
        setPageSessionAttribute(key="tableList" value="#{requestScope.propTable.data.extraProperties.properties}");
        setPageSessionAttribute(key="selfPage" value="#{request.contextPath}/ejb/configuration/ejbAvailabilityService.jsf?configName=#{pageSession.configName}");
        setPageSessionAttribute(key="convertToFalseList" value={"availabilityEnabled", "persistenceStoreHealthCheckEnabled"});
        //set the following for including buttons.inc
        setPageSessionAttribute(key="edit" value="#{true}" );
        setPageSessionAttribute(key="showDefaultButton" value="#{true}" );
        setPageSessionAttribute(key="showCancelButton" value="#{false}" );
        setPageSessionAttribute(key="hasPropertySheet" value="#{true}" );
        setPageSessionAttribute(key="hasPropertyTable" value="#{true}" );
    />
    </event>
    <sun:form id="propertyForm">
#include "/cluster/availability/availabilityTabs.inc"
#include "/common/shared/alertMsg.inc"
    <sun:title id="propertyContentPage" title="$resource{i18n_ejb.availability.ejbContainerAvailability}" helpText="$resource{i18n_ejb.availability.ejbContainerAvailabilityInfo}">
#include "/common/shared/editPageButtons.inc"
    </sun:title>
        <sun:propertySheet id="propertySheet">
#include "/common/shared/configNameSection.inc"
            <sun:propertySheetSection id="propertSectionTextField">
                <sun:property id="AvailabilityEnabledProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18ncs.availability.availabilityService}" helpText="$resource{i18n_ejb.availability.ejbAvailabilityServiceHelp}">
                    <sun:checkbox  selected="#{pageSession.valueMap['availabilityEnabled']}" selectedValue="true" />
                </sun:property>
                <sun:property id="HAPersistenceTypeProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_ejb.availability.haPersistenceType}" helpText="$resource{i18n_ejb.availability.haPersistenceTypeHelp}">
                    <sun:dropDown id="HAPersistenceType" selected="#{pageSession.valueMap['sfsbHaPersistenceType']}" labels="#{pageSession.persistenceType}">
                        <!beforeCreate
                            createMap(result="#{pageSession.attrMap}");
                            mapPut(map="#{pageSession.attrMap}" key="type" value="ejb");
                            gf.restRequest(endpoint="#{sessionScope.REST_URL}/list-persistence-types" attrs="#{pageSession.attrMap}" method="GET" result="#{pageSession.result}");
                            setPageSessionAttribute(key="persistenceType" value="#{pageSession.result.data.extraProperties.types}");
                        />
                    </sun:dropDown>
                </sun:property>
                <sun:property id="SFSBPersistenceTypeProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_ejb.availability.sfsbPersistenceType}" helpText="$resource{i18n_ejb.availability.sfsbPersistenceTypeHelp}">
                    <sun:dropDown id="SFSBPersistenceType" selected="#{pageSession.valueMap['sfsbPersistenceType']}" labels="#{pageSession.persistenceType}">
                    </sun:dropDown>
                </sun:property>
            </sun:propertySheetSection>
        </sun:propertySheet>
    "<br/><br/>
#include "/common/shared/propertyDescTable.inc"
    <sun:title id="propertyContentPage2">
#include "/common/shared/editPageButtons_2.inc"
    </sun:title>
        <sun:hidden id="helpKey" value="$resource{help_ejb.ejbContainerAvailability}" />
    </sun:form>
#include "/common/shared/changeButtonsJS.inc"
</define>
</composition>
