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:48 UTC

[27/28] juddi git commit: JUDDI-896 resolved a number of typos and formatting issues JUDDI-241 business, service, binding templates and models now replicate

JUDDI-896 resolved a number of typos and formatting issues
JUDDI-241 business, service, binding templates and models now replicate


Project: http://git-wip-us.apache.org/repos/asf/juddi/repo
Commit: http://git-wip-us.apache.org/repos/asf/juddi/commit/9d22690e
Tree: http://git-wip-us.apache.org/repos/asf/juddi/tree/9d22690e
Diff: http://git-wip-us.apache.org/repos/asf/juddi/diff/9d22690e

Branch: refs/heads/master
Commit: 9d22690eee0aae19f98191c00a00833bf6a28f5c
Parents: 962f8d8
Author: Alex <al...@apache.org>
Authored: Mon Dec 8 19:43:11 2014 -0500
Committer: Alex <al...@apache.org>
Committed: Mon Dec 8 19:43:11 2014 -0500

----------------------------------------------------------------------
 .../juddi/api/impl/AuthenticatedService.java    |    5 +-
 .../org/apache/juddi/api/impl/JUDDIApiImpl.java |   33 +-
 .../juddi/api/impl/UDDIReplicationImpl.java     |  182 +-
 .../juddi/validation/ValidatePublish.java       |  112 +-
 .../juddi/validation/ValidateReplication.java   |    6 +-
 .../src/main/resources/messages.properties      |    1 +
 .../juddi/api/impl/API_160_ReplicationTest.java |    9 +-
 .../org/apache/juddi/samples/EntryPoint.java    |   17 +-
 .../apache/juddi/samples/UddiCreatebulk.java    |    6 +-
 .../juddi/webconsole/resources/web.properties   |    2 +-
 juddi-gui/src/main/webapp/bindingEditor.jsp     |    4 +-
 juddi-gui/src/main/webapp/js/businessEditor.js  |   22 +-
 juddi-gui/src/main/webapp/serviceEditor.jsp     |    2 +-
 juddi-tomcat/build.xml                          |    6 +-
 .../juddi_install_data_node2/UDDI_Publisher.xml |   22 +
 .../juddi_install_data_node2/UDDI_tModels.xml   | 2362 ++++++++++++++++++
 .../root_BusinessEntity.xml                     |    2 +-
 .../repl_v3/NotifyChangeRecordsAvailable.java   |    5 +
 18 files changed, 2663 insertions(+), 135 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/juddi/blob/9d22690e/juddi-core/src/main/java/org/apache/juddi/api/impl/AuthenticatedService.java
----------------------------------------------------------------------
diff --git a/juddi-core/src/main/java/org/apache/juddi/api/impl/AuthenticatedService.java b/juddi-core/src/main/java/org/apache/juddi/api/impl/AuthenticatedService.java
index 767cbee..fb0e00e 100644
--- a/juddi-core/src/main/java/org/apache/juddi/api/impl/AuthenticatedService.java
+++ b/juddi-core/src/main/java/org/apache/juddi/api/impl/AuthenticatedService.java
@@ -49,7 +49,10 @@ public abstract class AuthenticatedService {
 	public static final int AUTHTOKEN_ACTIVE = 1;
 	public static final int AUTHTOKEN_RETIRED = 0;
 	static final Log logger = LogFactory.getLog(AuthenticatedService.class);
-	protected String node = "UNDEFINED_NODE_NAME";
+        /**
+         * the node id of this server instance, as loaded from the config file
+         */
+	protected static String node = "UNDEFINED_NODE_NAME";
         protected String baseUrlSSL="UNDEFINED";
          protected String baseUrl="UNDEFINED";
         

http://git-wip-us.apache.org/repos/asf/juddi/blob/9d22690e/juddi-core/src/main/java/org/apache/juddi/api/impl/JUDDIApiImpl.java
----------------------------------------------------------------------
diff --git a/juddi-core/src/main/java/org/apache/juddi/api/impl/JUDDIApiImpl.java b/juddi-core/src/main/java/org/apache/juddi/api/impl/JUDDIApiImpl.java
index dd201fe..1b6b019 100644
--- a/juddi-core/src/main/java/org/apache/juddi/api/impl/JUDDIApiImpl.java
+++ b/juddi-core/src/main/java/org/apache/juddi/api/impl/JUDDIApiImpl.java
@@ -125,7 +125,7 @@ import org.uddi.v3_service.UDDISubscriptionPortType;
  */
 @WebService(serviceName = "JUDDIApiService",
         endpointInterface = "org.apache.juddi.v3_service.JUDDIApiPortType",
-        targetNamespace = "urn:juddi-apache-org:v3_service", wsdlLocation =  "classpath:/juddi_api_v1.wsdl")
+        targetNamespace = "urn:juddi-apache-org:v3_service", wsdlLocation = "classpath:/juddi_api_v1.wsdl")
 public class JUDDIApiImpl extends AuthenticatedService implements JUDDIApiPortType {
 
         private Log log = LogFactory.getLog(this.getClass());
@@ -1276,6 +1276,7 @@ public class JUDDIApiImpl extends AuthenticatedService implements JUDDIApiPortTy
                 try {
                         tx.begin();
 
+                        org.uddi.repl_v3.ReplicationConfiguration oldConfig = null;
                         UddiEntityPublisher publisher = this.getEntityPublisher(em, authInfo);
                         if (!((Publisher) publisher).isAdmin()) {
                                 throw new UserMismatchException(new ErrorMessage("errors.AdminReqd"));
@@ -1289,9 +1290,9 @@ public class JUDDIApiImpl extends AuthenticatedService implements JUDDIApiPortTy
                         }
                         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddkkmmZ");
                         if (model == null) {
-                                //this is a brand new configuration
+                                //this is a brand new configuration and we didn't have one before
                                 model = new ReplicationConfiguration();
-                                MappingApiToModel.mapReplicationConfiguration(replicationConfiguration, model,em);
+                                MappingApiToModel.mapReplicationConfiguration(replicationConfiguration, model, em);
                                 model.setSerialNumber(System.currentTimeMillis());
                                 model.setTimeOfConfigurationUpdate(sdf.format(new Date()));
                                 em.persist(model);
@@ -1305,17 +1306,20 @@ public class JUDDIApiImpl extends AuthenticatedService implements JUDDIApiPortTy
                                 //spec doesn't appear to mention if recording a change history on the config is required
                                 //assuming not.
                                 //em.remove(model);
-                                model = new ReplicationConfiguration();
-                                MappingApiToModel.mapReplicationConfiguration(replicationConfiguration, model, em);
-                                model.setSerialNumber(System.currentTimeMillis());
+                                oldConfig = new org.uddi.repl_v3.ReplicationConfiguration();
+                                MappingModelToApi.mapReplicationConfiguration(model, oldConfig);
 
-                                model.setTimeOfConfigurationUpdate(sdf.format(new Date()));
-                                em.merge(model);
+                                ReplicationConfiguration model2 = new ReplicationConfiguration();
+                                MappingApiToModel.mapReplicationConfiguration(replicationConfiguration, model2, em);
+                                model2.setSerialNumber(System.currentTimeMillis());
+
+                                model2.setTimeOfConfigurationUpdate(sdf.format(new Date()));
+                                em.persist(model2);
 
                         }
 
                         tx.commit();
-                        //UDDIReplicationImpl.notifyConfigurationChange(replicationConfiguration);
+                        UDDIReplicationImpl.notifyConfigurationChange(oldConfig, replicationConfiguration);
                         long procTime = System.currentTimeMillis() - startTime;
                         serviceCounter.update(JUDDIQuery.SET_REPLICATION_NODES,
                                 QueryStatus.SUCCESS, procTime);
@@ -1324,12 +1328,11 @@ public class JUDDIApiImpl extends AuthenticatedService implements JUDDIApiPortTy
                         serviceCounter.update(JUDDIQuery.SET_REPLICATION_NODES,
                                 QueryStatus.FAILED, procTime);
                         throw drfm;
-                } catch (Exception ex){
-                        logger.error(ex,ex);
+                } catch (Exception ex) {
+                        logger.error(ex, ex);
                         JAXB.marshal(replicationConfiguration, System.out);
                         throw new FatalErrorException(new ErrorMessage("E_fatalError", ex.getMessage()));
-                }
-                finally {
+                } finally {
                         if (tx.isActive()) {
                                 tx.rollback();
                         }
@@ -1381,11 +1384,11 @@ public class JUDDIApiImpl extends AuthenticatedService implements JUDDIApiPortTy
                         op.setOperatorNodeID(node);
                         op.setSoapReplicationURL(baseUrlSSL + "/services/replication");
                         //TODO lookup from the root business
-                       
+
                         op.getContact().add(new Contact());
                         op.getContact().get(0).getPersonName().add(new PersonName("Unknown", null));
                         op.setOperatorStatus(OperatorStatusType.NORMAL);
-                        
+
                         r.getOperator().add(op);
                         r.getCommunicationGraph().getNode().add(node);
                         r.getCommunicationGraph().getControlledMessage().add("*");

http://git-wip-us.apache.org/repos/asf/juddi/blob/9d22690e/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDIReplicationImpl.java
----------------------------------------------------------------------
diff --git a/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDIReplicationImpl.java b/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDIReplicationImpl.java
index 5c3b22c..bb2d17c 100644
--- a/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDIReplicationImpl.java
+++ b/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDIReplicationImpl.java
@@ -21,10 +21,12 @@ import java.math.BigInteger;
 import java.rmi.RemoteException;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Queue;
+import java.util.Set;
 import java.util.Timer;
 import java.util.TimerTask;
 import java.util.concurrent.ConcurrentLinkedDeque;
@@ -104,6 +106,55 @@ public class UDDIReplicationImpl extends AuthenticatedService implements UDDIRep
         static void notifyConfigurationChange(ReplicationConfiguration oldConfig, ReplicationConfiguration newConfig) {
 
                 //if the config is different
+                Set<String> oldnodes = getNodes(oldConfig);
+                Set<String> newNodes = getNodes(newConfig);
+
+                Set<String> addedNodes = diffNodeList(oldnodes, newNodes);
+                if (queue == null) {
+                        queue = new ConcurrentLinkedDeque<NotifyChangeRecordsAvailable>();
+                }
+                for (String s : addedNodes) {
+                        if (!s.equals(node)) {
+                                logger.info("This node: " + node + ". New replication node queue for synchronization: " + s);
+                                HighWaterMarkVectorType highWaterMarkVectorType = new HighWaterMarkVectorType();
+                                highWaterMarkVectorType.getHighWaterMark().add(new ChangeRecordIDType(s, 0L));
+                                queue.add(new NotifyChangeRecordsAvailable(s, highWaterMarkVectorType));
+                        }
+                }
+
+        }
+
+        private static Set<String> getNodes(ReplicationConfiguration oldConfig) {
+                Set<String> ret = new HashSet<String>();
+                if (oldConfig == null) {
+                        return ret;
+                }
+                for (org.uddi.repl_v3.Operator o : oldConfig.getOperator()) {
+                        ret.add(o.getOperatorNodeID());
+                }
+                if (oldConfig.getCommunicationGraph() != null) {
+                        ret.addAll(oldConfig.getCommunicationGraph().getNode());
+                }
+                return ret;
+        }
+
+        private static Set<String> diffNodeList(Set<String> oldnodes, Set<String> newNodes) {
+                Set<String> diff = new HashSet<String>();
+                Iterator<String> iterator = null;
+                /*oldnodes.iterator();
+                 while (iterator.hasNext()){
+                 String lhs=iterator.next();
+                 if (!newNodes.contains(lhs))
+                 diff.add(lhs);
+                 }*/
+                iterator = newNodes.iterator();
+                while (iterator.hasNext()) {
+                        String lhs = iterator.next();
+                        if (!oldnodes.contains(lhs)) {
+                                diff.add(lhs);
+                        }
+                }
+                return diff;
         }
 
         private UDDIServiceCounter serviceCounter;
@@ -179,17 +230,19 @@ public class UDDIReplicationImpl extends AuthenticatedService implements UDDIRep
                                                 try {
                                                         //get the high water marks for this node
                                                         //ok now get all the changes
-                                                        logger.info("fetching updates on, since ");
-                                                        for (int xx = 0; xx < poll.getChangesAvailable().getHighWaterMark().size(); xx++) {
-                                                                logger.info("Node " + poll.getChangesAvailable().getHighWaterMark().get(xx).getNodeID()
-                                                                        + " USN " + poll.getChangesAvailable().getHighWaterMark().get(xx).getOriginatingUSN());
-                                                        }
-                                                        //JAXB.marshal(poll, System.out);
+
+                                                        //done TODO replace with last known record from the given node
+                                                        //for (int xx = 0; xx < poll.getChangesAvailable().getHighWaterMark().size(); xx++) {
+                                                        //        logger.info("Node " + poll.getChangesAvailable().getHighWaterMark().get(xx).getNodeID()
+                                                        //                + " USN " + poll.getChangesAvailable().getHighWaterMark().get(xx).getOriginatingUSN());
+                                                        //}
                                                         GetChangeRecords body = new GetChangeRecords();
                                                         body.setRequestingNode(node);
                                                         body.setResponseLimitCount(BigInteger.valueOf(100));
-                                                        //indexing is screwed up
-                                                        body.setChangesAlreadySeen(poll.getChangesAvailable());
+
+                                                        body.setChangesAlreadySeen(getLastChangeRecordFrom(poll.getNotifyingNode()));
+                                                        logger.info("fetching updates from " + poll.getNotifyingNode() + " since " + body.getChangesAlreadySeen().getHighWaterMark().get(0).getOriginatingUSN());
+
                                                         List<ChangeRecord> records
                                                                 = replicationClient.getChangeRecords(body).getChangeRecord();
                                                         //ok now we need to persist the change records
@@ -235,9 +288,9 @@ public class UDDIReplicationImpl extends AuthenticatedService implements UDDIRep
                          * a USN is less than the USN specified in the
                          * changesAlreadySeen highWaterMarkVector.
                          */
-                        StringWriter sw = new StringWriter();
-                        JAXB.marshal(rec, sw);
-                        logger.info("_______________________Remote change request " + sw.toString());
+                        // StringWriter sw = new StringWriter();
+                        //JAXB.marshal(rec, sw);
+                        logger.info("_______________________Remote change request " + rec.getChangeID().getNodeID() + ":" + rec.getChangeID().getOriginatingUSN());
 
                         try {
                                 tx.begin();
@@ -245,6 +298,9 @@ public class UDDIReplicationImpl extends AuthenticatedService implements UDDIRep
                                 org.apache.juddi.model.ChangeRecord mapChangeRecord = MappingApiToModel.mapChangeRecord(rec);
                                 mapChangeRecord.setId(null);
                                 em.persist(mapChangeRecord);
+                                tx.commit();
+                                tx = em.getTransaction();
+                                tx.begin();
                                 //<editor-fold defaultstate="collapsed" desc="delete a record">
 
                                 if (rec.getChangeRecordDelete() != null) {
@@ -304,10 +360,10 @@ public class UDDIReplicationImpl extends AuthenticatedService implements UDDIRep
                                                         } else {
                                                                 ValidateNodeIdMatches(model.getNodeId(), rec.getChangeRecordNewData().getOperationalInfo());
 
-                                                               org.apache.juddi.model.BindingTemplate bt= em.find(org.apache.juddi.model.BindingTemplate.class,rec.getChangeRecordNewData().getBindingTemplate().getBindingKey() );
-                                                               if (bt!=null){
-                                                                       em.remove(bt);
-                                                               }
+                                                                org.apache.juddi.model.BindingTemplate bt = em.find(org.apache.juddi.model.BindingTemplate.class, rec.getChangeRecordNewData().getBindingTemplate().getBindingKey());
+                                                                if (bt != null) {
+                                                                        em.remove(bt);
+                                                                }
                                                                 bt = new BindingTemplate();
                                                                 MappingApiToModel.mapBindingTemplate(rec.getChangeRecordNewData().getBindingTemplate(), bt, model);
                                                                 MappingApiToModel.mapOperationalInfo(bt, rec.getChangeRecordNewData().getOperationalInfo());
@@ -322,7 +378,7 @@ public class UDDIReplicationImpl extends AuthenticatedService implements UDDIRep
                                                                 ValidateNodeIdMatches(model.getNodeId(), rec.getChangeRecordNewData().getOperationalInfo());
                                                                 //TODO revisit access control rules
                                                                 em.remove(model);
-                                                        } 
+                                                        }
                                                         model = new BusinessEntity();
                                                         MappingApiToModel.mapBusinessEntity(rec.getChangeRecordNewData().getBusinessEntity(), model);
                                                         // MappingApiToModel.mapOperationalInfo(model, rec.getChangeRecordNewData().getOperationalInfo());
@@ -413,15 +469,68 @@ public class UDDIReplicationImpl extends AuthenticatedService implements UDDIRep
                         }
                 }
 
+                private HighWaterMarkVectorType getLastChangeRecordFrom(String notifyingNode) {
+                        HighWaterMarkVectorType ret = new HighWaterMarkVectorType();
+                        ChangeRecordIDType cid = new ChangeRecordIDType();
+                        cid.setNodeID(notifyingNode);
+                        cid.setOriginatingUSN(0L);
+                        EntityManager em = PersistenceManager.getEntityManager();
+                        EntityTransaction tx = em.getTransaction();
+                        try {
+                                tx.begin();
+                                Long id = 0L;
+                                try {
+                                        cid.setOriginatingUSN((Long) em.createQuery("select e.originatingUSN from ChangeRecord e where e.nodeID = :node order by e.originatingUSN desc").setParameter("node", notifyingNode).setMaxResults(1).getSingleResult());
+                                } catch (Exception ex) {
+                                        logger.info(ex);
+                                }
+
+                                tx.rollback();
+
+                        } catch (Exception drfm) {
+                                logger.warn("error caught fetching newest record from node " + notifyingNode, drfm);
+                        } finally {
+                                if (tx.isActive()) {
+                                        tx.rollback();
+                                }
+                                em.close();
+                        }
+
+                        ret.getHighWaterMark().add(cid);
+
+                        return ret;
+                }
         }
 
-        private static void ValidateNodeIdMatches(String nodeId, OperationalInfo operationalInfo) throws Exception {
-                if (nodeId == null || operationalInfo == null) {
+        // private void ValidateDontChangeMyRecordsAtAnotherNode(String )
+        private void ValidateNodeIdMatches(String modelNodeId, OperationalInfo newDataOperationalInfo) throws Exception {
+                if (modelNodeId == null || newDataOperationalInfo == null) {
                         throw new Exception("either the local node ID is null or the inbound replication data's node id is null");
                 }
-                if (!nodeId.equals(operationalInfo.getNodeID())) {
+                //only time this is allowed is custody transfer
+                if (!modelNodeId.equals(newDataOperationalInfo.getNodeID())) {
                         throw new Exception("node id mismatch!");
                 }
+
+                //if i already have a record and "own it" and the remote node has a record with the same key, reject the update
+                //1.5.8 
+                /**
+                 * Each node has custody of a portion of the aggregate data
+                 * managed by the registry of which it is a part. Each datum is
+                 * by definition in the custody of exactly one such node. A
+                 * datum in this context can be a businessEntity, a
+                 * businessService, a bindingTemplate, a tModel, or a
+                 * publisherAssertion. Changes to a datum in the registry MUST
+                 * originate at the node which is the custodian of the datum.
+                 * The registry defines the policy for data custody and, if
+                 * allowed, the custodian node for a given datum can be changed;
+                 * such custody transfer processes are discussed in Section 5.4
+                 * Custody and Ownership Transfer API.
+                 */
+                //so someone else attempted to update one of my records, reject it
+                if (modelNodeId.equals(node)) {
+                        throw new Exception("node id mismatch! this node already has a record for key " + newDataOperationalInfo.getEntityKey() + " and I'm the authority for it.");
+                }
         }
 
         private synchronized UDDIReplicationPortType getReplicationClient(String node) {
@@ -482,6 +591,7 @@ public class UDDIReplicationImpl extends AuthenticatedService implements UDDIRep
         @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
         @WebResult(name = "changeRecords", targetNamespace = "urn:uddi-org:repl_v3", partName = "body")
         // @WebMethod(operationName = "get_changeRecords", action = "get_changeRecords")
+        @Override
         public org.uddi.repl_v3.ChangeRecords getChangeRecords(
                 @WebParam(partName = "body", name = "get_changeRecords", targetNamespace = "urn:uddi-org:repl_v3") org.uddi.repl_v3.GetChangeRecords body
         ) throws DispositionReportFaultMessage, RemoteException {/*
@@ -625,6 +735,7 @@ public class UDDIReplicationImpl extends AuthenticatedService implements UDDIRep
 
                 EntityManager em = PersistenceManager.getEntityManager();
                 EntityTransaction tx = em.getTransaction();
+                HashMap<String, Long> map = new HashMap<String, Long>();
                 try {
                         tx.begin();
                         if (FetchEdges != null) {
@@ -632,26 +743,26 @@ public class UDDIReplicationImpl extends AuthenticatedService implements UDDIRep
                                 while (it.hasNext()) {
                                         String nextNode = it.next();
                                         if (!nextNode.equals(node)) {
+                                                if (!map.containsKey(nextNode)) {
+                                                        Long id = 0L;
+                                                        try {
+                                                                id = (Long) em.createQuery("select e.originatingUSN from ChangeRecord e where e.nodeID = :node order by e.originatingUSN desc").setParameter("node", nextNode).setMaxResults(1).getSingleResult();
+                                                        } catch (Exception ex) {
+                                                                logger.debug(ex);
+                                                        }
+                                                        if (id == null) {
+                                                                id = 0L;
+                                                                //per the spec
+                                                        }
+                                                        map.put(nextNode, id);
 
-                                                Long id = 0L;
-                                                try {
-                                                        id = (Long) em.createQuery("select e.originatingUSN from ChangeRecord e where e.nodeID = :node order by e.originatingUSN desc").setParameter("node", nextNode).setMaxResults(1).getSingleResult();
-                                                } catch (Exception ex) {
-                                                        logger.debug(ex);
-                                                }
-                                                if (id == null) {
-                                                        id = 0L;
-                                                        //per the spec
                                                 }
-                                                ChangeRecordIDType x = new ChangeRecordIDType(nextNode, id);
-
-                                                ret.add(x);
-
                                         }
                                 }
                         }
                         //dont forget this node
-                        Long id = (Long) em.createQuery("select (e.id) from ChangeRecord e where e.nodeID = :node  order by e.id desc").setParameter("node", node).setMaxResults(1).getSingleResult();
+                        Long id = (Long) em.createQuery("select (e.id) from ChangeRecord e where e.nodeID = :node  order by e.id desc")
+                                .setParameter("node", node).setMaxResults(1).getSingleResult();
                         if (id == null) {
                                 id = 0L;
                         }
@@ -674,6 +785,11 @@ public class UDDIReplicationImpl extends AuthenticatedService implements UDDIRep
                         em.close();
                 }
 
+                Iterator<Map.Entry<String, Long>> iterator = map.entrySet().iterator();
+                while (iterator.hasNext()) {
+                        Map.Entry<String, Long> next = iterator.next();
+                        ret.add(new ChangeRecordIDType(next.getKey(), next.getValue()));
+                }
                 return ret;
         }
 

http://git-wip-us.apache.org/repos/asf/juddi/blob/9d22690e/juddi-core/src/main/java/org/apache/juddi/validation/ValidatePublish.java
----------------------------------------------------------------------
diff --git a/juddi-core/src/main/java/org/apache/juddi/validation/ValidatePublish.java b/juddi-core/src/main/java/org/apache/juddi/validation/ValidatePublish.java
index f3df32f..64ebdb9 100644
--- a/juddi-core/src/main/java/org/apache/juddi/validation/ValidatePublish.java
+++ b/juddi-core/src/main/java/org/apache/juddi/validation/ValidatePublish.java
@@ -117,8 +117,9 @@ public class ValidatePublish extends ValidateUDDIApi {
 
         /**
          * used from Install class
+         *
          * @param publisher
-         * @param nodeid 
+         * @param nodeid
          * @see Install
          */
         public ValidatePublish(UddiEntityPublisher publisher, String nodeid) {
@@ -284,14 +285,20 @@ public class ValidatePublish extends ValidateUDDIApi {
 
         private void AccessCheck(Object obj, String entityKey) throws UserMismatchException {
                 boolean accessCheck = false; //assume access denied
-                //TODO revisit access control rules in a replicated environment
+                if (!((UddiEntity) obj).getNodeId().equals(nodeID)) {
+                        //prevent changes to data owned by another node in a replicated environment
+                        //even if you're the boss
+                        throw new UserMismatchException(new ErrorMessage("errors.usermismatch.InvalidNode", entityKey + " Owning Node: " +((UddiEntity) obj).getNodeId()
+                        + ", this node: " + nodeID));
+                }
+
                 if (publisher.isOwner((UddiEntity) obj)) {
                         accessCheck = true;
 
                 }
                 //if i'm an admin, let me edit stuff on this node, but only stuff that's owned by this node
                 if (((Publisher) publisher).isAdmin()
-                     && nodeID.equals(((UddiEntity) obj).getNodeId())) {
+                        && nodeID.equals(((UddiEntity) obj).getNodeId())) {
                         accessCheck = true;
                 }
 
@@ -331,8 +338,8 @@ public class ValidatePublish extends ValidateUDDIApi {
                                 }
 
                                 if (!pubAssertion.getTmodelKey().equalsIgnoreCase(keyedRef.getTModelKey())
-                                     || !pubAssertion.getKeyName().equalsIgnoreCase(keyedRef.getKeyName())
-                                     || !pubAssertion.getKeyValue().equalsIgnoreCase(keyedRef.getKeyValue())) {
+                                        || !pubAssertion.getKeyName().equalsIgnoreCase(keyedRef.getKeyName())
+                                        || !pubAssertion.getKeyValue().equalsIgnoreCase(keyedRef.getKeyValue())) {
                                         throw new AssertionNotFoundException(new ErrorMessage("errors.pubassertion.AssertionNotFound", entity.getFromKey() + ", " + entity.getToKey()));
                                 }
 
@@ -363,9 +370,9 @@ public class ValidatePublish extends ValidateUDDIApi {
 
                 for (org.uddi.api_v3.BusinessEntity entity : entityList) {
                         validateBusinessEntity(em, entity, config, publisher);
-                       
+
                 }
-                 validateCheckedTModelsBE(entityList, config);
+                validateCheckedTModelsBE(entityList, config);
         }
 
         public void validateSaveBusinessMax(EntityManager em) throws DispositionReportFaultMessage {
@@ -473,7 +480,7 @@ public class ValidatePublish extends ValidateUDDIApi {
 
                 for (org.uddi.api_v3.BindingTemplate entity : entityList) {
                         validateBindingTemplate(em, entity, null, config, publisher);
-                        
+
                 }
                 validateCheckedTModelsBT(entityList, config);
         }
@@ -527,7 +534,7 @@ public class ValidatePublish extends ValidateUDDIApi {
 
                 for (org.uddi.api_v3.TModel entity : entityList) {
                         validateTModel(em, entity, config, publisher);
-                        
+
                 }
                 validateCheckedTModelsTM(entityList, config);
         }
@@ -604,17 +611,17 @@ public class ValidatePublish extends ValidateUDDIApi {
                 if (item.getBusinessServices() != null && !item.getSignature().isEmpty()) {
                         for (int i = 0; i < item.getBusinessServices().getBusinessService().size(); i++) {
                                 if (item.getBusinessServices().getBusinessService().get(i).getBusinessKey() == null
-                                     || item.getBusinessServices().getBusinessService().get(i).getBusinessKey().length() == 0) {
+                                        || item.getBusinessServices().getBusinessService().get(i).getBusinessKey().length() == 0) {
                                         throw new ValueNotAllowedException(new ErrorMessage("errors.entity.SignedButNoKey", "business/Service(" + i + ")/businessKey"));
                                 }
                                 if (item.getBusinessServices().getBusinessService().get(i).getServiceKey() == null
-                                     || item.getBusinessServices().getBusinessService().get(i).getServiceKey().length() == 0) {
+                                        || item.getBusinessServices().getBusinessService().get(i).getServiceKey().length() == 0) {
                                         throw new ValueNotAllowedException(new ErrorMessage("errors.entity.SignedButNoKey", "business/Service(" + i + ")/serviceKey"));
                                 }
                                 if (item.getBusinessServices().getBusinessService().get(i).getBindingTemplates() != null) {
                                         for (int k = 0; k < item.getBusinessServices().getBusinessService().get(i).getBindingTemplates().getBindingTemplate().size(); k++) {
                                                 if (item.getBusinessServices().getBusinessService().get(i).getBindingTemplates().getBindingTemplate().get(k).getBindingKey() == null
-                                                     || item.getBusinessServices().getBusinessService().get(i).getBindingTemplates().getBindingTemplate().get(k).getBindingKey().length() == 0) {
+                                                        || item.getBusinessServices().getBusinessService().get(i).getBindingTemplates().getBindingTemplate().get(k).getBindingKey().length() == 0) {
                                                         throw new ValueNotAllowedException(new ErrorMessage("errors.entity.SignedButNoKey", "business/Service(" + i + ")/bindingTemplate)" + k + ")/bindingKey"));
                                                 }
                                         }
@@ -658,7 +665,7 @@ public class ValidatePublish extends ValidateUDDIApi {
                 if (item.getBindingTemplates() != null && !item.getSignature().isEmpty()) {
                         for (int i = 0; i < item.getBindingTemplates().getBindingTemplate().size(); i++) {
                                 if (item.getBindingTemplates().getBindingTemplate().get(i).getBindingKey() == null
-                                     || item.getBindingTemplates().getBindingTemplate().get(i).getBindingKey().length() == 0) {
+                                        || item.getBindingTemplates().getBindingTemplate().get(i).getBindingKey().length() == 0) {
                                         throw new ValueNotAllowedException(new ErrorMessage("errors.entity.SignedButNoKey", "businessService/bindingTemplate(" + i + ")/bindingKey"));
                                 }
                         }
@@ -666,7 +673,7 @@ public class ValidatePublish extends ValidateUDDIApi {
         }
 
         public void validateBusinessEntity(EntityManager em, org.uddi.api_v3.BusinessEntity businessEntity,
-             Configuration config, UddiEntityPublisher publisher) throws DispositionReportFaultMessage {
+                Configuration config, UddiEntityPublisher publisher) throws DispositionReportFaultMessage {
 
                 // A supplied businessEntity can't be null
                 if (businessEntity == null) {
@@ -724,8 +731,8 @@ public class ValidatePublish extends ValidateUDDIApi {
         }
 
         public void validateBusinessServices(EntityManager em, org.uddi.api_v3.BusinessServices businessServices,
-             org.uddi.api_v3.BusinessEntity parent, Configuration config, UddiEntityPublisher publisher)
-             throws DispositionReportFaultMessage {
+                org.uddi.api_v3.BusinessEntity parent, Configuration config, UddiEntityPublisher publisher)
+                throws DispositionReportFaultMessage {
                 // Business services is optional
                 if (businessServices == null) {
                         return;
@@ -742,8 +749,8 @@ public class ValidatePublish extends ValidateUDDIApi {
         }
 
         public void validateBusinessService(EntityManager em, org.uddi.api_v3.BusinessService businessService,
-             org.uddi.api_v3.BusinessEntity parent, Configuration config, UddiEntityPublisher publisher)
-             throws DispositionReportFaultMessage {
+                org.uddi.api_v3.BusinessEntity parent, Configuration config, UddiEntityPublisher publisher)
+                throws DispositionReportFaultMessage {
 
                 // A supplied businessService can't be null
                 if (businessService == null) {
@@ -894,8 +901,8 @@ public class ValidatePublish extends ValidateUDDIApi {
         }
 
         public void validateBindingTemplates(EntityManager em, org.uddi.api_v3.BindingTemplates bindingTemplates,
-             org.uddi.api_v3.BusinessService parent, Configuration config, UddiEntityPublisher publisher)
-             throws DispositionReportFaultMessage {
+                org.uddi.api_v3.BusinessService parent, Configuration config, UddiEntityPublisher publisher)
+                throws DispositionReportFaultMessage {
                 // Binding templates is optional
                 if (bindingTemplates == null) {
                         return;
@@ -909,13 +916,12 @@ public class ValidatePublish extends ValidateUDDIApi {
                 for (org.uddi.api_v3.BindingTemplate bindingTemplate : bindingTemplateList) {
                         validateBindingTemplate(em, bindingTemplate, parent, config, publisher);
                 }
-                
 
         }
 
         public void validateBindingTemplate(EntityManager em, org.uddi.api_v3.BindingTemplate bindingTemplate,
-             org.uddi.api_v3.BusinessService parent, Configuration config, UddiEntityPublisher publisher)
-             throws DispositionReportFaultMessage {
+                org.uddi.api_v3.BusinessService parent, Configuration config, UddiEntityPublisher publisher)
+                throws DispositionReportFaultMessage {
 
                 // A supplied bindingTemplate can't be null
                 if (bindingTemplate == null) {
@@ -1125,7 +1131,7 @@ public class ValidatePublish extends ValidateUDDIApi {
 
                 // TODO: validate "checked" categories or category groups (see section 5.2.3 of spec)? optional to support
                 if (tModel.getName() == null || tModel.getName().getValue() == null
-                     || tModel.getName().getValue().equals("")) {
+                        || tModel.getName().getValue().equals("")) {
                         throw new ValueNotAllowedException(new ErrorMessage("errors.tmodel.NoName"));
                 }
 
@@ -1152,9 +1158,9 @@ public class ValidatePublish extends ValidateUDDIApi {
                 // The keyedRef must not be blank and every field must contain data.
                 org.uddi.api_v3.KeyedReference keyedRef = pubAssertion.getKeyedReference();
                 if (keyedRef == null
-                     || keyedRef.getTModelKey() == null || keyedRef.getTModelKey().length() == 0
-                     || keyedRef.getKeyName() == null || keyedRef.getKeyName().length() == 0
-                     || keyedRef.getKeyValue() == null || keyedRef.getKeyValue().length() == 0) {
+                        || keyedRef.getTModelKey() == null || keyedRef.getTModelKey().length() == 0
+                        || keyedRef.getKeyName() == null || keyedRef.getKeyName().length() == 0
+                        || keyedRef.getKeyValue() == null || keyedRef.getKeyValue().length() == 0) {
                         throw new ValueNotAllowedException(new ErrorMessage("errors.pubassertion.BlankKeyedRef"));
                 }
 
@@ -1577,21 +1583,22 @@ public class ValidatePublish extends ValidateUDDIApi {
         }
 
         public void validateSaveSubscriptionAdmin(EntityManager em, String publisherOrUsername, List<Subscription> subscriptions) throws DispositionReportFaultMessage {
-            
-            // No null input
+
+                // No null input
                 if (subscriptions == null || subscriptions.isEmpty()) {
                         throw new FatalErrorException(new ErrorMessage("errors.NullInput"));
                 }
-                
+
                 if (!((Publisher) publisher).isAdmin()) {
-                    throw new UserMismatchException(new ErrorMessage("errors.deletepublisher.AdminReqd"));
+                        throw new UserMismatchException(new ErrorMessage("errors.deletepublisher.AdminReqd"));
                 }
                 UddiEntityPublisher user = new UddiEntityPublisher(publisherOrUsername);
                 ValidateSubscription vsub = new ValidateSubscription(user);
-                for (int i=0; i < subscriptions.size(); i++){
-                    vsub.validateSubscriptions(em, subscriptions, user);
+                for (int i = 0; i < subscriptions.size(); i++) {
+                        vsub.validateSubscriptions(em, subscriptions, user);
                 }
         }
+
         public void validateSavePublisher(EntityManager em, SavePublisher body) throws DispositionReportFaultMessage {
 
                 // No null input
@@ -1815,7 +1822,7 @@ public class ValidatePublish extends ValidateUDDIApi {
                         for (int i = 0; i < phone.size(); i++) {
                                 validateUseType(phone.get(i).getUseType());
                                 if (phone.get(i).getValue() == null
-                                     || phone.get(i).getValue().length() == 0) {
+                                        || phone.get(i).getValue().length() == 0) {
                                         throw new ValueNotAllowedException(new ErrorMessage("errors.phone.noinput"));
                                 }
                                 if (phone.get(i).getValue().length() > ValidationConstants.MAX_phone) {
@@ -2198,15 +2205,15 @@ public class ValidatePublish extends ValidateUDDIApi {
                 for (int i = 0; i < addressLine.size(); i++) {
 
                         if (addressLine.get(i).getKeyName() == null
-                             || addressLine.get(i).getKeyName().trim().length() == 0) {
+                                || addressLine.get(i).getKeyName().trim().length() == 0) {
                                 err += "addressLine(" + i + ").keyName,";
                         }
                         if (addressLine.get(i).getKeyValue() == null
-                             || addressLine.get(i).getKeyValue().trim().length() == 0) {
+                                || addressLine.get(i).getKeyValue().trim().length() == 0) {
                                 err += "addressLine(" + i + ").keyValue,";
                         }
                         if (addressLine.get(i).getValue() == null
-                             || addressLine.get(i).getValue().trim().length() == 0) {
+                                || addressLine.get(i).getValue().trim().length() == 0) {
                                 err += "addressLine(" + i + ").value,";
                         }
                 }
@@ -2385,20 +2392,23 @@ public class ValidatePublish extends ValidateUDDIApi {
                         throw new InvalidKeyPassedException(new ErrorMessage("errors.deleteNode.NoInput"));
                 }
                 //get the latest replication config
-                if (cfg!=null){
-                    if (cfg.getCommunicationGraph()!=null){
-                        for (String node : cfg.getCommunicationGraph().getNode()) {
-                            if (node.equals(nodeID.getNodeID()))
-                                throw new InvalidKeyPassedException(new ErrorMessage("errors.deleteNode.InReplicationConfig", nodeID.getNodeID()));
-                        }
-                        for (int i=0; i <cfg.getCommunicationGraph().getEdge().size(); i++){
-                            if (nodeID.getNodeID().equals(cfg.getCommunicationGraph().getEdge().get(i).getMessageReceiver()))
-                                throw new InvalidKeyPassedException(new ErrorMessage("errors.deleteNode.InReplicationConfig", nodeID.getNodeID()));
-                            if (nodeID.getNodeID().equals(cfg.getCommunicationGraph().getEdge().get(i).getMessageSender()))
-                                throw new InvalidKeyPassedException(new ErrorMessage("errors.deleteNode.InReplicationConfig", nodeID.getNodeID()));
-                            
-                        }
-                    }
+                if (cfg != null) {
+                        if (cfg.getCommunicationGraph() != null) {
+                                for (String node : cfg.getCommunicationGraph().getNode()) {
+                                        if (node.equals(nodeID.getNodeID())) {
+                                                throw new InvalidKeyPassedException(new ErrorMessage("errors.deleteNode.InReplicationConfig", nodeID.getNodeID()));
+                                        }
+                                }
+                                for (int i = 0; i < cfg.getCommunicationGraph().getEdge().size(); i++) {
+                                        if (nodeID.getNodeID().equals(cfg.getCommunicationGraph().getEdge().get(i).getMessageReceiver())) {
+                                                throw new InvalidKeyPassedException(new ErrorMessage("errors.deleteNode.InReplicationConfig", nodeID.getNodeID()));
+                                        }
+                                        if (nodeID.getNodeID().equals(cfg.getCommunicationGraph().getEdge().get(i).getMessageSender())) {
+                                                throw new InvalidKeyPassedException(new ErrorMessage("errors.deleteNode.InReplicationConfig", nodeID.getNodeID()));
+                                        }
+
+                                }
+                        }
                 }
 
         }

http://git-wip-us.apache.org/repos/asf/juddi/blob/9d22690e/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 97da3ff..df5a436 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
@@ -58,9 +58,9 @@ public class ValidateReplication extends ValidateUDDIApi {
                         //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 (!ContainsNode(requestingNode, FetchEdges)) {
+                //        throw new FatalErrorException(new ErrorMessage("errors.replication.unknownNode"));
+                //}
 
                 if (changesAlreadySeen != null) {
                         // changesAlreadySeen: The changesAlreadySeen element, if present, indicates changes from each

http://git-wip-us.apache.org/repos/asf/juddi/blob/9d22690e/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 95d98ce..fe79f62 100644
--- a/juddi-core/src/main/resources/messages.properties
+++ b/juddi-core/src/main/resources/messages.properties
@@ -296,3 +296,4 @@ errors.replication.configNodeNotFound=No specified node name is not currently li
 errors.replication.configNull=No replication config was present in the message
 errors.replication.contactNull=No replication contact was present in the message
 errors.deleteNode.InReplicationConfig=The node to be deleted is currently referenced in the replication configuration. You must revise the configuration before deleting the node, 
+errors.usermismatch.InvalidNode=The user is not authorized to alter the given entity. It is not owned by this jUDDI node. Try your request again on the authoritative node.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/juddi/blob/9d22690e/juddi-core/src/test/java/org/apache/juddi/api/impl/API_160_ReplicationTest.java
----------------------------------------------------------------------
diff --git a/juddi-core/src/test/java/org/apache/juddi/api/impl/API_160_ReplicationTest.java b/juddi-core/src/test/java/org/apache/juddi/api/impl/API_160_ReplicationTest.java
index 700c96d..2227973 100644
--- a/juddi-core/src/test/java/org/apache/juddi/api/impl/API_160_ReplicationTest.java
+++ b/juddi-core/src/test/java/org/apache/juddi/api/impl/API_160_ReplicationTest.java
@@ -46,6 +46,7 @@ import org.uddi.api_v3.DispositionReport;
 import org.uddi.api_v3.PersonName;
 import org.uddi.repl_v3.ChangeRecord;
 import org.uddi.repl_v3.ChangeRecordIDType;
+import org.uddi.repl_v3.ChangeRecords;
 import org.uddi.repl_v3.CommunicationGraph;
 import org.uddi.repl_v3.DoPing;
 import org.uddi.repl_v3.GetChangeRecords;
@@ -121,8 +122,8 @@ public class API_160_ReplicationTest {
                 }
         }
 
-        @Test(expected = FatalErrorException.class)
-        public void getChangeRecordsInvalid() throws DispositionReportFaultMessage, RemoteException {
+       // @Test(expected = FatalErrorException.class)
+        public void getChangeRecordsValid() throws DispositionReportFaultMessage, RemoteException {
                 List<ChangeRecordIDType> highWaterMarks = repl.getHighWaterMarks();
 
                 HighWaterMarkVectorType highWaterMarkVectorType = new HighWaterMarkVectorType();
@@ -132,8 +133,8 @@ public class API_160_ReplicationTest {
                 req.setChangesAlreadySeen(null);
                 
                 req.setResponseLimitVector(highWaterMarkVectorType);
-                repl.getChangeRecords(req);//"test", null, BigInteger.valueOf(highWaterMarks.get(0).getOriginatingUSN()), highWaterMarkVectorType);
-                Assert.fail("unexpected success");
+                ChangeRecords changeRecords = repl.getChangeRecords(req); //"test", null, BigInteger.valueOf(highWaterMarks.get(0).getOriginatingUSN()), highWaterMarkVectorType);
+                //Assert.fail("unexpected success");
         }
 
         /**

http://git-wip-us.apache.org/repos/asf/juddi/blob/9d22690e/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 3d0dacd..8b38575 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
@@ -133,7 +133,7 @@ public class EntryPoint {
                         int biz = Integer.parseInt(System.console().readLine());
                         System.out.print("servicesPerBusiness: ");
                         int svc = Integer.parseInt(System.console().readLine());
-                        new UddiCreatebulk().publishBusiness(authtoken, biz, svc);
+                        new UddiCreatebulk("default").publishBusiness(authtoken, biz, svc);
                 }
                 if (input.equals("7")) {
                         UDDISecurityPortType security = null;
@@ -439,22 +439,25 @@ public class EntryPoint {
                 }
                 if (input.equals("magic")) {
                         //secret menu, setups up replication between juddi8080 and 9080 and adds a record or two on 8080
-                        UDDISecurityPortType security = null;
-                        UDDIClient clerkManager = new UDDIClient("META-INF/simple-publish-uddi.xml");
+                        //UDDISecurityPortType security = null;
+                        //UDDIClient clerkManager = new UDDIClient("META-INF/simple-publish-uddi.xml");
                         
-                        Transport transport = clerkManager.getTransport("default");
+                       /* Transport transport = clerkManager.getTransport("default");
                         security = transport.getUDDISecurityService();
                        
-                        String uname = "root";
+                       String uname = "root";
                        
                         GetAuthToken getAuthTokenRoot = new GetAuthToken();
                         getAuthTokenRoot.setUserID(uname);
                         getAuthTokenRoot.setCred("root");
                         authtoken = security.getAuthToken(getAuthTokenRoot).getAuthInfo();
-                        System.out.println("Success!");
+                        System.out.println("Success!");*/
+                        
+                        //this setups up a replication config between the two nodes
                         new JuddiAdminService().autoMagic();
 
-                        new UddiCreatebulk().publishBusiness(authtoken, 1, 1);
+                        new UddiCreatebulk("default").publishBusiness(null, 1, 1);
+                        new UddiCreatebulk("uddi:another.juddi.apache.org:node2").publishBusiness(null, 1, 1);
                 }
 
         }

http://git-wip-us.apache.org/repos/asf/juddi/blob/9d22690e/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/UddiCreatebulk.java
----------------------------------------------------------------------
diff --git a/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/UddiCreatebulk.java b/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/UddiCreatebulk.java
index 696c8b7..7825e79 100644
--- a/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/UddiCreatebulk.java
+++ b/juddi-examples/more-uddi-samples/src/main/java/org/apache/juddi/samples/UddiCreatebulk.java
@@ -41,12 +41,12 @@ public class UddiCreatebulk {
         private static UDDISecurityPortType security = null;
         private static UDDIPublicationPortType publish = null;
 
-        public UddiCreatebulk() {
+        public UddiCreatebulk(String node) {
                 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");
-                        Transport transport = clerkManager.getTransport();
+                        Transport transport = clerkManager.getTransport(node);
                         // Now you create a reference to the UDDI API
                         security = transport.getUDDISecurityService();
                         publish = transport.getUDDIPublishService();
@@ -186,7 +186,7 @@ public class UddiCreatebulk {
         }
 
         public static void main(String args[]) {
-                UddiCreatebulk sp = new UddiCreatebulk();
+                UddiCreatebulk sp = new UddiCreatebulk(null);
                 sp.publishBusiness(null, 15, 20);
         }
 }

http://git-wip-us.apache.org/repos/asf/juddi/blob/9d22690e/juddi-gui/src/main/resources/org/apache/juddi/webconsole/resources/web.properties
----------------------------------------------------------------------
diff --git a/juddi-gui/src/main/resources/org/apache/juddi/webconsole/resources/web.properties b/juddi-gui/src/main/resources/org/apache/juddi/webconsole/resources/web.properties
index 106e855..534032d 100644
--- a/juddi-gui/src/main/resources/org/apache/juddi/webconsole/resources/web.properties
+++ b/juddi-gui/src/main/resources/org/apache/juddi/webconsole/resources/web.properties
@@ -363,7 +363,7 @@ pages.editor.tmodel.instances=Instances
 pages.editor.tmodel.deleted=Is this tModel Deleted? (not available for future use).
 pages.signatures.signedby=Signed By
 pages.signatures.status=Signature Status
-pages.editor.tmodel.instances.content=Use this to search for other entities in this registery that reference this tModel
+pages.editor.tmodel.instances.content=Use this to search for other entities in this registry that reference this tModel
 pages.editor.tmodel.search.business=Find Businesses
 pages.editor.tmodel.search.binding=Find binding
 pages.editor.tmodel.search.services=Find services

http://git-wip-us.apache.org/repos/asf/juddi/blob/9d22690e/juddi-gui/src/main/webapp/bindingEditor.jsp
----------------------------------------------------------------------
diff --git a/juddi-gui/src/main/webapp/bindingEditor.jsp b/juddi-gui/src/main/webapp/bindingEditor.jsp
index a0699c7..9a1a1f1 100644
--- a/juddi-gui/src/main/webapp/bindingEditor.jsp
+++ b/juddi-gui/src/main/webapp/bindingEditor.jsp
@@ -217,14 +217,14 @@
 
                                                 <b><%=ResourceLoader.GetResource(session, "items.description")%> </b>- 
                                                 <%=ResourceLoader.GetResource(session, "items.services.description")%><br>
-                                                <a href="javascript:AddDescription('Description');"><i class="icon-plus-sign icon-large"></i></a> <%=ResourceLoader.GetResource(session, "items.description.add")%>
+                                                <a href="javascript:AddDescription('Description');"><i class="icon-plus-sign icon-large"></i> <%=ResourceLoader.GetResource(session, "items.description.add")%></a>
 
                                                 <div id="Description" style="border-width: 2px; border-style: solid;" >
                                                         <%
                                                                 for (int i = 0; i < bd.getDescription().size(); i++) {
                                                                         out.write("<div id=\"" + PostBackConstants.DESCRIPTION + i + "\" style=\"border-width:1px; border-style:solid\">");
                                                                         out.write("<div style=\"float:left;height:100%\"><a href=\"javascript:Remove('Description" + i + "');\"><i class=\"icon-trash icon-large\"></i>&nbsp;</a></div>");
-                                                                        out.write("<div style=\"float:left\">" + ResourceLoader.GetResource(session, "items.key") + ":&nbsp;</div>"
+                                                                        out.write("<div style=\"float:left\">" + ResourceLoader.GetResource(session, "items.value") + ":&nbsp;</div>"
                                                                              + "<div class=\"edit\" id=\"" + PostBackConstants.DESCRIPTION + i + PostBackConstants.VALUE + "\">" + StringEscapeUtils.escapeHtml(bd.getDescription().get(i).getValue()) + "</div>");
                                                                         out.write("<div style=\"float:left\">" + ResourceLoader.GetResource(session, "items.lang") + ":&nbsp;</div>"
                                                                              + "<div class=\"edit\" id=\"" + PostBackConstants.DESCRIPTION + i + PostBackConstants.LANG + "\">"

http://git-wip-us.apache.org/repos/asf/juddi/blob/9d22690e/juddi-gui/src/main/webapp/js/businessEditor.js
----------------------------------------------------------------------
diff --git a/juddi-gui/src/main/webapp/js/businessEditor.js b/juddi-gui/src/main/webapp/js/businessEditor.js
index 090fe49..ab213e3 100644
--- a/juddi-gui/src/main/webapp/js/businessEditor.js
+++ b/juddi-gui/src/main/webapp/js/businessEditor.js
@@ -92,7 +92,7 @@ function AddDescription()
     var i = currentDescriptionEntries;
     $("<div id=\"Description" + i + "\" style=\"border-width:1px; border-style:solid\" >" 
         +"<div style=\"float:left;height:100%\"><a href=\"javascript:Remove('Description" + i 
-        +"');\"><i class=\"icon-trash icon-large\"></i></a></div>"
+        +"');\"><i class=\"icon-trash icon-large\"></i>&nbsp;</a></div>"
         +"<div style=\"float:left\">" + i18n_value + ": &nbsp;</div>"
         +"<div class=\"edit\" id=\"Description" + i + "Value\"></div>"
         +"<div style=\"float:left\">" + i18n_lang + ": &nbsp;</div>"
@@ -109,7 +109,7 @@ function AddDisco()
     
     $("<div id=\"disco" + i + "\" style=\"border-width:1px; border-style:solid\" >" 
         +"<div style=\"float:left;height:100%\"><a href=\"javascript:Remove('disco" + i 
-        +"');\"><i class=\"icon-trash icon-large\"></i></a></div>"
+        +"');\"><i class=\"icon-trash icon-large\"></i>&nbsp;</a></div>"
         +"<div style=\"float:left\">" + i18n_value + ": &nbsp;</div>"
         +"<div class=\"edit\" id=\"disco" + i + "Value\"></div>"
         +"<div style=\"float:left\">" + i18n_type + ": &nbsp;</div>"
@@ -129,7 +129,7 @@ function AddContact()
     
     $("<div id=\"contact" + i + "\" style=\"border-width:2px; border-style:solid; border-color:red\" >" 
         +"<div style=\"float:left;height:100%\"><a href=\"javascript:Remove('contact" + i 
-        +"');\"><i class=\"icon-trash icon-large\"></i></a></div>"
+        +"');\"><i class=\"icon-trash icon-large\"></i>&nbsp;</a></div>"
         +"<div style=\"float:left\">" + i18n_contactType+ ": &nbsp;</div>"
         +"<div class=\"edit\" id=\"contact" + i + "Type\">" + i18n_contactTypeDefault + "</div>"
         +"<a href=\"javascript:AddContactName('" + i + "');\"><i class=\"icon-plus-sign icon-large\"></i></a>" + i18n_name + " &nbsp"
@@ -148,7 +148,7 @@ function AddContactName(contactid)
 {
     $("<div id=\"contact" + contactid + "Name" + contactname + "\" style=\"border-width:1px; border-style:solid\" >" 
         +"<div style=\"float:left;height:100%\"><a href=\"javascript:Remove('contact" + contactid + "Name" + contactname
-        +"');\"><i class=\"icon-trash icon-large\"></i></a></div>"
+        +"');\"><i class=\"icon-trash icon-large\"></i>&nbsp;</a></div>"
         +"<div style=\"float:left\">" + i18n_name + ": &nbsp;</div>"
         +"<div class=\"edit\" id=\"contact" + contactid + "Name" + contactname + "Value\"></div>"
         +"<div style=\"float:left\">" + i18n_lang + ": &nbsp;</div>"
@@ -162,7 +162,7 @@ function AddContactEmail(contactid)
 {
     $("<div id=\"contact" + contactid + "Email" + contactemail + "\" style=\"border-width:1px; border-style:solid\" >" 
         +"<div style=\"float:left;height:100%\"><a href=\"javascript:Remove('contact" + contactid + "Email" + contactemail
-        +"');\"><i class=\"icon-trash icon-large\"></i></a></div>"
+        +"');\"><i class=\"icon-trash icon-large\"></i>&nbsp;</a></div>"
         +"<div style=\"float:left\">" + i18n_type + ": &nbsp;</div>"
         +"<div class=\"edit\" id=\"contact" + contactid + "Email" + contactemail + "Type\">" + i18n_email+ "</div>"
         +"<div style=\"float:left\">" + i18n_value + ": &nbsp;</div>"
@@ -175,7 +175,7 @@ function AddContactDescription(contactid)
 {
     $("<div id=\"contact" + contactid + "Description" + contactdescription + "\" style=\"border-width:1px; border-style:solid\" >" 
         +"<div style=\"float:left;height:100%\"><a href=\"javascript:Remove('contact" + contactid + "Description" + contactdescription
-        +"');\"><i class=\"icon-trash icon-large\"></i></a></div>"
+        +"');\"><i class=\"icon-trash icon-large\"></i>&nbsp;</a></div>"
         +"<div style=\"float:left\">" + i18n_description + ": &nbsp;</div>"
         +"<div class=\"edit\" id=\"contact" + contactid + "Description" + contactdescription + "Value\">"+i18n_contactPrimary+"</div>"
         +"<div style=\"float:left\">" + i18n_lang + ": &nbsp;</div>"
@@ -189,7 +189,7 @@ function AddContactPhone(contactid)
 {
     $("<div id=\"contact" + contactid + "Phone" + contactphone + "\" style=\"border-width:1px; border-style:solid\" >" 
         +"<div style=\"float:left;height:100%\"><a href=\"javascript:Remove('contact" + contactid + "Phone" + contactphone
-        +"');\"><i class=\"icon-trash icon-large\"></i></a></div>"
+        +"');\"><i class=\"icon-trash icon-large\"></i>&nbsp;</a></div>"
         +"<div style=\"float:left\">" + i18n_phone + ": &nbsp;</div>"
         +"<div class=\"edit\" id=\"contact" + contactid + "Phone" + contactphone + "Value\"></div>"
         +"<div style=\"float:left\">" + i18n_type + ": &nbsp;</div>"
@@ -204,7 +204,7 @@ function AddContactAddress(contactid)
     $("<div id=\"contact" + contactid + "Address" + contactaddress + "\" style=\"border-width:1px; border-style:solid\" >" 
         
         +"<div style=\"float:left;height:100%\"><a href=\"javascript:Remove('contact" + contactid + "Address" + contactaddress
-        +"');\"><i class=\"icon-trash icon-large\"></i></a>" + i18n_address + "</div><br>"
+        +"');\"><i class=\"icon-trash icon-large\"></i>&nbsp;</a>" + i18n_address + "</div><br>"
         +"<div style=\"float:left\">" + i18n_lang + ": &nbsp;</div>"
         +"<div class=\"edit\" id=\"contact" + contactid + "Address" + contactaddress + "Lang\"></div>"
         +"<div style=\"float:left\">" + i18n_addressSortCode + ": &nbsp;</div>"
@@ -228,7 +228,7 @@ function AddContactAddressLine(contactid)
         "\" style=\"border-width:1px; border-style:solid\" >" 
         
         +"<div style=\"float:left;height:100%\"><a href=\"javascript:Remove('contact" + contactid + "addressLine" +contactaddresslines 
-        +"');\"><i class=\"icon-trash icon-large\"></i></a></div>"
+        +"');\"><i class=\"icon-trash icon-large\"></i>&nbsp;</a></div>"
         +"<div style=\"float:left\">" + i18n_addressValue + ": &nbsp;</div>"
         +"<div class=\"edit\" id=\"contact" + contactid + "addressLine" + contactaddresslines + "Value\"></div>"
         +"<div style=\"float:left\">" +i18n_keyname_optional + ": &nbsp;</div>"
@@ -248,7 +248,7 @@ function AddCategoryKeyReferenceParam(tmodelkey, keyname, keyvalue)
     var i=currentcatkeyref;
     
     $("<div id=\"catbagkeyref" + i + "\" style=\"border-width:1px; border-style:solid\">"+
-        "<div style=\"float:left;height:100%\"><a href=\"javascript:Remove('catbagkeyref" + i + "');\"><i class=\"icon-trash icon-large\"></i></a></div>"+
+        "<div style=\"float:left;height:100%\"><a href=\"javascript:Remove('catbagkeyref" + i + "');\"><i class=\"icon-trash icon-large\"></i>&nbsp;</a></div>"+
         "<div style=\"float:left\">" + i18n_key +" (<a href=\"javascript:tModelModal('catbagkeyref" + i + "Value')\" ><i class=\"icon-list-alt icon-large\"></i>" + il8n_picker + "</a>): &nbsp;</div>"
         + "<div class=\"edit\" id=\"catbagkeyref" + i + "Value\">" + tmodelkey + "</div>"
         +"<div style=\"float:left\">" + i18n_name + ": &nbsp;</div>"
@@ -267,7 +267,7 @@ function AddCategoryKeyReference()
     var i=currentcatkeyref;
     
     $("<div id=\"catbagkeyref" + i + "\" style=\"border-width:1px; border-style:solid\">"+
-        "<div style=\"float:left;height:100%\"><a href=\"javascript:Remove('catbagkeyref" + i + "');\"><i class=\"icon-trash icon-large\"></i></a></div>"+
+        "<div style=\"float:left;height:100%\"><a href=\"javascript:Remove('catbagkeyref" + i + "');\"><i class=\"icon-trash icon-large\"></i>&nbsp;</a></div>"+
         // <div style=\"float:left\">" + s.key") + ": <a href=\"javascript:tModelModal('" + PostBackConstants.CATBAG_KEY_REF + i + PostBackConstants.VALUE + "')\" class=\"btn btn-mini\">Picker</a> &nbsp;</div>"
         "<div style=\"float:left\">" + i18n_key +" (<a href=\"javascript:tModelModal('catbagkeyref" + i + "Value')\" ><i class=\"icon-list-alt icon-large\"></i>" + il8n_picker + "</a>): &nbsp;</div>"
         + "<div class=\"edit\" id=\"catbagkeyref" + i + "Value\"></div>"

http://git-wip-us.apache.org/repos/asf/juddi/blob/9d22690e/juddi-gui/src/main/webapp/serviceEditor.jsp
----------------------------------------------------------------------
diff --git a/juddi-gui/src/main/webapp/serviceEditor.jsp b/juddi-gui/src/main/webapp/serviceEditor.jsp
index 00b41b9..9c1c37f 100644
--- a/juddi-gui/src/main/webapp/serviceEditor.jsp
+++ b/juddi-gui/src/main/webapp/serviceEditor.jsp
@@ -348,7 +348,7 @@
                                                 <b><%=ResourceLoader.GetResource(session, "items.bindingtemplate")%> </b>- <%=ResourceLoader.GetResource(session, "items.bindingtemplate.description")%> <br>
                                                 <% if (!newitem) {
                                                 %>
-                                                <a href="bindingEditor.jsp?svcid=<%=URLEncoder.encode(bd.getServiceKey(), "UTF8")%>"><i class="icon-plus-sign icon-large"></i></a> <%=ResourceLoader.GetResource(session, "items.bindingtemplate.add")%> <Br>
+                                                <a href="bindingEditor.jsp?svcid=<%=URLEncoder.encode(bd.getServiceKey(), "UTF8")%>"><i class="icon-plus-sign icon-large"></i> <%=ResourceLoader.GetResource(session, "items.bindingtemplate.add")%></a> <Br>
                                                 
                                                         <%
                                                 }

http://git-wip-us.apache.org/repos/asf/juddi/blob/9d22690e/juddi-tomcat/build.xml
----------------------------------------------------------------------
diff --git a/juddi-tomcat/build.xml b/juddi-tomcat/build.xml
index f2349f9..325634f 100644
--- a/juddi-tomcat/build.xml
+++ b/juddi-tomcat/build.xml
@@ -81,8 +81,10 @@
 		
 		<copy file="${basedir}/juddiv3Node2.xml" tofile="${webapps2.dir}/juddiv3/WEB-INF/classes/juddiv3.xml" overwrite="true"/>
 		<copy file="${basedir}/juddi_install_data_node2/root_BusinessEntity.xml" todir="${webapps2.dir}/juddiv3/WEB-INF/classes/juddi_custom_install_data/" overwrite="true"/>
-<copy file="${basedir}/juddi_install_data_node2/root_Publisher.xml" todir="${webapps2.dir}/juddiv3/WEB-INF/classes/juddi_custom_install_data/" overwrite="true"/>
-<copy file="${basedir}/juddi_install_data_node2/root_tModelKeyGen.xml" todir="${webapps2.dir}/juddiv3/WEB-INF/classes/juddi_custom_install_data/" overwrite="true"/>
+		<copy file="${basedir}/juddi_install_data_node2/root_Publisher.xml" todir="${webapps2.dir}/juddiv3/WEB-INF/classes/juddi_custom_install_data/" overwrite="true"/>
+		<copy file="${basedir}/juddi_install_data_node2/root_tModelKeyGen.xml" todir="${webapps2.dir}/juddiv3/WEB-INF/classes/juddi_custom_install_data/" overwrite="true"/>
+		<copy file="${basedir}/juddi_install_data_node2/UDDI_Publisher.xml" todir="${webapps2.dir}/juddiv3/WEB-INF/classes/juddi_custom_install_data/" overwrite="true"/>
+		<copy file="${basedir}/juddi_install_data_node2/UDDI_tModels.xml" todir="${webapps2.dir}/juddiv3/WEB-INF/classes/juddi_custom_install_data/" overwrite="true"/>
 
 		
 		<copy file="${basedir}/uddiNode2.xml" tofile="${webapps2.dir}/juddi-gui/WEB-INF/classes/META-INF/uddi.xml" overwrite="true"/>

http://git-wip-us.apache.org/repos/asf/juddi/blob/9d22690e/juddi-tomcat/juddi_install_data_node2/UDDI_Publisher.xml
----------------------------------------------------------------------
diff --git a/juddi-tomcat/juddi_install_data_node2/UDDI_Publisher.xml b/juddi-tomcat/juddi_install_data_node2/UDDI_Publisher.xml
new file mode 100644
index 0000000..0bfd815
--- /dev/null
+++ b/juddi-tomcat/juddi_install_data_node2/UDDI_Publisher.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Copyright 2001-2009 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.
+ *
+ */ -->
+<publisher xmlns="urn:juddi-apache-org:api_v3" authorizedName="uddi">
+  <publisherName>UDDI publisher</publisherName>
+  <isAdmin>false</isAdmin>
+</publisher>
+


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@juddi.apache.org
For additional commands, e-mail: commits-help@juddi.apache.org