<!--

    Copyright (c) 2010, 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" bundle="org.glassfish.admingui.core.Strings")
    setResourceBundle(key="i18nc" bundle="org.glassfish.common.admingui.Strings")
    setResourceBundle(key="i18ncs" bundle="org.glassfish.cluster.admingui.Strings")
    setResourceBundle(key="help_cluster" bundle="org.glassfish.cluster.admingui.Helplinks");
/>
<!composition template="/templates/default.layout"  guiTitle="" >
<!define name="content">
    <event>
    <!beforeCreate
        getRequestValue(key="instanceName" value="#{pageSession.target}");
        setPageSessionAttribute(key="instanceName" value="#{pageSession.target}");
        gf.isInstanceName(instanceName="#{pageSession.instanceName}" exists="#{requestScope.exists}" );
        if (! #{requestScope.exists}){
            gf.redirect("#{request.contextPath}/cluster/standalone/standaloneInstances.jsf");
        }
        getRequestValue(key="filterValue" value="#{pageSession.filterValue}");
        urlencode(value="#{pageSession.target}" encoding="UTF-8" result="#{pageSession.encodedInstanceName}");
        setSessionAttribute(key="standaloneInstanceTabs" value="resources");
        setPageSessionAttribute(key="listLink" value="#{request.contextPath}/cluster/standalone/standaloneInstanceResources.jsf?instanceName=#{pageSession.encodedInstanceName}");
        setPageSessionAttribute(key="restURL" value="#{sessionScope.REST_URL}/servers/server/#{pageSession.encodedInstanceName}/resource-ref");
        gf.checkIfEndPointExist(endpoint="#{pageSession.restURL}.json", exists="#{requestScope.isServer}");
        if (!#{requestScope.isServer}) {
            setPageSessionAttribute(key="restURL" value="#{sessionScope.REST_URL}/clusters/cluster/#{pageSession.encodedInstanceName}/resource-ref");            
        }
    />
    </event>
<sun:form id="propertyForm">

#include "/cluster/standalone/standaloneInstanceTabs.inc"
                <!-- Page Title -->

<sun:title id="propertyContentPage" title="$resource{i18nc.resourcesTarget.pageTitle}"
                 helpText="$resource{i18nc.resourcesTarget.pageTitleHelp}" />
#include "/common/shared/alertMsg_1.inc"
#include "/common/shared/nameSection.inc"
#include "/common/resourceNode/targetResourceTable.inc"

<sun:hidden id="helpKey" value="$resource{help_cluster.standaloneInstanceResources}" />

</sun:form>
</define>
</composition>
