<!--

    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.connectionFactory.newPageTitle}" >
<!define name="content">
    <event>
        <!beforeCreate
            getRequestValue(key="target" value="#{pageSession.targetValue}");
            setPageSessionAttribute(key="selfPage" value="#{request.contextPath}/jms/jmsConnectionNew.jsf");
            setPageSessionAttribute(key="parentPage" value="#{request.contextPath}/jms/jmsConnections.jsf");

            setPageSessionAttribute(key="childType" value="connector-connection-pool");
            setPageSessionAttribute(key="childType2" value="connector-resource");
            setPageSessionAttribute(key="convertToFalseList" value={"failAllConnections", "isConnectionValidationRequired"});
            setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/resources");
            gf.getDefaultValues(endpoint="#{pageSession.parentUrl}/#{pageSession.childType}", valueMap="#{pageSession.valueMap}");
            gf.getDefaultValues(endpoint="#{pageSession.parentUrl}/#{pageSession.childType2}", valueMap="#{pageSession.valueMap2}");
            gf.getDefaultValues(endpoint="#{sessionScope.REST_URL}/servers/server/server/resource-ref", valueMap="#{pageSession.resourceRef}");
            
            mapPut(map="#{pageSession.valueMap}", key="resourceAdapterName", value="jmsra");
            mapPut(map="#{pageSession.valueMap2}", key="enabled", value="true");
            mapPut(map="#{pageSession.valueMap}", key="steadyPoolSize", value="1");
            mapPut(map="#{pageSession.valueMap}", key="maxPoolSize", value="250");

            //set the following for including buttons.inc
            setPageSessionAttribute(key="edit" value="#{false}" );
            setPageSessionAttribute(key="showDefaultButton" value="#{false}" );
            setPageSessionAttribute(key="showCancelButton" value="#{true}" );
            setPageSessionAttribute(key="hasPropertySheet" value="#{true}" );
            setPageSessionAttribute(key="hasPropertyTable" value="#{true}" );

            
            setPageSessionAttribute(key="useString" value="#{false}");
            // TODO: set default values for user/pass in the properties table
        />
    </event>
"    <script type="text/javascript">admingui.nav.selectTreeNodeById(admingui.nav.TREE_ID+":resources:jmsResources:jmsConnectionFactories");</script>

    <sun:form id="form" >
#include "/common/shared/alertMsg_1.inc"
    <!-- Page Title -->
    <sun:title id="propertyContentPage" title="$resource{i18njms.connectionFactory.newPageTitle}" helpText="$resource{i18njms.connectionFactory.newPageTitleHelp}">
        <!facet pageButtonsTop>
            <sun:panelGroup id="topButtons">
#include "/jms/jmsConnectionButtons.inc"
            </sun:panelGroup>
        </facet>
    </sun:title>
#include "/jms/poolProperties.inc"
#include "/common/shared/propertyDescTable.inc"
<event>
<!afterCreate
    setPageSessionAttribute(key="setDefaultTarget" value="true");
    includeIntegrations(type="org.glassfish.admingui:TargetSectionForResource" );
/>
</event>
    <sun:title id="title2" >
        <!facet pageButtonsBottom>
            <sun:panelGroup id="bottomButtons">
#include "/jms/jmsConnectionButtons.inc"
            </sun:panelGroup>
        </facet>
    </sun:title>
    <sun:hidden id="helpKey" value="$resource{helpjms.jmsConnectionNew}" />
    </sun:form>
</define>
</composition>
