-- THIS DOCUMENT IS A WORK IN PROGRESS --

Welcome to the Apache Scout Project!

INTRODUCTION

  While this effort can be considered a project in and of
  itself it will have a dependency on the jUDDI Registry
  project.  This dependency is covered in the "RELATIONSHIP 
  WITH THE jUDDI PROJECT" section below.


PROJECT GOALS

  The purpose of the JAXR specification is to give Java/J2EE 
  developers a common standard API to access various web 
  services registries. This is simiar in function to the way 
  the JDBC API provides a common API for accessing different 
  database products.

  The JAXR specification describes two types of providers 
  each offerring different levels of support for interacting 
  with the two popular registry specifications in use today,
  UDDI and ebXML.
  
  A type 0 providers will offer support for accessing UDDI 
  registries and type 1 providers support access to both UDDI 
  AND ebXML registries. The goal of this project is to 
  implement a type 0 provider.


RELATIONSHIP TO THE JUDDI REGISTRY PROJECT

  As described in the PROJECT GOALS section above, the 
  JAXR specification indicates that a type 0 provider is 
  used to support interaction with UDDI registries. 
  
  A large portion of the development effort for this 
  project will center around building a bridge between 
  the standard JAXR API interface (jaxr.jar) and a UDDI 
  client library such as UDDI4j.
  
  This is where the depenedency on jUDDI comes into play. 
  It's a little known fact that jUDDI is not only a UDDI 
  Registry but can also act as a UDDI client. 
  
  Since the jUDDI Registry must have the ability to recieve 
  SOAP requests, deserialize them into Java objects and 
  then serialize and return SOAP responses we realized
  that we could leverage this existing functionality to
  quickly produce a UDDI client which we did.
  
  A significant side-benefit of using the jUDDI client
  in our JAXR provider is that any issues or bugs 
  discovered and fixed while using the jUDDI Proxy will 
  directly improve the quality of the jUDDI Registry.
  

BUILDING THE JUDDI JAXR PROVIDER

  Apache Scout is a maven project that is built using the
  multiproject plugin. All dependencies are included or
  are downloaded during the build. The quickest way to
  start is, in the root directory, to type

  mvn package

  This will build all of the modules and install them in
  your local maven repository.

  To clean up a build, use

  mvn clean

SUPPORT

  You'll find documentation for this project in the docs/ 
  directory.

  Also, read the RELEASE NOTES below in for details on the 
  current release.

  Thanks from the Scout development team for downloading 
  the package; help us make it better by sending comments 
  to scout-dev@ws.apache.org. Subscribe to this list by 
  sending a message to the following email address:
  
    scout-dev-subscribe@ws.apache.org
  
  
Release Notes - Scout - Version 1.0

Bug

    * [SCOUT-21] - can't configure transport class property using the properties in the factory
    * [SCOUT-22] - ServiceBindings are not populated when quering for a organization or service
    * [SCOUT-55] - Scout ignores ownership of registry objects when querying with BusinessQueryManager.getRegistryObjects(LifeCycleManager.ORGANIZATION)
    * [SCOUT-61] - ScoutJaxrUddiHelper returns BindingTemplate without AccessPoint/HostingRedirector
    * [SCOUT-64] - Missing / moved DOAP file
    * [SCOUT-67] - ClassCastException in BusinessQueryManager.getRegistryObject(...,LifeCycleManager.SERVICE)
    * [SCOUT-68] - java.lang.NullPointerException in ScoutUddiJaxrHelper.getServiceBinding(ScoutUddiJaxrHelper.java:437)
    * [SCOUT-70] - JAXR060 throws stack traces
    * [SCOUT-71] - TModelBag a required element in findBinding
    * [SCOUT-75] - Need lazy loading of Organization from ServiceImpl

Improvement

    * [SCOUT-57] - BusinessQueryManagerTest only tests one of the methods of BusinessQueryManager

New Feature

    * [SCOUT-20] - Enabling RMI access to jUDDI


  Release Notes - Scout - Version 1.0rc2
** Bug
    * [SCOUT-47] - tmodel_instance_info row not created
    * [SCOUT-48] - ServiceBinding objects do not have their SpecificationLink objects saved in UDDI.
    * [SCOUT-50] - Classifications array should be of size 0 if none are found
    * [SCOUT-52] - Refactor the unittests to make it easier to write and maintain them
    * [SCOUT-53] - Code to create associations is missing.
    * [SCOUT-54] - When querying for organizations (JAXR), the email, phone number, and postal address collections of the primary contact are empty although there is data in them
    * [SCOUT-56] - Service descriptions and corresponding service bindings are not returned when querying by service	
    * [SCOUT-63] - Set TModelInstanceDetails in getBindingTemplateFromJAXRSB even if slcol is null or empty

** Improvement

** New Feature
    * [SCOUT-51] - Test scout against other UDDIs (besides just jUDDI)
                          
  Release Notes - Scout - Version 1.0rc1

** Bug
    * [SCOUT-23] - Classification are not saved.
    * [SCOUT-25] - FindBinding does not work + patch
    * [SCOUT-26] - Removing a service does not remove the service + patch
    * [SCOUT-28] - XmlBeans conversion compiles but is non-functional
    * [SCOUT-29] - AuthTokenImpl.getAuthInfo() doesn't seem to work correctly
    * [SCOUT-30] - Classifications are ignored when preforming finds.
    * [SCOUT-31] - Fix scout maven 1 build issue so that the dependency jars can be downloaded automatically
    * [SCOUT-32] - Fix NPE at getConcept
    * [SCOUT-33] - Should throw exception when level 1 feature is accessed in RegistryEntryImpl.java
    * [SCOUT-34] - DiscoveryURLs aren't constructed correctly when there is more than 1 discoveryURLs for a businessEntity
    * [SCOUT-35] - Should use hashset for the collection in BulkResponseImpl to not allow duplicate 
    * [SCOUT-36] - minor update to get scout maven 2 build pass the error in download juddi snapshot
    * [SCOUT-40] - InternationalString is not handled correctly
    * [SCOUT-41] - Results not returned in the given order
    * [SCOUT-44] - port fixes for scout 8 to trunk
    * [SCOUT-45] - port scout 19 to trunk
    * [SCOUT-46] - port scout 10 to trunk

** Improvement
    * [SCOUT-9] - Separation of Apache Scout and jUDDI

** New Feature
    * [SCOUT-18] - Embedded mode execution

** Task
    * [SCOUT-27] - Update Tests with embedded juddi setup
    * [SCOUT-37] - Cleanup code to get rid of warnings
    * [SCOUT-38] - Produce website from the maven2 build
    * [SCOUT-39] - Integrate all sample code in unittests
    * [SCOUT-42] - apply fixes on 0.7 branches to the trunk


Release Notes - Scout - Version v0.7

** Bug
    * [SCOUT-4] - Level 1 methods in PersonName must throw UnsupportedCapabilityException
    * [SCOUT-6] - Null pointer exception when creating an association
    * [SCOUT-7] - NullPointerException when a BusinessEntity does not have services
    * [SCOUT-8] - Unable to use InternationalString in BusinessQueryManager.findOrganizations() (ClassCastException)
    * [SCOUT-10] - Publish requests to JUDDI do not include ServiceBinding information.
    * [SCOUT-15] - RegistryEntry should throw UnsupportedCapabilityException for level 0
    * [SCOUT-19] - ServiceBinding.getSpecificationLinks should not return null

** Improvement
    * [SCOUT-11] - JAXR Classifications are not processed

** Task
    * [SCOUT-1] - Implement saveXXX Methods in BusinessLifeCycleManager
    * [SCOUT-2] - Implement deleteXXX methods in BusinessLifeCycleManager
    * [SCOUT-3] - Implement findXXX methods in BusinessQueryManager
    * [SCOUT-5] - Predefined Enumerations
    * [SCOUT-13] - Better Logging capabilities
    * [SCOUT-16] - Maven2 migration

  
