<!--

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

-->

<!-- concurent/managedScheduledExecutorServiceNew.jsf -->

<!initPage
    setResourceBundle(key="i18ncon" bundle="org.glassfish.concurrent.admingui.Strings");
    setResourceBundle(key="help_con" bundle="org.glassfish.concurrent.admingui.Helplinks")
    setAttribute(key="edit" value="#{false}");
/>
<!composition template="/templates/default.layout"  guiTitle="$resource{i18ncon.managedScheduledExecutorService.newPageTitle}" >
<!define name="content">
    <event>
    <!beforeCreate
        getRequestValue(key="target" value="#{pageSession.targetValue}");
        setPageSessionAttribute(key="parentPage" value="#{request.contextPath}/concurrent/managedScheduledExecutorServices.jsf");
        setPageSessionAttribute(key="childType" value="managed-scheduled-executor-service");
        setPageSessionAttribute(key="isConcurrent" value="true");
        setPageSessionAttribute(key="convertToFalseList" value={"enabled", "contextInfoEnabled", "longRunningTasks", "hungLoggerPrintOnce" });
        setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/resources");
        gf.getDefaultValues(endpoint="#{pageSession.parentUrl}/#{pageSession.childType}", valueMap="#{pageSession.valueMap}");
        setPageSessionAttribute(key="edit" value="#{false}" );
        createMap(result="#{pageSession.valueMap2}")
        mapPut(map="#{pageSession.valueMap}" key="enabled" value="true");
        mapPut(map="#{pageSession.valueMap2}" key="enabled" value="true");
        setPageSessionAttribute(key="useString" value="#{false}");
        setPageSessionAttribute(key="showMaxPoolSize" value="#{false}");
        setPageSessionAttribute(key="showTaskQueue" value="#{false}");
    />
    </event>
    "    <script type="text/javascript">admingui.nav.selectTreeNodeById(admingui.nav.TREE_ID+":resources:concurrent:managedScheduledExecutorServices");</script>
    <sun:form id="form">
#include "/common/shared/alertMsg_1.inc"

        <sun:title id="propertyContentPage" title="$resource{i18ncon.managedScheduledExecutorService.newPageTitle}" helpText="$resource{i18ncon.managedScheduledExecutorService.newPageTitleHelp}">
#include "/common/resourceNode/resourceEditPageButtons.inc"
        </sun:title>
#include "/concurrent/managedExecutorServiceAttr.inc"
#include "/common/shared/propertyDescTable.inc"
<event>
<!afterCreate
    setPageSessionAttribute(key="setDefaultTarget" value="true");
    includeIntegrations(type="org.glassfish.admingui:TargetSectionForResource" );
/>
</event>


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