http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/juddi-core/src/main/java/org/apache/juddi/subscription/SubscriptionNotifier.java
----------------------------------------------------------------------
diff --git 
a/juddi-core/src/main/java/org/apache/juddi/subscription/SubscriptionNotifier.java
 
b/juddi-core/src/main/java/org/apache/juddi/subscription/SubscriptionNotifier.java
index 7d06b0c..933f476 100644
--- 
a/juddi-core/src/main/java/org/apache/juddi/subscription/SubscriptionNotifier.java
+++ 
b/juddi-core/src/main/java/org/apache/juddi/subscription/SubscriptionNotifier.java
@@ -143,7 +143,7 @@ public class SubscriptionNotifier extends TimerTask {
                if ((firedOnTime(scheduledExecutionTime()) || alwaysNotify) && 
registryMayContainUpdates()) {
                        long startTime = System.currentTimeMillis();
                        desiredDate = null;
-                       log.debug("Start Notification background task; checking 
if subscription notifications need to be send out..");
+                       log.info("Start Notification background task; checking 
if subscription notifications need to be send out..");
                        
                        Collection<Subscription> subscriptions = 
getAllAsyncSubscriptions();
                        for (Subscription subscription : subscriptions) {
@@ -164,23 +164,23 @@ public class SubscriptionNotifier extends TimerTask {
                                                        SubscriptionResultsList 
resultList = subscriptionImpl.getSubscriptionResults(getSubscriptionResults, 
publisher);
                                                         String token = 
resultList.getChunkToken();
                                                        if 
(resultListContainsChanges(resultList)) {
-                                                               log.debug("We 
have a change and need to notify " + subscription.getSubscriptionKey());
+                                                               log.info("We 
have a change and need to notify " + subscription.getSubscriptionKey());
                                                                 
resultList.setChunkToken(null);
                                                                //Note that the 
chunkToken is not returned with this structure for this API.  
                                                                
notify(getSubscriptionResults,resultList, notificationDate);
                                                        } else {
-                                                               log.debug("No 
changes where recorded, no need to notify.");
+                                                               log.info("No 
changes where recorded, no need to notify.");
                                                        }
                                                         while 
(!token.equalsIgnoreCase("0"))
                                                         {
                                                             resultList = 
subscriptionImpl.getSubscriptionResults(getSubscriptionResults, publisher);
                                                             if 
(resultListContainsChanges(resultList)) {
-                                                                    
log.debug("We have a change and need to notify " + 
subscription.getSubscriptionKey());
+                                                                    
log.info("We have a change and need to notify " + 
subscription.getSubscriptionKey());
                                                                     
resultList.setChunkToken(null);
                                                                    //Note that 
the chunkToken is not returned with this structure for this API.  
                                                                     
notify(getSubscriptionResults,resultList, notificationDate);
                                                             } else {
-                                                                    
log.debug("No changes where recorded, no need to notify.");
+                                                                    
log.info("No changes where recorded, no need to notify.");
                                                             }
                                                         }
                                                             
@@ -199,14 +199,14 @@ public class SubscriptionNotifier extends TimerTask {
             long endTime   = System.currentTimeMillis();
             
             if ((endTime-startTime) > interval) {
-               log.debug("Notification background task duration exceeds the 
JUDDI_NOTIFICATION_INTERVAL" +
+               log.info("Notification background task duration exceeds the 
JUDDI_NOTIFICATION_INTERVAL" +
                                " of " + interval + ". Notification background 
task took " 
                                + (endTime - startTime) + " milliseconds.");
             } else {
-               log.debug("Notification background task took " + (endTime - 
startTime) + " milliseconds.");
+               log.info("Notification background task took " + (endTime - 
startTime) + " milliseconds.");
             }
                } else {
-                       log.debug("Skipping current notification cycle because 
lagtime is too great.");
+                       log.warn("Skipping current notification cycle because 
lagtime is too great.");
                }
        }
        /**
@@ -254,7 +254,7 @@ public class SubscriptionNotifier extends TimerTask {
                        if (log.isDebugEnabled()) log.debug("Period " + 
period.getStartPoint() + " " + period.getEndPoint());
                        getSubscriptionResults.setCoveragePeriod(period);
                } else {
-                       log.debug("Client does not yet want a notification. The 
next desidered notification Date " + nextDesiredNotificationDate + ". The 
current interval [" 
+                       log.info("Client does not yet want a notification. The 
next desidered notification Date " + nextDesiredNotificationDate + ". The 
current interval [" 
                                + startPoint + " , " + endPoint + "] therefore 
skipping this notification cycle.");
                        if (desiredDate==null || 
nextDesiredNotificationDate.getTime() < desiredDate.getTime()) {
                                desiredDate = nextDesiredNotificationDate;

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/juddi-core/src/main/java/org/apache/juddi/validation/ValidateReplication.java
----------------------------------------------------------------------
diff --git 
a/juddi-core/src/main/java/org/apache/juddi/validation/ValidateReplication.java 
b/juddi-core/src/main/java/org/apache/juddi/validation/ValidateReplication.java
index fed1760..e5cbf43 100644
--- 
a/juddi-core/src/main/java/org/apache/juddi/validation/ValidateReplication.java
+++ 
b/juddi-core/src/main/java/org/apache/juddi/validation/ValidateReplication.java
@@ -14,18 +14,101 @@
  * limitations under the License.
  *
  */
-
 package org.apache.juddi.validation;
 
+import java.math.BigInteger;
+import javax.xml.ws.WebServiceContext;
 import org.apache.juddi.model.UddiEntityPublisher;
+import org.apache.juddi.v3.error.ErrorMessage;
+import org.apache.juddi.v3.error.FatalErrorException;
+import org.apache.juddi.v3.error.ValueNotAllowedException;
+import org.uddi.repl_v3.HighWaterMarkVectorType;
+import org.uddi.repl_v3.NotifyChangeRecordsAvailable;
+import org.uddi.repl_v3.ReplicationConfiguration;
+import org.uddi.v3_service.DispositionReportFaultMessage;
 
 /**
- * @author <a href="mailto:[email protected]";>Jeff Faath</a>
+ * @author <a href="mailto:[email protected]";>Alex O'Ree</a>
+ * Processing an inbound replication message may fail due to a server internal
+ * error. The common behavior for all error cases is to return an E_fatalError
+ * error code. Error reporting SHALL be that specified by Section 4.8 – 
Success
+ * and Error Reporting of this specification.
  */
 public class ValidateReplication extends ValidateUDDIApi {
 
-       public ValidateReplication(UddiEntityPublisher publisher) {
-               super(publisher);
-       }
-       
+        public ValidateReplication(UddiEntityPublisher publisher) {
+                super(publisher);
+        }
+
+        public void 
validateNotifyChangeRecordsAvailable(NotifyChangeRecordsAvailable body, 
WebServiceContext ctx) throws DispositionReportFaultMessage {
+                //TODO
+        }
+
+        public void validateGetChangeRecords(String requestingNode, 
HighWaterMarkVectorType changesAlreadySeen, BigInteger responseLimitCount, 
HighWaterMarkVectorType responseLimitVector, ReplicationConfiguration 
FetchEdges, WebServiceContext ctx) throws DispositionReportFaultMessage {
+                //TODO
+
+                if (requestingNode == null || 
requestingNode.trim().equalsIgnoreCase("")) {
+                        //requestingNode: The requestingNode element provides 
the identity of the calling node.  
+                        //This is the unique key for the calling node and 
SHOULD be specified within the Replication Configuration Structure.
+                        throw new FatalErrorException(new 
ErrorMessage("errors.replication.nodeNotSpecified"));
+                }
+                if (!ContainsNode(requestingNode, FetchEdges)) {
+                        throw new FatalErrorException(new 
ErrorMessage("errors.replication.unknownNode"));
+                }
+
+                if (changesAlreadySeen != null) {
+                        // changesAlreadySeen: The changesAlreadySeen element, 
if present, indicates changes from each
+                        //node that the requestor has successfully processed, 
and thus which should not be resent, if possible.
+
+                        //no validation needed?
+                }
+
+                if (responseLimitCount != null && responseLimitVector != null) 
{
+                        throw new FatalErrorException(new 
ErrorMessage("errors.replication.bothLimitsSpecified"));
+                }
+                if (responseLimitCount != null) {
+                        //can't be 0 since 0 is banned as being a change 
record id
+                        if (responseLimitCount.longValue() <= 0) {
+                                throw new FatalErrorException(new 
ErrorMessage("errors.replication.negativeLimit", 
responseLimitCount.toString()));
+                        }
+                }
+                if (responseLimitVector != null) {
+                        for (int i = 0; i < 
responseLimitVector.getHighWaterMark().size(); i++) {
+                                if 
(responseLimitVector.getHighWaterMark().get(i).getOriginatingUSN() == null
+                                     || 
responseLimitVector.getHighWaterMark().get(i).getOriginatingUSN() <= 0) {
+                                        throw new FatalErrorException(new 
ErrorMessage("errors.replication.limitVectorNull"));
+                                }
+                                if 
(responseLimitVector.getHighWaterMark().get(i).getNodeID()== null
+                                     || 
responseLimitVector.getHighWaterMark().get(i).getNodeID().trim().equalsIgnoreCase(""))
 {
+                                        throw new FatalErrorException(new 
ErrorMessage("errors.replication.limitVectorNoNode"));
+                                }
+                        }
+                }
+
+                /**
+                 * responseLimitCount or responseLimitVector: A caller MAY 
place
+                 * an upper bound on the number of change records he wishes to
+                 * receive in response to this message by either providing a
+                 * integer responseLimitCount, or, using responseLimitVector,
+                 * indicating for each node in the graph the first change
+                 * originating there that he does not wish to be returned.
+                 *
+                 */
+        }
+
+        private static boolean ContainsNode(String requestingNode, 
ReplicationConfiguration FetchEdges) {
+                if (FetchEdges == null) {
+                        return false;
+                }
+                if (FetchEdges.getCommunicationGraph() == null) {
+                        return false;
+                }
+                for (int i = 0; i < 
FetchEdges.getCommunicationGraph().getNode().size(); i++) {
+                        if 
(FetchEdges.getCommunicationGraph().getNode().get(i).equalsIgnoreCase(requestingNode))
 {
+                                return true;
+                        }
+                }
+                return false;
+        }
+
 }

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/juddi-core/src/main/resources/messages.properties
----------------------------------------------------------------------
diff --git a/juddi-core/src/main/resources/messages.properties 
b/juddi-core/src/main/resources/messages.properties
index 408106b..c1bcbd2 100644
--- a/juddi-core/src/main/resources/messages.properties
+++ b/juddi-core/src/main/resources/messages.properties
@@ -281,3 +281,14 @@ notifications.smtp.userfriendly.body=Hello %s,<br><br>You 
are currently register
 #username
 #node
 #search results or a specific item
+
+
+
+#replication error messages
+errors.replication.nodeNotSpecified=The requestor's node name must be specified
+errors.replication.unknownNode=The requestor's node is NOT in the replication 
configuration graph. Access Denied
+errors.replication.bothLimitsSpecified=responseLimitCount or 
responseLimitVector: A caller MAY place an upper bound on the number of change 
records he wishes to receive in response to this message by either providing a 
integer responseLimitCount, or, using responseLimitVector, indicating for each 
node in the graph the first change originating there that he does not wish to 
be returned.
+errors.replication.negativeLimit=The specified response limit is either 0 or a 
negative number.
+errors.replication.limitVectorNull=The high water mark vector limit specified 
OriginatingUSN is null or invalid
+errors.replication.limitVectorNoNode=No node name was specified
+errors.replication.configNodeNotFound=No specified node name is not currently 
registered as a node. Use the jUDDI Service API to register it. Node id: 

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/juddi-core/src/test/java/org/apache/juddi/util/JPAUtil.java
----------------------------------------------------------------------
diff --git a/juddi-core/src/test/java/org/apache/juddi/util/JPAUtil.java 
b/juddi-core/src/test/java/org/apache/juddi/util/JPAUtil.java
index 6c2eeca..b862063 100644
--- a/juddi-core/src/test/java/org/apache/juddi/util/JPAUtil.java
+++ b/juddi-core/src/test/java/org/apache/juddi/util/JPAUtil.java
@@ -35,8 +35,9 @@ import org.apache.juddi.config.PersistenceManager;
                System.out.println("object=" + object);
        }
  */
+@Deprecated
 public class JPAUtil {
-       //TODO Comment from Code Review: This class does not seem to be in use. 
Do we need it?
+       //REMOVE Comment from Code Review: This class does not seem to be in 
use. Do we need it?
        
        public static void persistEntity(Object uddiEntity, Object entityKey) {
                EntityManager em = PersistenceManager.getEntityManager();

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/EntryPoint.java
----------------------------------------------------------------------
diff --git 
a/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/EntryPoint.java
 
b/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/EntryPoint.java
index 2752e43..d9a86cf 100644
--- 
a/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/EntryPoint.java
+++ 
b/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/EntryPoint.java
@@ -15,7 +15,10 @@
  */
 package org.apache.juddi.samples;
 
+import java.util.List;
+import org.apache.juddi.api_v3.Node;
 import org.apache.juddi.v3.client.config.UDDIClient;
+import org.apache.juddi.v3.client.config.UDDINode;
 import org.apache.juddi.v3.client.transport.Transport;
 import org.uddi.api_v3.DiscardAuthToken;
 import org.uddi.api_v3.GetAuthToken;
@@ -35,17 +38,17 @@ public class EntryPoint {
                         System.out.println("____________________________");
                         System.out.println(" 1) Login (get an auth token)");
                         System.out.println(" 2) Compare Two 
Binding/tModelInstanceInfo - QOS Example");
-                        System.out.println(" 3) jUDDI Admin service - Register 
a Node");
+                        System.out.println(" 3) jUDDI Admin service - Register 
a Node (quick add of the jUDDI cloud server)");
                         System.out.println(" 4) Find Binding by QOS Parameters 
(Binding/tModelInstanceInfo)");
                         System.out.println(" 5) Find Service by QOS Parameters 
(Binding/tModelInstanceInfo)");
                         System.out.println(" 6) UDDI Create Bulk (makes N 
business/services");
-                        System.out.println(" 7) UDDI Custody Transfer");
+                        System.out.println(" 7) UDDI Custody Transfer (within 
a single node)");
                         System.out.println(" 8) UDDI Digital Signatures - Sign 
a Business");
                         System.out.println(" 9) UDDI Digital Signatures - Sign 
a Service");
                         System.out.println("10) UDDI Digital Signatures - Sign 
a tModel");
                         System.out.println("11) UDDI Digital Signatures - 
Search for Signed Items");
                         System.out.println("12) Find a Binding, lists all 
bindings for all services");
-                        System.out.println("13) Find Endpoints of a service");
+                        System.out.println("13) Find Endpoints of a service 
(given the key)");
                         System.out.println("14) Get the details of a service");
                         System.out.println("15) Make a Key Generator tModel");
                         System.out.println("16) Create a Business Relationship 
Between two users and two Businesses");
@@ -59,6 +62,17 @@ public class EntryPoint {
                         System.out.println("24) Delete a subscription");
                         System.out.println("25) Delete all subscriptions");
                         System.out.println("26) Subscriptions - Asynchronous, 
publisher assertion subscriptions");
+                        System.out.println("27) Replication - do_ping");
+                        System.out.println("28) Replication - get high 
watermarks");
+                        System.out.println("29) Replication - get change 
records");
+                        System.out.println("30) Replication - Setup 
replication between two nodes");
+                        System.out.println("31) Quick add the jUDDI cloud node 
to *this's configuration file");
+                        System.out.println("32) Add a node to *this's 
configuration file");
+                        System.out.println("33) Register a *this node to a 
jUDDI server");
+                        System.out.println("34) View all registered remote 
nodes on a jUDDI server");
+                        System.out.println("35) View all registered nodes for 
this client");
+                        System.out.println("36) UnRegister a node on a jUDDI 
server");
+
                         System.out.println("q) quit");
                         System.out.print("Selection: ");
                         input = System.console().readLine();
@@ -93,7 +107,7 @@ public class EntryPoint {
                         CompareByTModelInstanceInfoQOS.main(null);
                 }
                 if (input.equals("3")) {
-                        new JuddiAdminService().go(authtoken);
+                        new 
JuddiAdminService().quickRegisterRemoteCloud(authtoken);
                 }
                 if (input.equals("4")) {
                         SearchByQos.doFindBinding(authtoken);
@@ -256,10 +270,146 @@ public class EntryPoint {
                 if (input.equals("25")) {
                         new 
UddiSubscriptionManagement().DeleteAllSubscriptions(authtoken);
                 }
-                 if (input.equals("26")) {
+                if (input.equals("26")) {
                         new UddiSubscribeAssertionStatus().Fire();
 
                 }
+                if (input.equals("27")) {
+                        //System.out.println("27) Replication - do_ping");
+
+                        System.out.print("URL: ");
+                        String key2 = (System.console().readLine());
+                        new UddiReplication().DoPing(key2);
+
+                }
+                if (input.equals("28")) {
+                        //System.out.println("28) Replication - get high 
watermarks");
+                        System.out.print("URL: ");
+                        String key2 = (System.console().readLine());
+                        new UddiReplication().GetHighWatermarks(key2);
+
+                }
+                if (input.equals("29")) {
+                        //System.out.println("29) Replication - get change 
records");
+                        System.out.print("URL: ");
+                        String key2 = (System.console().readLine());
+
+                        System.out.print("Change ID to fetch: ");
+                        String id = (System.console().readLine());
+
+                        new UddiReplication().GetChangeRecords(key2, 
Long.parseLong(id));
+
+                }
+                if (input.equals("30")) {
+                        // System.out.println("30) Replication - Setup 
replication between two nodes");
+                        new JuddiAdminService().setupReplication();
+
+                }
+                if (input.equals("31")) {
+                        //System.out.println("31) Quick add the jUDDI cloud 
node to *this's configuration file");
+                        new JuddiAdminService().quickRegisterLocalCloud();
+                }
+                if (input.equals("32")) {
+                        // System.out.println("32) Add a node to *this's 
configuration file");
+                        UDDIClient clerkManager = new 
UDDIClient("META-INF/simple-publish-uddi.xml");
+                        UDDINode node = new UDDINode();
+                        System.out.print("Name (must be unique: ");
+                        node.setClientName(System.console().readLine());
+                        System.out.print("Description: ");
+                        node.setDescription(System.console().readLine());
+
+                        node.setHomeJUDDI(false);
+                        System.out.print("Inquiry URL: ");
+                        node.setInquiryUrl(System.console().readLine());
+
+                        System.out.print("Inquiry REST URL (optional): ");
+                        node.setInquiryRESTUrl(System.console().readLine());
+
+                        System.out.print("jUDDI API URL (optional): ");
+                        node.setJuddiApiUrl(System.console().readLine());
+                        System.out.print("Custody Transfer URL: ");
+                        
node.setCustodyTransferUrl(System.console().readLine());
+                        System.out.print("Publish URL: ");
+                        node.setPublishUrl(System.console().readLine());
+                        System.out.print("Replication URL: ");
+                        node.setReplicationUrl(System.console().readLine());
+                        System.out.print("Security URL: ");
+                        node.setSecurityUrl(System.console().readLine());
+                        System.out.print("Subscription URL: ");
+                        node.setSubscriptionUrl(System.console().readLine());
+                        System.out.print("Transport (defaults to JAXWS): ");
+                        node.setProxyTransport(System.console().readLine());
+                        if (node.getProxyTransport() == null) {
+                                
node.setProxyTransport(org.apache.juddi.v3.client.transport.JAXWSTransport.class.getCanonicalName());
+                        }
+                        System.out.print("Factory Initial (optional): ");
+                        node.setFactoryInitial(System.console().readLine());
+                        System.out.print("Factory Naming Provider (optional): 
");
+                        
node.setFactoryNamingProvider(System.console().readLine());
+                        System.out.print("Factory URL Packages (optional): ");
+                        node.setFactoryURLPkgs(System.console().readLine());
+
+                        clerkManager.getClientConfig().addUDDINode(node);
+                        clerkManager.getClientConfig().saveConfig();
+                        System.out.println("Saved.");
+                }
+                if (input.equals("32")) {
+
+                        //System.out.println("32) Register a *this node to a 
jUDDI server");
+                        UDDIClient clerkManager = new 
UDDIClient("META-INF/simple-publish-uddi.xml");
+                        List<Node> uddiNodeList = 
clerkManager.getClientConfig().getUDDINodeList();
+                        System.out.println();
+                        
+                        System.out.println("Locally defined nodes:");
+                        for (int i = 0; i < uddiNodeList.size(); i++) {
+                                
System.out.println("________________________________________________________________________________");
+                                System.out.println(i + ") Node name: " + 
uddiNodeList.get(i).getName());
+                                System.out.println(i + ") Node description: " 
+ uddiNodeList.get(i).getDescription());
+                                System.out.println(i + ") Transport: " + 
uddiNodeList.get(i).getProxyTransport());
+                                System.out.println(i + ") jUDDI URL: " + 
uddiNodeList.get(i).getJuddiApiUrl());
+                        }
+                        System.out.println("Local Node to publish to remote 
jUDDI instance: ");
+                        int 
index=Integer.parseInt(System.console().readLine());
+                        
+                        System.out.println("Pick a node (remote jUDDI 
instance) to publish the selected node information to");
+                        for (int i = 0; i < uddiNodeList.size(); i++) {
+                                
System.out.println("________________________________________________________________________________");
+                                System.out.println(i + ") Node name: " + 
uddiNodeList.get(i).getName());
+                                System.out.println(i + ") Node description: " 
+ uddiNodeList.get(i).getDescription());
+                                System.out.println(i + ") Transport: " + 
uddiNodeList.get(i).getProxyTransport());
+                                System.out.println(i + ") jUDDI URL: " + 
uddiNodeList.get(i).getJuddiApiUrl());
+                        }
+                        System.out.println("Node to publish to remote jUDDI 
instance: ");
+                        int 
index2=Integer.parseInt(System.console().readLine());
+                        
+                        
+                        new 
JuddiAdminService().registerLocalNodeToRemoteNode(authtoken, 
uddiNodeList.get(index), uddiNodeList.get(index2)); 
+                        
+                }
+                if (input.equals("34")) {
+
+                        // System.out.println("33) View all register remote 
nodes on a jUDDI server");
+                        new JuddiAdminService().viewRemoteNodes(authtoken);
+                }
+
+                if (input.equals("35")) {
+                        UDDIClient clerkManager = new 
UDDIClient("META-INF/simple-publish-uddi.xml");
+                        List<Node> uddiNodeList = 
clerkManager.getClientConfig().getUDDINodeList();
+                        for (int i = 0; i < uddiNodeList.size(); i++) {
+                                
System.out.println("________________________________________________________________________________");
+                                System.out.println("Client name: " + 
uddiNodeList.get(i).getClientName());
+                                System.out.println("Node name: " + 
uddiNodeList.get(i).getName());
+                                System.out.println("Node description: " + 
uddiNodeList.get(i).getDescription());
+                                System.out.println("Transport: " + 
uddiNodeList.get(i).getProxyTransport());
+                                System.out.println(i + ") jUDDI URL: " + 
uddiNodeList.get(i).getJuddiApiUrl());
+
+                        }
+
+                }
+                if (input.equals("36")) {
+
+                        //System.out.println("35) UnRegister a node on a jUDDI 
server");
+                }
 
         }
 }

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/JuddiAdminService.java
----------------------------------------------------------------------
diff --git 
a/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/JuddiAdminService.java
 
b/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/JuddiAdminService.java
index 01b6694..2ffa170 100644
--- 
a/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/JuddiAdminService.java
+++ 
b/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/JuddiAdminService.java
@@ -15,13 +15,21 @@
  */
 package org.apache.juddi.samples;
 
+import java.rmi.RemoteException;
+import java.util.List;
+import javax.xml.bind.JAXB;
+import org.apache.commons.configuration.ConfigurationException;
 import org.apache.juddi.api_v3.Node;
+import org.apache.juddi.api_v3.NodeDetail;
+import org.apache.juddi.api_v3.NodeList;
 import org.apache.juddi.api_v3.SaveNode;
 import org.apache.juddi.jaxb.PrintJUDDI;
 import org.apache.juddi.v3.client.config.UDDIClerk;
 import org.apache.juddi.v3.client.config.UDDIClient;
 import org.apache.juddi.v3.client.config.UDDIClientContainer;
+import org.apache.juddi.v3.client.config.UDDINode;
 import org.apache.juddi.v3.client.transport.Transport;
+import org.apache.juddi.v3.client.transport.TransportException;
 import org.apache.juddi.v3_service.JUDDIApiPortType;
 import org.uddi.api_v3.AuthToken;
 import org.uddi.api_v3.GetAuthToken;
@@ -34,62 +42,124 @@ import org.uddi.v3_service.UDDISecurityPortType;
  */
 public class JuddiAdminService {
 
-    private static UDDISecurityPortType security = null;
-    private static UDDIPublicationPortType publish = null;
-    static JUDDIApiPortType juddi = null;
-    static UDDIClerk clerk = null;
-
-    public JuddiAdminService() {
-        try {
-            // create a manager and read the config in the archive; 
-            // you can use your config file name
-            UDDIClient clerkManager = new 
UDDIClient("META-INF/simple-publish-uddi.xml");
-            clerk = clerkManager.getClerk("default");
-            // The transport can be WS, inVM, RMI etc which is defined in the 
uddi.xml
-            Transport transport = clerkManager.getTransport();
-            // Now you create a reference to the UDDI API
-            security = transport.getUDDISecurityService();
-            publish = transport.getUDDIPublishService();
-            juddi = transport.getJUDDIApiService();
-        } catch (Exception e) {
-            e.printStackTrace();
+        private static UDDISecurityPortType security = null;
+        private static UDDIPublicationPortType publish = null;
+        static JUDDIApiPortType juddi = null;
+        static UDDIClerk clerk = null;
+        static UDDIClient clerkManager = null;
+
+        public JuddiAdminService() {
+                try {
+                        // create a manager and read the config in the 
archive; 
+                        // you can use your config file name
+                        clerkManager = new 
UDDIClient("META-INF/simple-publish-uddi.xml");
+                        clerk = clerkManager.getClerk("default");
+                        // The transport can be WS, inVM, RMI etc which is 
defined in the uddi.xml
+                        Transport transport = clerkManager.getTransport();
+                        // Now you create a reference to the UDDI API
+                        security = transport.getUDDISecurityService();
+                        publish = transport.getUDDIPublishService();
+                        juddi = transport.getJUDDIApiService();
+                } catch (Exception e) {
+                        e.printStackTrace();
+                }
+        }
+
+        static Node getCloudInstance() {
+                Node n = new Node();
+                n.setClientName("juddicloud");
+                n.setName("juddicloud");
+                
n.setCustodyTransferUrl("http://uddi-jbossoverlord.rhcloud.com/services/custody-transfer";);
+                n.setDescription("juddicloud");
+                
n.setProxyTransport("org.apache.juddi.v3.client.transport.JAXWSTransport");
+                
n.setInquiryUrl("http://uddi-jbossoverlord.rhcloud.com/services/inquiry";);
+                
n.setJuddiApiUrl("http://uddi-jbossoverlord.rhcloud.com/services/juddi-api";);
+                
n.setPublishUrl("http://uddi-jbossoverlord.rhcloud.com/services/publish";);
+                
n.setSecurityUrl("http://uddi-jbossoverlord.rhcloud.com/services/security";);
+                
n.setSubscriptionListenerUrl("http://uddi-jbossoverlord.rhcloud.com/services/subscription-listener";);
+                
n.setSubscriptionUrl("http://uddi-jbossoverlord.rhcloud.com/services/subscription";);
+                
n.setReplicationUrl("uddi-jbossoverlord.rhcloud.com/services/replication");
+                return n;
+        }
+
+        public void quickRegisterRemoteCloud(String token) {
+                try {
+                        // Setting up the values to get an authentication 
token for the 'root' user ('root' user has admin privileges
+                        // and can save other publishers).
+                        SaveNode node = new SaveNode();
+                        node.setAuthInfo(token);
+
+                        node.getNode().add(getCloudInstance());
+
+                        PrintJUDDI<SaveNode> p = new PrintJUDDI<SaveNode>();
+                        System.out.println("Before sending");
+                        System.out.println(p.print(node));
+                        juddi.saveNode(node);
+                        System.out.println("Saved");
+
+                } catch (Exception e) {
+                        e.printStackTrace();
+                }
+        }
+
+        void setupReplication() {
+                throw new UnsupportedOperationException("Not supported yet."); 
//To change body of generated methods, choose Tools | Templates.
+        }
+
+        void viewRemoteNodes(String authtoken) throws ConfigurationException, 
TransportException, RemoteException {
+
+                List<Node> uddiNodeList = 
clerkManager.getClientConfig().getUDDINodeList();
+                System.out.println();
+                System.out.println("Select a node");
+                for (int i = 0; i < uddiNodeList.size(); i++) {
+                        System.out.print(i + 1);
+                        System.out.println(") " + 
uddiNodeList.get(i).getName() + uddiNodeList.get(i).getDescription());
+                }
+                System.out.println("Node #: ");
+                int index = Integer.parseInt(System.console().readLine()) - 1;
+                String node = uddiNodeList.get(index).getName();
+                Transport transport = clerkManager.getTransport(node);
+
+                JUDDIApiPortType juddiApiService = 
transport.getJUDDIApiService();
+
+                NodeList allNodes = juddiApiService.getAllNodes(authtoken);
+                if (allNodes == null || allNodes.getNode().isEmpty()) {
+                        System.out.println("No nodes registered!");
+                } else {
+                        for (int i = 0; i < allNodes.getNode().size(); i++) {
+                                
System.out.println("_______________________________________________________________________________");
+                                System.out.println("Name :" + 
allNodes.getNode().get(i).getName());
+                                System.out.println("Inquiry :" + 
allNodes.getNode().get(i).getInquiryUrl());
+                                System.out.println("Publish :" + 
allNodes.getNode().get(i).getPublishUrl());
+                                System.out.println("Securit :" + 
allNodes.getNode().get(i).getSecurityUrl());
+                                System.out.println("Replication :" + 
allNodes.getNode().get(i).getReplicationUrl());
+                                System.out.println("Subscription :" + 
allNodes.getNode().get(i).getSubscriptionUrl());
+                                System.out.println("Custody Xfer :" + 
allNodes.getNode().get(i).getCustodyTransferUrl());
+
+                        }
+                }
+
         }
-    }
-
-    public void go(String token) {
-        try {
-            // Setting up the values to get an authentication token for the 
'root' user ('root' user has admin privileges
-            // and can save other publishers).
-                
-            
-
-          
-            SaveNode node = new SaveNode();
-            node.setAuthInfo(token);
-            Node n = new Node();
-            n.setClientName("juddicloud");
-            n.setName("juddicloud");
-            
n.setCustodyTransferUrl("http://uddi-jbossoverlord.rhcloud.com/services/custody-transfer";);
-            n.setDescription("juddicloud");
-            
n.setProxyTransport("org.apache.juddi.v3.client.transport.JAXWSTransport");
-            
n.setInquiryUrl("http://uddi-jbossoverlord.rhcloud.com/services/inquiry";);
-            
n.setJuddiApiUrl("http://uddi-jbossoverlord.rhcloud.com/services/juddi-api";);
-            
n.setPublishUrl("http://uddi-jbossoverlord.rhcloud.com/services/publish";);
-            n.setSecurityUrl( 
"http://uddi-jbossoverlord.rhcloud.com/services/security";);
-            
n.setSubscriptionListenerUrl("http://uddi-jbossoverlord.rhcloud.com/services/subscription-listener";);
-            
n.setSubscriptionUrl("http://uddi-jbossoverlord.rhcloud.com/services/subscription";);
-            node.getNode().add(n);
-            
-            PrintJUDDI<SaveNode> p = new PrintJUDDI<SaveNode>();
-            System.out.println("Before sending");
-            System.out.println(p.print(node));
-            juddi.saveNode(node);
-            System.out.println("Saved");
-         
-            
-
-        } catch (Exception e) {
-            e.printStackTrace();
+
+        void quickRegisterLocalCloud() throws ConfigurationException {
+                UDDINode node = new UDDINode(getCloudInstance());
+                clerkManager.getClientConfig().addUDDINode(node);
+                clerkManager.getClientConfig().saveConfig();
+                System.out.println();
+                System.out.println("Added and saved.");
+        }
+
+        void registerLocalNodeToRemoteNode(String authtoken, Node cfg, Node 
publishTo) throws Exception {
+             
+                Transport transport = 
clerkManager.getTransport(publishTo.getName());
+
+                JUDDIApiPortType juddiApiService = 
transport.getJUDDIApiService();
+                SaveNode sn = new SaveNode();
+                sn.setAuthInfo(authtoken);
+                sn.getNode().add(cfg);
+                NodeDetail saveNode = juddiApiService.saveNode(sn);
+                JAXB.marshal(saveNode, System.out);
+                System.out.println("Success.");
+
         }
-    }
 }

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/UddiFindEndpoints.java
----------------------------------------------------------------------
diff --git 
a/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/UddiFindEndpoints.java
 
b/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/UddiFindEndpoints.java
index ba5fb41..637b501 100644
--- 
a/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/UddiFindEndpoints.java
+++ 
b/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/UddiFindEndpoints.java
@@ -56,7 +56,6 @@ public class UddiFindEndpoints {
 
         public void Fire(String authtoken, String key) {
                 try {
-                        //TODO Key! insert your key here!
                         if (key == null) {
                                 key = "uddi:juddi.apache.org:services-inquiry";
                         }

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/UddiReplication.java
----------------------------------------------------------------------
diff --git 
a/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/UddiReplication.java
 
b/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/UddiReplication.java
new file mode 100644
index 0000000..4878202
--- /dev/null
+++ 
b/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/UddiReplication.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2014 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.
+ */
+package org.apache.juddi.samples;
+
+import java.math.BigInteger;
+import java.rmi.RemoteException;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.xml.ws.BindingProvider;
+import org.apache.juddi.v3.client.UDDIService;
+import org.uddi.repl_v3.ChangeRecord;
+import org.uddi.repl_v3.ChangeRecordIDType;
+import org.uddi.repl_v3.DoPing;
+import org.uddi.repl_v3.HighWaterMarkVectorType;
+import org.uddi.v3_service.UDDIReplicationPortType;
+
+/**
+ *
+ * @author Alex O'Ree
+ */
+class UddiReplication {
+
+        public UddiReplication() {
+        }
+
+        String DoPing(String key2) {
+                try {
+                        UDDIReplicationPortType uddiReplicationPort = new 
UDDIService().getUDDIReplicationPort();
+                        ((BindingProvider) 
uddiReplicationPort).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
 key2);
+                        String doPing = uddiReplicationPort.doPing(new 
DoPing());
+                        System.out.println("Ping Success, remote node's id is 
" + doPing);
+                        return doPing;
+                } catch (Exception ex) {
+                        
Logger.getLogger(UddiReplication.class.getName()).log(Level.SEVERE, null, ex);
+                }
+                return null;
+        }
+
+        void GetHighWatermarks(String key2) {
+                try {
+                        UDDIReplicationPortType uddiReplicationPort = new 
UDDIService().getUDDIReplicationPort();
+                        ((BindingProvider) 
uddiReplicationPort).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
 key2);
+                        List<ChangeRecordIDType> highWaterMarks = 
uddiReplicationPort.getHighWaterMarks();
+                        System.out.println("Success....");
+                        System.out.println("Node, USN");
+                        for (int i = 0; i < highWaterMarks.size(); i++) {
+                                System.out.println(
+                                     highWaterMarks.get(i).getNodeID() + ", "
+                                     + 
highWaterMarks.get(i).getOriginatingUSN());
+                        }
+                } catch (Exception ex) {
+                        
Logger.getLogger(UddiReplication.class.getName()).log(Level.SEVERE, null, ex);
+                }
+        }
+
+        void GetChangeRecords(String key2, Long record) {
+                try {
+                        UDDIReplicationPortType uddiReplicationPort = new 
UDDIService().getUDDIReplicationPort();
+                        HighWaterMarkVectorType highWaterMarkVectorType = new 
HighWaterMarkVectorType();
+                        
+                        
+                        highWaterMarkVectorType.getHighWaterMark().add(new 
ChangeRecordIDType(DoPing(key2), record));
+                        ((BindingProvider) 
uddiReplicationPort).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
 key2);
+                        List<ChangeRecord> changeRecords = 
uddiReplicationPort.getChangeRecords("random", null, BigInteger.valueOf(100), 
highWaterMarkVectorType);
+                        System.out.println("Success...." + 
changeRecords.size() + " records returned");
+                        System.out.println("Node, USN, type");
+                        for (int i = 0; i < changeRecords.size(); i++) {
+                                System.out.println(
+                                     
changeRecords.get(i).getChangeID().getNodeID() + ", "
+                                     + 
changeRecords.get(i).getChangeID().getOriginatingUSN() + ": "
+                                     + GetChangeType(changeRecords.get(i)));
+                        }
+                } catch (Exception ex) {
+                        
Logger.getLogger(UddiReplication.class.getName()).log(Level.SEVERE, null, ex);
+                }
+        }
+
+        private String GetChangeType(ChangeRecord get) {
+                if (get.getChangeRecordAcknowledgement() != null) {
+                        return "ACK";
+                }
+                if (get.getChangeRecordConditionFailed() != null) {
+                        return "ConditionFailed";
+                }
+                if (get.getChangeRecordCorrection() != null) {
+                        return "Correction";
+                }
+                if (get.getChangeRecordDelete() != null) {
+                        return "Deletion";
+                }
+                if (get.getChangeRecordDeleteAssertion() != null) {
+                        return "Delete Assertion";
+                }
+                if (get.getChangeRecordHide() != null) {
+                        return "Hide tmodel";
+                }
+                if (get.getChangeRecordNewData() != null) {
+                        return "New Data";
+                }
+                if (get.getChangeRecordNewDataConditional() != null) {
+                        return "New data conditional";
+                }
+                if (get.getChangeRecordNull() != null) {
+                        return "Null";
+                }
+                if (get.getChangeRecordPublisherAssertion() != null) {
+                        return "New publisher assertion";
+                }
+                return null;
+        }
+
+}

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/juddi-gui/src/main/webapp/ajax/assertions.jsp
----------------------------------------------------------------------
diff --git a/juddi-gui/src/main/webapp/ajax/assertions.jsp 
b/juddi-gui/src/main/webapp/ajax/assertions.jsp
index b5de546..7854912 100644
--- a/juddi-gui/src/main/webapp/ajax/assertions.jsp
+++ b/juddi-gui/src/main/webapp/ajax/assertions.jsp
@@ -44,7 +44,6 @@
         if (msg != null && msg.get() != null) {
             out.write(UddiHub.ToErrorAlert(msg.get()));
         } else if (data == null || data.isEmpty())
-                //TODO revise this
             out.write(UddiHub.ToErrorAlert(ResourceLoader.GetResource(session, 
"errors.nodatareturned")));
         else {
 

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/juddi-gui/src/main/webapp/ajax/copyitem.jsp
----------------------------------------------------------------------
diff --git a/juddi-gui/src/main/webapp/ajax/copyitem.jsp 
b/juddi-gui/src/main/webapp/ajax/copyitem.jsp
index 656623d..6f09ea6 100644
--- a/juddi-gui/src/main/webapp/ajax/copyitem.jsp
+++ b/juddi-gui/src/main/webapp/ajax/copyitem.jsp
@@ -9,7 +9,7 @@
 
 <%@include  file="../csrf.jsp" %>
 <%
-    //TODO for 3.2.1
+    //TODO for 3.3
     /*if (request.getMethod().equalsIgnoreCase("POST")) {
         UddiHub x = UddiHub.getInstance(application, session);
         out.write(x.copyEntity(request.getParameter("id"),

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/juddi-tomcat/juddiv3Node2.xml
----------------------------------------------------------------------
diff --git a/juddi-tomcat/juddiv3Node2.xml b/juddi-tomcat/juddiv3Node2.xml
index fac3a83..988eb81 100644
--- a/juddi-tomcat/juddiv3Node2.xml
+++ b/juddi-tomcat/juddiv3Node2.xml
@@ -16,15 +16,18 @@
                        
<baseurlsecure>https://localhost:9443/juddiv3</baseurlsecure>
                </server>
                <!-- The node Id must be unique when setup in a cluster of UDDI 
servers implementing the replication API
-                       don't worry, jUDDI doesn't implement it right now, but 
it may come in the future -->
-               <nodeId>uddi:juddi.apache.org:node2</nodeId>
+                       don't worry, jUDDI doesn't implement it right now, but 
it may come in the future 
+                       
+                        Per the spec, The value used MUST match the 
businessKey of the Node Business Entity
+                        -->
+               <nodeId>uddi:another.juddi.apache.org:node2</nodeId>
                <!-- The key of the root business that all of the UDDI services 
are registered in, as defined in the install_data -->
                <root>
                        <!-- this is the 'root' username, or owner of the node 
-->
                        <publisher>root</publisher>
                        <!-- The key of the root business that all of the UDDI 
services are registered in, as defined in the install_data -->
-                       
<businessId>uddi:juddi.apache.org:businesses-asf</businessId>
-                       <partition>uddi:juddi.apache.org</partition>
+                       
<businessId>uddi:another.juddi.apache.org:node2</businessId>
+                       <partition>uddi:another.juddi.apache.org</partition>
                </root>
                <seed>
                        <always>false</always>
@@ -189,5 +192,9 @@
                                <password encrypted="false">pass</password>-->
                        </smtp>
                </mail>
+               
+               <logging>
+                       
<logInquirySearchPayloads>false</logInquirySearchPayloads>
+               </logging>
        </juddi>
 </config>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/juddiv3-war/src/main/webapp/WEB-INF/classes/juddiv3.xml
----------------------------------------------------------------------
diff --git a/juddiv3-war/src/main/webapp/WEB-INF/classes/juddiv3.xml 
b/juddiv3-war/src/main/webapp/WEB-INF/classes/juddiv3.xml
index 3468b3d..788fdf1 100644
--- a/juddiv3-war/src/main/webapp/WEB-INF/classes/juddiv3.xml
+++ b/juddiv3-war/src/main/webapp/WEB-INF/classes/juddiv3.xml
@@ -16,7 +16,10 @@
                        
<baseurlsecure>https://localhost:8443/juddiv3</baseurlsecure>
                </server>
                <!-- The node Id must be unique when setup in a cluster of UDDI 
servers implementing the replication API
-                       don't worry, jUDDI doesn't implement it right now, but 
it may come in the future -->
+                       don't worry, jUDDI doesn't implement it right now, but 
it may come in the future 
+                       
+                        Per the spec, The value used MUST match the 
businessKey of the Node Business Entity
+                        -->
                <nodeId>uddi:juddi.apache.org:node1</nodeId>
                <!-- The key of the root business that all of the UDDI services 
are registered in, as defined in the install_data -->
                <root>

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/uddi-tck/src/test/java/org/apache/juddi/v3/tck/JUDDI_091_RMISubscriptionListenerIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/uddi-tck/src/test/java/org/apache/juddi/v3/tck/JUDDI_091_RMISubscriptionListenerIntegrationTest.java
 
b/uddi-tck/src/test/java/org/apache/juddi/v3/tck/JUDDI_091_RMISubscriptionListenerIntegrationTest.java
index 4e36c5f..a25d29b 100644
--- 
a/uddi-tck/src/test/java/org/apache/juddi/v3/tck/JUDDI_091_RMISubscriptionListenerIntegrationTest.java
+++ 
b/uddi-tck/src/test/java/org/apache/juddi/v3/tck/JUDDI_091_RMISubscriptionListenerIntegrationTest.java
@@ -90,7 +90,6 @@ public class JUDDI_091_RMISubscriptionListenerIntegrationTest 
{
 
 
                 } catch (Exception e2) {
-                        // TODO Auto-generated catch block
                         e2.printStackTrace();
                         Assert.fail();
                 }

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/uddi-tck/src/test/java/org/apache/juddi/v3/tck/UDDI_090_SubscriptionListenerIntegrationBase.java
----------------------------------------------------------------------
diff --git 
a/uddi-tck/src/test/java/org/apache/juddi/v3/tck/UDDI_090_SubscriptionListenerIntegrationBase.java
 
b/uddi-tck/src/test/java/org/apache/juddi/v3/tck/UDDI_090_SubscriptionListenerIntegrationBase.java
index d300523..ef90b62 100644
--- 
a/uddi-tck/src/test/java/org/apache/juddi/v3/tck/UDDI_090_SubscriptionListenerIntegrationBase.java
+++ 
b/uddi-tck/src/test/java/org/apache/juddi/v3/tck/UDDI_090_SubscriptionListenerIntegrationBase.java
@@ -738,7 +738,7 @@ public abstract class 
UDDI_090_SubscriptionListenerIntegrationBase {
          * @throws Exception
          */
         @Test
-        @Ignore
+        //@Ignore
         public void joePublisherUpdate_PUBLISHERASSERTION_DETAIL_TO() throws 
Exception {
                 Assume.assumeTrue(TckPublisher.isEnabled());
                 Assume.assumeNotNull(getHostame());
@@ -781,8 +781,8 @@ public abstract class 
UDDI_090_SubscriptionListenerIntegrationBase {
                         AddPublisherAssertions pa = new 
AddPublisherAssertions();
                         pa.setAuthInfo(authInfoMary);
                         PublisherAssertion pas = new PublisherAssertion();
-                        pas.setToKey(TckBusiness.JOE_BUSINESS_KEY);
-                        pas.setFromKey(TckBusiness.MARY_BUSINESS_KEY);
+                        pas.setToKey(TckBusiness.MARY_BUSINESS_KEY);
+                        pas.setFromKey(TckBusiness.JOE_BUSINESS_KEY);
                         pas.setKeyedReference(new 
KeyedReference(UDDIConstants.RELATIONSHIPS, "parent", "parent-child"));
                         pa.getPublisherAssertion().add(pas);
 

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordDelete.java
----------------------------------------------------------------------
diff --git a/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordDelete.java 
b/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordDelete.java
index ef4ef53..3e70b67 100644
--- a/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordDelete.java
+++ b/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordDelete.java
@@ -30,6 +30,11 @@ import javax.xml.datatype.XMLGregorianCalendar;
 
 
 /**
+ * A changeRecordDelete element indicates that an item defined in the UDDI 
registry is to no longer be used and expunged from the data stores in each of 
the nodes. The item to be deleted is indicated in the change record by the key 
of an appropriate entity type; this must contain the unique key of some 
businessEntity, businessService, bindingTemplate, or tModel that is presently 
defined.  The changeRecordDelete element for deleting tModels corresponds to 
the administrative deletion of a tModel described in Section 6.1.3 Updates and 
Deletions of this specification.  The changeRecordDelete for a tModel does not 
correspond to any API described in this specification and should only appear in 
the replication stream as the result of an administrative function to 
permanently remove a tModel.
+
+Permanent deletions of tModel information within the node may be made 
administratively. In this event, a UDDI Node may insert a delete operation into 
the replication stream.  The publisher identifier for this operation is the 
account associated with the UDDI Node.  Note that a permanent deletion of 
tModel information from the registry must have the prior approval of the other 
nodes participating within the registry.
+
+The changeRecordDelete MUST contain a modified timestamp to allow multi-node 
registries to calculate consistent modifiedIncludingChildren timestamps as 
described in Section 3.8 operationalInfo Structure.
  * <p>Java class for anonymous complex type.
  * 
  * <p>The following schema fragment specifies the expected content contained 
within this class.

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordDeleteAssertion.java
----------------------------------------------------------------------
diff --git 
a/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordDeleteAssertion.java 
b/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordDeleteAssertion.java
index 542058f..09e519a 100644
--- a/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordDeleteAssertion.java
+++ b/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordDeleteAssertion.java
@@ -31,6 +31,34 @@ import org.uddi.api_v3.PublisherAssertion;
 
 
 /**
+ * The changeRecordPublisherAssertion element describes the information that 
UDDI replication MUST convey in order to support the business-to-business 
relationship definition supported by UDDI. 
+
+An implementation MUST be able to determine the Registry changes from the 
information transmitted within the replication stream.  The fromBusinessCheck 
and toBusinessCheck elements are Boolean values that represent which side of 
the business relationship is being asserted.  A changeRecordPublisherAssertion 
message may include one or both sides of the relationship.  For example, if the 
fromBusinessCheck is present and set to "true" then the assertion represents 
the parent-side of a parent-child relationship.
+* 
+* <br>
+* <img src="http://www.uddi.org/pubs/uddi-v3.0.2-20041019_files/image115.gif";>
+* <br>
+* A changeRecordPublisherAssertion element indicates that one or both sides of 
the business relationship are to be inserted.
+<BR><BR>
+a.       changeRecordPublisherAssertion with:
+<BR><BR>
+&lt;fromBusinessCheck>true</fromBusinessCheck> and 
&lt;toBusinessCheck>true</toBusinessCheck> is used to indicate that both sides 
of the publisherAssertion (i.e., business relationship) are to be inserted. The 
two businessEntity elements that are referred to within the publisherAssertion 
MUST be in the custody of the node that originates the changeRecord.
+<BR><BR>
+b.      changeRecordPublisherAssertion with:
+<BR><BR>
+&lt;fromBusinessCheck>true</fromBusinessCheck> and 
&lt;toBusinessCheck>false</toBusinessCheck> is used to indicate that the 
fromBusinessCheck side of the publisherAssertion (i.e., business relationship) 
is to be inserted. The businessEntity that is referred to in the 
fromBusinessCheck MUST be in the custody of the node that originates the 
changeRecord.
+<BR><BR>
+c.       changeRecordPublisherAssertion with:
+<BR><BR>
+&lt;fromBusinessCheck>false</fromBusinessCheck> and 
&lt;toBusinessCheck>true</toBusinessCheck> is used to indicate that the 
toBusinessCheck side of the publisherAssertion (i.e., business relationship) is 
to be inserted. The businessEntity that is referred to in the toBusinessCheck 
MUST be in the custody of the node that originates the changeRecord.
+<BR><BR>
+d.      changeRecordPublisherAssertion with:
+<BR><BR>
+&lt;fromBusinessCheck>false</fromBusinessCheck> and 
&lt;toBusinessCheck>false</toBusinessCheck> if this is received in the 
replication stream, such a changeRecord will not generate any change to the 
registry. The node SHOULD log any events such as this.
+<BR><BR>
+The operationalInfo element MUST contain a modified date corresponding to the 
update for the publisher assertion. This modified date should be stored by 
nodes supporting the subscription APIs in order to respond to subscription 
requests involving find_relatedBusinesses and get_assertionStatusReport 
filters. Since the publisherAssertions corresponding to a relationship may be 
originated from more than one node, the modified date stored for any 
relationship corresponding to the publisher should be the most recent date 
received from any node.
+<BR><BR>
+To handle signed publisherAssertion elements, it is necessary to indicate 
which set of signatures are being completely replaced as a result of the 
originating node’s change to update one or both sides of the relationship 
represented by the publisherAssertion. The optional signature element in the 
publisherAssertion must be ignored in replication and the toSignatures and 
fromSignatures elements must be used to replace signatures stored for the 
publisherAssertion. One of the elements toSignatures, fromSignatures or both 
must appear in the changeRecordPublisherAssertion. The presence of a 
toSignatures or fromSignatures element indicates that the signatures associated 
with the "to" or "from" side of the relationship must be deleted and completely 
replaced with the Signatures in the toSignatures or fromSignatures element. In 
the case where a single publisherAssertion represents both sides of the 
relationship, the node originating the corresponding 
changeRecordPublisherAssertion must in
 clude both a toSignatures and fromSignatures element with the identical set of 
Signature elements in both the toSignatures and fromSignatures. When the 
toSignatures element is not present, no changes are made to the signature 
elements associated with the "to" side of the relationship in the node. 
Similarily, when the fromSignatures element is not present, no changes are made 
to the signature elements associated with the "from" side of the relationship 
in the node.
  * <p>Java class for anonymous complex type.
  * 
  * <p>The following schema fragment specifies the expected content contained 
within this class.

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordHide.java
----------------------------------------------------------------------
diff --git a/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordHide.java 
b/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordHide.java
index 1fd75d6..86f4a13 100644
--- a/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordHide.java
+++ b/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordHide.java
@@ -30,6 +30,9 @@ import javax.xml.datatype.XMLGregorianCalendar;
 
 
 /**
+ * A changeRecordHide element corresponds to the behavior of hiding a tModel 
described in the delete_tModel in the Publish API section of this 
Specification.  A tModel listed in a changeRecordHide should be marked as 
hidden, so that it is not returned in response to a find_tModel API call.
+
+The changeRecordHide MUST contain a modified timestamp to allow multi-node 
registries to calculate consistent modifiedIncludingChildren timestamps as 
described in Section 3.8 operationalInfo Structure.
  * <p>Java class for anonymous complex type.
  * 
  * <p>The following schema fragment specifies the expected content contained 
within this class.

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordIDType.java
----------------------------------------------------------------------
diff --git a/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordIDType.java 
b/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordIDType.java
index 6c2c595..97461f5 100644
--- a/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordIDType.java
+++ b/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordIDType.java
@@ -61,6 +61,19 @@ public class ChangeRecordIDType implements Serializable {
         public ChangeRecordIDType() {
         }
 
+        /**
+         * 
+         * @param node owning node of the item/source of request
+         * @param oUSN Each node SHALL maintain a strictly increasing register 
known as its Originating Update Sequence Number (USN).  An originating USN is 
assigned to a change record at its creation by a node. The originating USN 
SHALL NEVER decrease in value, even in the face of system crashes and restarts. 
UDDI nodes MUST NOT rely on an originating USN sequence increasing 
monotonically by a value of "1".  Gaps in a node's originating USN sequence 
MUST be allowed for as they are likely to occur in the face of system crashes 
and restarts.
+
+While processing changes to the Registry as a result of performing UDDI 
Replication, all replicated data MUST be assigned an additional unique and 
locally generated USN register value – a local USN. 
+
+The originating and local USN registers MUST be sufficiently large such that 
register rollover is not a concern. For this purpose, UDDI nodes MUST implement 
a USN of exactly 63 bits in size.
+
+Note that it is semantically meaningless to compare USNs that have been 
generated on different nodes; only USNs generated on the same node may be 
meaningfully compared to each other.
+
+NO change record MAY have a USN equal to 0 (zero).  
+         */
         public ChangeRecordIDType(String node, Long oUSN) {
                 originatingUSN = oUSN;
                 nodeID = node;

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordNewData.java
----------------------------------------------------------------------
diff --git a/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordNewData.java 
b/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordNewData.java
index 3938581..7807e90 100644
--- a/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordNewData.java
+++ b/uddi-ws/src/main/java/org/uddi/repl_v3/ChangeRecordNewData.java
@@ -34,6 +34,12 @@ import org.uddi.api_v3.TModel;
 
 
 /**
+ * <img 
src="http://www.uddi.org/pubs/uddi-v3.0.2-20041019_files/image112.gif";><Br>
+ * A changeRecordNewData MUST not be empty; it must contain a valid semantic 
piece of new data. Change records of this type provide new or updated business 
or modeling information that is to be incorporated. Partial updates to a datum 
are not provided for; rather, the entire new contents of the datum and its 
operationalInfo are to be provided, and these replace any existing definition 
of the datum and its operationalInfo with the recipient of the change record. 
The hidden state (i.e. the deleted attribute) must be persisted through 
replication to allow for a custody transfer of hidden tModels between nodes via 
the replication protocol.
+
+The operationalInfo element MUST contain the operational information 
associated with the indicated new data. No validation other than schema 
assessment and presence requirements are performed by the consuming node. 
Specifically, the creation date may change; the creation date need not be 
earlier than the modification date; the modification date need not be earlier 
than the modified including children date.
+
+A changeRecordNewData is considered "successfully processed" once a node has 
received it, assigned a local USN to it, validated it, durably stored it in its 
change record journal, and then successfully incorporated it into the node’s 
data store.
  * <p>Java class for anonymous complex type.
  * 
  * <p>The following schema fragment specifies the expected content contained 
within this class.

http://git-wip-us.apache.org/repos/asf/juddi/blob/8b95902b/uddi-ws/src/main/java/org/uddi/v3_service/UDDIReplicationPortType.java
----------------------------------------------------------------------
diff --git 
a/uddi-ws/src/main/java/org/uddi/v3_service/UDDIReplicationPortType.java 
b/uddi-ws/src/main/java/org/uddi/v3_service/UDDIReplicationPortType.java
index 4effd0d..33f5416 100644
--- a/uddi-ws/src/main/java/org/uddi/v3_service/UDDIReplicationPortType.java
+++ b/uddi-ws/src/main/java/org/uddi/v3_service/UDDIReplicationPortType.java
@@ -107,6 +107,25 @@ public interface UDDIReplicationPortType extends Remote {
      * changeRecords element. Under all circumstances, all change records
      * returned therein by the message recipient MUST be returned sorted in
      * increasing order according to the recipient’s local USN.</p>
+     * 
+     * <p><b>A node that is ready to initiate replication of change records 
held
+     * at another node within the registry uses the get_changeRecords message. 
 
+     * Part of the message is a high water mark vector that contains for each 
+     * node of the registry the originating USN of the most recent change 
record
+     * that has been successfully processed by the invocating node. The effect 
+     * of receiving a get_changeRecords message causes a node to return to the 
+     * calling node change records it has generated locally and processed from 
+     * other nodes constrained by the directives of the high water mark vector 
+     * specified. As such, by invoking get_changeRecords a node obtains from 
its
+     * adjacent node all change records (constrained by the high water mark 
+     * vector) the adjacent node has generated locally or successfully 
processed
+     * from other nodes participating in the replication topology. What 
+     * constitutes an adjacent node is governed by the replication 
communication
+     * graph. Replication topology is controlled via a Replication 
Configuration
+     * Structure. Amongst other parameters, the Replication Configuration 
+     * Structure identifies one unique URL to represent the replication point, 
+     * soapReplicationURL, of each of the nodes of the registry. 
+     * </b></p>
      *
      * @param responseLimitVector responseLimitCount or responseLimitVector: A
      * caller MAY place an upper bound on the number of change records he 
wishes


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to