<?xml version="1.0" encoding="ISO-8859-1" ?>

<!-- 
/*
 * Copyright 2001-2008 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 -->
<!-- 
This config is for the juddi-gui.

It currently does not use the ValueSet, jUDDI, Replication, or REST APIs
-->
<uddi>
    <reloadDelay>5000</reloadDelay>
    <client name="juddigui">
        <nodes>
            <node>
                <!-- required 'default' node -->
                <name>default</name> 
                <description>Main UDDI Node</description>
                <!-- JAX-WS Transport -->
                <proxyTransport>org.apache.juddi.v3.client.transport.JAXWSTransport</proxyTransport>
                <custodyTransferUrl>http://localhost:9080/juddiv3/services/custody-transfer</custodyTransferUrl>
                <inquiryUrl>http://localhost:9080/juddiv3/services/inquiry</inquiryUrl>
                <publishUrl>http://localhost:9080/juddiv3/services/publish</publishUrl>
                <securityUrl>http://localhost:9080/juddiv3/services/security</securityUrl>
                <subscriptionUrl>http://localhost:9080/juddiv3/services/subscription</subscriptionUrl>
            </node>
             <node>
                <name>default-ssl</name> 
                <description>Main UDDI Node using SSL</description>
                <!-- JAX-WS Transport -->
                <proxyTransport>org.apache.juddi.v3.client.transport.JAXWSTransport</proxyTransport>
                <custodyTransferUrl>http://localhost:9443/juddiv3/services/custody-transfer</custodyTransferUrl>
                <inquiryUrl>https://localhost:9443/juddiv3/services/inquiry</inquiryUrl>
                <publishUrl>https://localhost:9443/juddiv3/services/publish</publishUrl>
                <securityUrl>https://localhost:9443/juddiv3/services/security</securityUrl>
                <subscriptionUrl>https://localhost:9443/juddiv3/services/subscription</subscriptionUrl>
            </node>
            <node>
                <name>jboss7</name> 
                <description>Main UDDI node running on Jboss EAP6 or AS7</description>
                <!-- 
                Jboss users, note that the url is typically different, here's an example for Jboss EAP 6.x-->
                <custodyTransferUrl>http://localhost:8080/juddiv3/UDDICustodyTransferService</custodyTransferUrl>
                <inquiryUrl>http://localhost:8080/juddiv3/UDDIInquiryService</inquiryUrl>
                <publishUrl>http://localhost:8080/juddiv3/UDDIPublicationService</publishUrl>
                <securityUrl>http://localhost:8080/juddiv3/UDDISecurityService</securityUrl>
                <subscriptionUrl>http://localhost:8080/juddiv3/UDDISubscriptionService</subscriptionUrl>
                <subscriptionListenerUrl>http://localhost:8080/juddiv3/UDDISubscriptionListenerService</subscriptionListenerUrl>
            </node>
             <node>
                <name>jboss7-ssl</name> 
                <description>Main UDDI node running on Jboss EAP6 or AS7</description>
                <!-- 
                Jboss users, note that the url is typically different, here's an example for Jboss EAP 6.x-->
                <custodyTransferUrl>https://localhost:8443/juddiv3/UDDICustodyTransferService</custodyTransferUrl>
                <inquiryUrl>https://localhost:8443/juddiv3/UDDIInquiryService</inquiryUrl>
                <publishUrl>https://localhost:8443/juddiv3/UDDIPublicationService</publishUrl>
                <securityUrl>https://localhost:8443/juddiv3/UDDISecurityService</securityUrl>
                <subscriptionUrl>https://localhost:8443/juddiv3/UDDISubscriptionService</subscriptionUrl>
            </node>
        </nodes>
		<signature>
			<!-- signing stuff, is NOT used by juddi-gui -->
			<signingKeyStorePath>(not used)</signingKeyStorePath>
			<signingKeyStoreType>(not used)</signingKeyStoreType>
			<signingKeyStoreFilePassword 
				isPasswordEncrypted="false" 
				cryptoProvider="org.apache.juddi.v3.client.crypto.AES128Cryptor">(not used)</signingKeyStoreFilePassword>
			<signingKeyPassword
				isPasswordEncrypted="false" 
				cryptoProvider="org.apache.juddi.v3.client.crypto.AES128Cryptor">(not used)</signingKeyPassword>
			<signingKeyAlias>(not used)</signingKeyAlias>
                        
			<canonicalizationMethod>http://www.w3.org/2001/10/xml-exc-c14n#</canonicalizationMethod>
			<signatureMethod>http://www.w3.org/2000/09/xmldsig#rsa-sha1</signatureMethod>
			<XML_DIGSIG_NS>http://www.w3.org/2000/09/xmldsig#</XML_DIGSIG_NS>
			
                        <!-- validation stuff 
                        This part IS used by juddi-gui whenever someone views an entity that is signed
                        -->
			<!-- if this doesn't exist or is incorrect, the client will attempt to load  from system properties, then 
                        from the standard jdk trust store
                        generally, if defined, the working path is typically the bin folder of the container
                        -->
			<trustStorePath></trustStorePath>
			<trustStoreType>JKS</trustStoreType>
			<trustStorePassword
				isPasswordEncrypted="false" 
				cryptoProvider="org.apache.juddi.v3.client.crypto.AES128Cryptor"></trustStorePassword>
			
			<checkTimestamps>true</checkTimestamps>
			<checkTrust>true</checkTrust>
			<checkRevocationCRL>true</checkRevocationCRL>
			<keyInfoInclusionSubjectDN>false</keyInfoInclusionSubjectDN>
			<keyInfoInclusionSerial>false</keyInfoInclusionSerial>
			<keyInfoInclusionBase64PublicKey>true</keyInfoInclusionBase64PublicKey>
			<digestMethod>http://www.w3.org/2000/09/xmldsig#sha1</digestMethod>
		</signature>
                <!-- not used by juddi-gui-->
		<subscriptionCallbacks>
			<keyDomain>(not used)</keyDomain>
			<listenUrl>(not used)</listenUrl>
			<autoRegisterBindingTemplate>false</autoRegisterBindingTemplate>
			<autoRegisterBusinessServiceKey>(not used)</autoRegisterBusinessServiceKey>
			<signatureBehavior>DoNothing</signatureBehavior>
			<!--valid values are AbortIfSigned,Sign,DoNothing,SignOnlyIfParentIsntSigned, default is DoNothing-->
		</subscriptionCallbacks>
                <!-- juddi-gui, used in the Create, Import from Wadl/Wsdl -->
		<XtoWsdl>
			<IgnoreSSLErrors>false</IgnoreSSLErrors>
		</XtoWsdl>
                
    </client>
    
    <!-- hi there!
    this section is required by juddi-gui and is an extension of what the normal juddi-client does
    it's not in the standard config schema.
    
    -->
    <config>
        
        <props>
            <!--#required. if this uddi client is connected to uddi services that use the auth token, then set to UDDI_AUTH
            #if not, set authtype to HTTP-->
            <authtype>UDDI_AUTH</authtype>
            <automaticLogouts>
                <!-- #enables automatic logout timer, defaults to false if not defined-->
                <enabled>true</enabled>
                <!--#defines the duration of time to wait for the automatic logout, defaults to 15min if not defined-->
                <duration>900000</duration>
            </automaticLogouts>
            <!--#node, this is the node defined in uddi.xml that the jUDDI-GUI will use for connections-->
            <node>default</node>
            <!-- controls remote access to the settings/configuration page -->
            <configLocalHostOnly>true</configLocalHostOnly>
        </props>
    </config>
</uddi>
