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

<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you 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.
-->

<uddi xmlns="urn:juddi-apache-org:v3_client" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:juddi-apache-org:v3_client ..\..\juddi-client\src\main\resources\xsd\uddi-client.xsd">
  <reloadDelay>5000</reloadDelay>
  <client name="test-client">
    <nodes>
      <node isHomeJUDDI="true">
        <!-- required 'default' node -->
        <name>default</name>
        <description>Main jUDDI node</description>
        <properties>
          <property name="serverName" value="localhost" />
          <property name="serverPort" value="8080" />
		  <!-- for UDDI nodes that use HTTP u/p, using the following 
					<property name="basicAuthUsername" value="root" />
					<property name="basicAuthPassword" value="password" />
					<property name="basicAuthPasswordIsEncrypted" value="false" />
					<property name="basicAuthPasswordCryptoProvider" value="org.apache.juddi.v3.client.crypto.AES128Cryptor (an example)" />-->
        </properties>
        <proxyTransport>org.apache.juddi.v3.client.transport.AspNetTransport</proxyTransport>
        <custodyTransferUrl>http://${serverName}:${serverPort}/juddiv3/services/custody-transfer?wsdl</custodyTransferUrl>
        <inquiryUrl>http://${serverName}:${serverPort}/juddiv3/services/inquiry?wsdl</inquiryUrl>
		    <inquiryRESTUrl>http://${serverName}:${serverPort}/juddiv3/services/inquiryRest</inquiryRESTUrl>
        <publishUrl>http://${serverName}:${serverPort}/juddiv3/services/publish?wsdl</publishUrl>
        <securityUrl>http://${serverName}:${serverPort}/juddiv3/services/security?wsdl</securityUrl>
        <subscriptionUrl>http://${serverName}:${serverPort}/juddiv3/services/subscription?wsdl</subscriptionUrl>
        <subscriptionListenerUrl>http://${serverName}:${serverPort}/juddiv3/services/subscription-listener?wsdl</subscriptionListenerUrl>
        <juddiApiUrl>http://${serverName}:${serverPort}/juddiv3/services/juddi-api?wsdl</juddiApiUrl>
        <factoryInitial>not used</factoryInitial>
        <factoryURLPkgs>not used</factoryURLPkgs>
        <factoryNamingProvider>not used</factoryNamingProvider>
      </node>
      <node>
        <name>med</name>
        <description>jUDDI node in other Department</description>
        <proxyTransport>org.apache.juddi.v3.client.transport.AspNetTransport</proxyTransport>
        <custodyTransferUrl>http://med:8080/juddiv3/services/custody-transfer?wsdl</custodyTransferUrl>
        <inquiryUrl>http://med:8080/juddiv3/services/inquiry?wsdl</inquiryUrl>
        <publishUrl>http://med:8080/juddiv3/services/publish?wsdl</publishUrl>
        <securityUrl>http://med:8080/juddiv3/services/security?wsdl</securityUrl>
        <subscriptionUrl>http://med:8080/juddiv3/services/subscription?wsdl</subscriptionUrl>
        <subscriptionListenerUrl>http://med:8080/juddiv3/services/subscription-listener?wsdl</subscriptionListenerUrl>
        <juddiApiUrl>http://med:8080/juddiv3/services/juddi-api?wsdl</juddiApiUrl>
        <factoryInitial>not used</factoryInitial>
        <factoryURLPkgs>not used</factoryURLPkgs>
        <factoryNamingProvider>not used</factoryNamingProvider>

      </node>
    </nodes>

    <clerks registerOnStartup="false">
      <clerk name="default" node="default" publisher="uddi" password="uddi"  isPasswordEncrypted="false" cryptoProvider=""/>
      <clerk name="medroot" node="med"     publisher="root" password="root"  isPasswordEncrypted="false" cryptoProvider=""/>
      <xregister>
        <servicebinding bindingKey="uddi:juddi.apache.org:servicebindings-subscriptionlistener-ws" 
                        fromClerk="default" toClerk="medroot"/>
      </xregister>
      
    </clerks>
    <signature>
      <signingKeyStorePath>..\..\..\juddi-client.net.test\resources\cert.pfx</signingKeyStorePath>
      <signingKeyStoreType>PFX</signingKeyStoreType>
      <signingKeyStoreFilePassword>password</signingKeyStoreFilePassword>
      <signingKeyPassword>ignored</signingKeyPassword>

      <!-- this is the localhost Test certificate -->
      <signingKeyAlias>?518ed27c</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>
      <trustStorePath>ignored</trustStorePath>
      <trustStoreType>ignored</trustStoreType>
      <trustStorePassword>ignored</trustStorePassword>
      <checkTimestamps>true</checkTimestamps>
      <checkTrust>false</checkTrust>
      <checkRevocationCRL>false</checkRevocationCRL>
      <checkRevocationOCSP>false</checkRevocationOCSP>
      <keyInfoInclusionSubjectDN>true</keyInfoInclusionSubjectDN>
      <keyInfoInclusionSerial>true</keyInfoInclusionSerial>
      <keyInfoInclusionBase64PublicKey>true</keyInfoInclusionBase64PublicKey>
      <digestMethod>http://www.w3.org/2000/09/xmldsig#sha1</digestMethod>
    </signature>
    <subscriptionCallbacks>
      <keyDomain>uddi:org.apache.juddi</keyDomain>
      <listenUrl>http://localhost:4444/callback</listenUrl>
      <autoRegisterBindingTemplate>false</autoRegisterBindingTemplate>
      <autoRegisterBusinessServiceKey>uddi:org.apache.juddi:callbackServices</autoRegisterBusinessServiceKey>
      <signatureBehavior>DoNothing</signatureBehavior>
    </subscriptionCallbacks>
    <XtoWsdl>
      <IgnoreSSLErrors>false</IgnoreSSLErrors>
    </XtoWsdl>
  </client>
</uddi>
