<!--

    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

-->

<!initPage
    setResourceBundle(key="i18njms" bundle="org.glassfish.jms.admingui.Strings");
    setResourceBundle(key="helpjms" bundle="org.glassfish.jms.admingui.Helplinks")
/>

<!composition template="/templates/default.layout"  guiTitle="$resource{i18njms.jmsPhysDestinations.editPageTitle}" >
<!define name="content">
    <event>
    <!beforeCreate
        setPageSessionAttribute(key="pageTitle" value="$resource{i18njms.jmsPhysDestinations.editPageTitle}");
        setPageSessionAttribute(key="pageTitleHelp" value="$resource{i18njms.jmsPhysDestinations.editPageHelp}");
        setPageSessionAttribute(key="parentPage" value="#{param.parentPage}");
        setPageSessionAttribute(key="target" value="#{param.target}");
        setPageSessionAttribute(key="edit" value="#{true}");
        getRequestValue(key="name" value=>$page{destName});
        getRequestValue(key="type" value=>$page{destType});
        setPageSessionAttribute(key="selfPage" value="#{request.contextPath}/jms/physdest/jmsPhysicalDestinationEdit.jsf?name=#{pageSession.destName}&type=#{pageSession.destType}&target=#{pageSession.target}&parentPage=#{pageSession.parentPage}")

        if ("#{targetType} = instance") {
            setPageSessionAttribute(key="baseUrl", value="#{sessionScope.REST_URL}/servers/server/#{pageSession.target}");
        }
        if ("#{targetType} = cluster") {
            setPageSessionAttribute(key="baseUrl", value="#{sessionScope.REST_URL}/clusters/cluster/#{pageSession.target}");
        }

        gf.restRequest(endpoint="#{pageSession.baseUrl}/__get-jmsdest?id=#{pageSession.destName}&destType=#{pageSession.destType}", method="get", result="#{requestScope.restResponse}");
        setPageSessionAttribute(key="valueMap", value="#{requestScope.restResponse.data.extraProperties.entity}");
    />
    </event>
    <sun:form id="jmsPhysDestForm">
#include "/common/shared/alertMsg.inc"
#include "jmsPhysicalDestinationSheet.inc"
        <sun:hidden id="helpKey" value="$resource{helpjms.jmsPhysicalDestinationEdit}" />
    </sun:form>
    "<br/><br/>
</define>
</composition>
