<!--

    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

-->

<!-- configuration/iiopListenerNew.jsf -->
<!initPage
    setResourceBundle(key="i18n_corba" bundle="org.glassfish.corba.admingui.Strings")
	setResourceBundle(key="help_corba" bundle="org.glassfish.corba.admingui.Helplinks")
/>
<!composition template="/templates/default.layout"  guiTitle="$resource{i18n_corba.iiopListener.newPageTitle}" >
<!define name="content">
    <event>
    <!beforeCreate
        getRequestValue(key="configName" value=>$page{configName} default="server-config");
        setPageSessionAttribute(key="childType" value="iiop-listener")
        setPageSessionAttribute(key="parentPage" value="#{request.contextPath}/corba/iiopListeners.jsf");
        setPageSessionAttribute(key="pageTitle" value="$resource{i18n_corba.iiopListeners.newPageTitle}");
        setPageSessionAttribute(key="pageTitleHelp" value="$resource{i18n_corba.iiopListeners.NewPageHelp}");
        setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/configs/config/#{pageSession.configName}/iiop-service");
        setPageSessionAttribute(key="selfUrl", value="#{pageSession.parentUrl}/#{pageSession.childType}");
        setPageSessionAttribute(key="rest-api" value="true");
        gf.getDefaultValues(endpoint="#{pageSession.selfUrl}", valueMap="#{pageSession.valueMap}");
        mapPut(map="#{pageSession.valueMap}" key="target" value="#{pageSession.configName}");
        //set the following for including buttons.inc
        setPageSessionAttribute(key="convertToFalseList" value={"securityEnabled" "enabled"})
        setPageSessionAttribute(key="edit" value="#{false}" );
        setPageSessionAttribute(key="skipAttrsList" value={"Enabled", "Port", "Security-enabled"});
        setPageSessionAttribute(key="showDefaultButton" value="#{true}" );
        setPageSessionAttribute(key="showCancelButton" value="#{true}" );
        setPageSessionAttribute(key="hasPropertySheet" value="#{true}" );
        setPageSessionAttribute(key="hasPropertyTable" value="#{true}" );
    />
 </event>
            <sun:form id="propertyForm">
#include "/common/shared/alertMsg.inc"
        <sun:title id="propertyContentPage" title="$resource{i18n_corba.iiopListener.newPageTitle}" helpText="$resource{i18n_corba.iiopListener.newPageHelp}">
#include "/corba/iiopListenerButtons.inc"
        </sun:title>
#include "/corba/iiopListenerAttrs.inc"
#include "/common/shared/propertyDescTable.inc"
	<sun:hidden id="helpKey" value="$resource{help_corba.iiopListenerNew}" />
</sun:form>
#include "/common/shared/changeButtonsJS.inc"
</define>
</composition>

