<!--

    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

-->

<!-- applications/descriptorDisplay.jsf -->
<!initPage
    setResourceBundle(key="i18nc" bundle="org.glassfish.web.admingui.Strings");
    setResourceBundle(key="help_common" bundle="org.glassfish.common.admingui.Helplinks");
/>
<!composition template="/templates/default.layout"  guiTitle="$resource{i18n.application.DD.title}" >
<!define name="content">
    <event>
    <!beforeCreate
        getRequestValue(key="appName" value="#{pageSession.appName}");
        urlencode(value="#{pageSession.appName}" encoding="UTF-8" result="#{pageSession.encodedAppName}");
        getRequestValue(key="moduleName" value="#{pageSession.moduleName}");
        getRequestValue(key="ddPath" value="#{pageSession.ddPath}");
        gf.restRequest(
            endpoint="#{sessionScope.REST_URL}/applications/application/#{pageSession.encodedAppName}/_get-deployment-configurations"
            method="GET",
            result="#{requestScope.result}");
        gf.getDeploymentDescriptor(moduleName="#{pageSession.moduleName}",  descriptorName="#{pageSession.ddPath}",
            data="#{requestScope.result.data.children}"  content="#{descriptorContent}", encoding="#{encoding}");
<!-- FIXME: This may change the encoding for the rest of the application!! -->
        setEncoding("UTF-8");
    />
    </event>
            <sun:form id="propertyForm">
#include "/common/shared/alertMsg_1.inc"
    <sun:title id="propertyContentPage" title="$resource{i18n.application.DD.title}" helpText="$resource{i18n.application.DD.titleHelp}">
        <!facet pageButtonsTop>
            <sun:panelGroup id="topButtons">
                <sun:button id="closeButton" text="$resource{i18n.button.Back}" primary="#{true}">
                    <!command
                        //setSessionAttribute(key="descriptorForDisplay" value="")
                        gf.redirect(page="#{request.contextPath}/common/applications/webDDEdit.jsf?appName=#{pageSession.encodedAppName}");
                    />
                </sun:button>
            </sun:panelGroup>
        </facet>
    </sun:title>
    "<br><br>
    <sun:propertySheet id="propertySheet">
        <sun:propertySheetSection id="propertSectionTextField">
            <sun:property id="name"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n.application.appName}">
                <sun:staticText escape="true" id="name" text="#{pageSession.appName}"/>
            </sun:property>
            <sun:property id="module"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n.application.moduleName}">
                <sun:staticText  escape="true" id="module" text="#{pageSession.moduleName}"/>
            </sun:property>
            <sun:property id="path"  labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n.application.modulePath}">
                <sun:staticText  escape="true" id="path" text="#{pageSession.ddPath}"/>
            </sun:property>
        </sun:propertySheetSection>

        <sun:propertySheetSection id="ddSection">
            <sun:property id="ReportProp"  labelAlign="left" noWrap="#{false}" overlapLabel="#{false}" readOnly="#{true)" >
            "<pre><font size="3" />
                <sun:staticText id="descriptorText" value="#{descriptorContent}" escape="#{true}"/>
            "</pre>
            </sun:property>
        </sun:propertySheetSection>
    </sun:propertySheet >

    <sun:title id="propertyContentPage2" >
                <!facet pageButtonsBottom>
        <sun:panelGroup id="bottomButtons">
            <sun:button id="closeButton2" text="$resource{i18n.button.Back}" primary="#{true}">
                <!command
                    //setSessionAttribute(key="descriptorForDisplay" value="")
                    gf.redirect(page="#{request.contextPath}/common/applications/webDDEdit.jsf?appName=#{pageSession.encodedAppName}");
                />
            </sun:button>
        </sun:panelGroup>
        </facet>
    </sun:title>
	<sun:hidden id="helpKey" value="$resource{help_common.DisplayDD}" />
</sun:form>
</define>
</composition>


