You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juddi.apache.org by al...@apache.org on 2014/12/09 04:13:23 UTC

[02/28] juddi git commit: JUDDI-241 working change journal NOJIRA removing a number of unnecessary TODO statements

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:jfaath@apache.org">Jeff Faath</a>
+ * @author <a href="mailto:alexoree@apache.org">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: commits-unsubscribe@juddi.apache.org
For additional commands, e-mail: commits-help@juddi.apache.org