<!--

    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="i18n_ejbLite" bundle="org.glassfish.ejb-lite.admingui.Strings");
    setResourceBundle(key="help_ejb" bundle="org.glassfish.ejb.admingui.Helplinks");
/>
<!composition template="/templates/default.layout"  guiTitle="$resource{i18n_ejb.headings.ejbMdbSettings}" >
<!define name="content">
<event>
    <!beforeCreate
        setSessionAttribute(key="ejbContainerTabs" value="mdbSettingsTab");
        getRequestValue(key="configName" value=>$page{configName} default="server-config");
        setPageSessionAttribute(key="childType" value="mdb-container");
        setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/configs/config/#{pageSession.configName}");
        setPageSessionAttribute(key="selfUrl", value="#{sessionScope.REST_URL}/configs/config/#{pageSession.configName}/mdb-container");
        setPageSessionAttribute(key="rest-api" value="true");
        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/ejbContainerMDBSettings.jsf?configName=#{pageSession.configName}");
        //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="form1">
#include "/ejb-lite/configuration/ejbContainerTabs.inc"
#include "/common/shared/alertMsg.inc"
<sun:title id="propertyContentPage" title="$resource{i18n_ejb.headings.ejbMdbSettings}" helpText="$resource{i18n_ejb.ejb.ejbMdbSettingsInfo}" >
#include "/common/shared/editPageButtons.inc"
</sun:title>


     <!-- PropertySheet .... -->
     <sun:propertySheet id="propertySheet">
         <!-- Text Field section -->
#include "/common/shared/configNameSection.inc"
         <sun:propertySheetSection id="propertySectionTextField">
             <sun:property id="MinSizeProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_ejbLite.ejbSettings.minSizeLabel}" helpText="$resource{i18n_ejbLite.ejbSettings.minSizeHelp}">
                 <sun:textField id="MinSize" styleClass="integer" columns="$int{20}" maxLength="#{sessionScope.fieldLengths['maxLength.ejbSettings.minSize']}" text="#{pageSession.valueMap['steadyPoolSize']}" />
                 <sun:staticText id="nobeans" style="padding: 8pt" text="$resource{i18n_ejb.ejb.NumBeans}"/>
             </sun:property>
             <sun:property id="MaxSizeProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_ejbLite.ejbSettings.maxSizeLabel}" helpText="$resource{i18n_ejbLite.ejbSettings.maxSizeHelp}">
                 <sun:textField id="MaxSize" styleClass="integer" columns="$int{20}" maxLength="#{sessionScope.fieldLengths['maxLength.ejbSettings.maxSize']}" text="#{pageSession.valueMap['maxPoolSize']}" />
                 <sun:staticText id="nobeans" style="padding: 8pt" text="$resource{i18n_ejb.ejb.NumBeans}"/>
             </sun:property>
             <sun:property id="PoolResizeProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_ejbLite.ejbSettings.poolResizeLabel}" helpText="$resource{i18n_ejbLite.ejbSettings.poolResizeHelp}">
                 <sun:textField id="PoolResize" styleClass="integer" columns="$int{20}" maxLength="#{sessionScope.fieldLengths['maxLength.ejbSettings.poolResize']}" text="#{pageSession.valueMap['poolResizeQuantity']}" />
                 <sun:staticText id="nobeans" style="padding: 8pt" text="$resource{i18n_ejb.ejb.NumBeans}"/>
             </sun:property>
             <sun:property id="TimeoutProp"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n_ejb.ejbMdbSettings.timeoutLabel}" helpText="$resource{i18n_ejb.ejbMdbSettings.timeoutHelp}">
                 <sun:textField id="Timeout" styleClass="integer" columns="$int{20}" maxLength="#{sessionScope.fieldLengths['maxLength.ejbMdbSettings.timeout']}" style="padding-bottom 8pt" text="#{pageSession.valueMap['idleTimeoutInSeconds']}" />
                 <sun:staticText id="sec" style="padding: 8pt" text="$resource{i18n.common.Seconds}"/>
             </sun:property>
         </sun:propertySheetSection>
     </sun:propertySheet>


#include "/common/shared/propertyDescTable.inc"

	<sun:hidden id="helpKey" value="$resource{help_ejb.ejbContainerMDBSettings}" />
    </sun:form>
    "<br/>
#include "/common/shared/changeButtonsJS.inc"
</define>
</composition>

