<?xml version="1.0" encoding="UTF-8"?>

<!--
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.
-->

<document>
  <properties>
    <title>Welcome to Apache Scout</title>
  </properties>
  <body>

      <section name="Intro">
	      <p>Apache Scout is an open source implementation of the <a href="http://jcp.org/en/jsr/detail?id=93">JSR 93 - JavaTM API for
		XML Registries 1.0 (JAXR)</a>. The JAXR API allows the integration of XML Registries based on either UDDI or ebXML. Scout
		implements the required (level 0) part of the specification, which means that it can talk to any UDDI compliant Registry.
	      </p>
	  </section>
    
	 <section name="Scout Features">
	    <ul>
	      <li>Open Source</li>
	      <li>Platform Independent</li>
	      <li>Supports for JDK 1.3.1 and later</li>
	      <li>JAXR 1.0 complaint</li>
	      <li>UDDI version 2.0 and 3.0 compliant</li>
	    </ul>
	  </section>
      
	  <section name="News">
	    <p><strong>Oct 23, 2009</strong> Version 1.2 adds support for UDDI v3</p>
	    <p><strong>Aug 3, 2009</strong> Version 1.1 uses JAXB for XML binding and passes TCK</p>
	    <p><strong>May 5, 2009</strong> Version 1.0 is now available</p>
	  	
	  </section>

      <section name="About JAXR">
        <p>This JSR requests the creation of the Java API for XML Registries
         1.0 specification (JAXR). JAXR may be viewed as analogous to Java 
         Naming and Directory Interface (JNDI) but designed specifically 
         for (internet) sharing of XML-related business information.
        </p>
      </section>
      
      <section name="Getting Started">
        <p>Download the Scout-1.2.2.jar and set up a UDDI-2.0 compliant Registry like 
        <a href="http://juddi.apache.org/">jUDDI-2.x</a>. Check out the unittest in the
        Scout project as they are nice examples on how to use the JAXR API. The 
        <a href="http://svn.apache.org/viewvc/juddi/scout/trunk/scout/src/test/">unit-tests</a>
        use embedded jUDDI backed by an embedded Derby database. The configuration
        for this can be found in the scout.properties and juddi.properties files.
        </p>
        <p>
        The JAXR spec does not support UDDI v3 functionality, but Scout makes an effort to support the UDDI v2 functionality in UDDI v3 registries. 
        </p>
        <p>Additional information regarding JAXR can be found at:
        <ul>
          <li><a href="http://jcp.org/en/jsr/detail?id=93">JSR 93 - JavaTM API for XML Registries 1.0 (JAXR)</a>.</li>
          <li><a href="http://java.sun.com/j2ee/1.3/docs/tutorial/doc/JAXR2.html">Overview of JAXR</a>.</li>
          <li><a href="http://www.onjava.com/pub/a/onjava/2002/02/27/uddi.html">Understanding UDDI and JAXR</a>.</li>
          <li><a href="http://www.javaworld.com/javaworld/jw-06-2002/jw-0614-jaxr.html">Discover and publish Web services with JAXR</a></li>
          <li><a href="http://www.javaworld.com/javaworld/jw-09-2002/jw-1213-webservices.html">Publish and find UDDI tModels with JAXR and WSDL</a></li>
          <li><a href="http://www.jboss.org/jbossesb/docs/4.2.1GA/manuals/html/services/Registry.html">JBossESB Registry</a></li>
        </ul>
        </p>
      </section>
      
  </body>
</document>
