Repository: juddi
Updated Branches:
  refs/heads/master 31c146102 -> b2179ec4b


JUDDI-906 more test case enhancements, business, tmodel and publisher 
assertions save and delete are confirmed replication
JUDDI-913 code is included but comment out due to failing tests (jpa issues)


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

Branch: refs/heads/master
Commit: b2179ec4b8add7bedb5b34d7f05e7e88f47fcf18
Parents: 31c1461
Author: Alex <[email protected]>
Authored: Tue Jan 13 08:57:22 2015 -0500
Committer: Alex <[email protected]>
Committed: Tue Jan 13 08:57:22 2015 -0500

----------------------------------------------------------------------
 .../juddi/api/impl/AuthenticatedService.java    |   2 -
 .../juddi/api/impl/UDDICustodyTransferImpl.java |   1 -
 .../juddi/api/impl/UDDIPublicationImpl.java     |  12 +-
 .../juddi/api/impl/UDDIReplicationImpl.java     | 303 +++++++++++--------
 .../apache/juddi/mapping/MappingApiToModel.java |  13 +-
 .../apache/juddi/mapping/MappingModelToApi.java |   7 +
 .../org/apache/juddi/model/BusinessEntity.java  |   2 +-
 .../apache/juddi/model/PublisherAssertion.java  |  16 +
 .../java/org/apache/juddi/model/Signature.java  |  15 +
 .../juddi/replication/ReplicationNotifier.java  |   2 +-
 .../tck/JUDDI_300_MultiNodeIntegrationTest.java | 177 +++++++++--
 11 files changed, 392 insertions(+), 158 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/juddi/blob/b2179ec4/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 fb0e00e..532d6eb 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
@@ -18,8 +18,6 @@
 package org.apache.juddi.api.impl;
 
 import java.util.Date;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import javax.annotation.Resource;
 
 import javax.persistence.EntityManager;

http://git-wip-us.apache.org/repos/asf/juddi/blob/b2179ec4/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDICustodyTransferImpl.java
----------------------------------------------------------------------
diff --git 
a/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDICustodyTransferImpl.java
 
b/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDICustodyTransferImpl.java
index 8a3d862..352123c 100644
--- 
a/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDICustodyTransferImpl.java
+++ 
b/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDICustodyTransferImpl.java
@@ -73,7 +73,6 @@ import org.uddi.repl_v3.TransferCustody;
 import org.uddi.v3_service.DispositionReportFaultMessage;
 import org.uddi.v3_service.UDDICustodyTransferPortType;
 import org.uddi.v3_service.UDDIReplicationPortType;
-import sun.util.BuddhistCalendar;
 
 /**
  * This implements the UDDI v3 Custody Transfer API web service

http://git-wip-us.apache.org/repos/asf/juddi/blob/b2179ec4/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDIPublicationImpl.java
----------------------------------------------------------------------
diff --git 
a/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDIPublicationImpl.java 
b/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDIPublicationImpl.java
index 9e7c786..111fda0 100644
--- 
a/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDIPublicationImpl.java
+++ 
b/juddi-core/src/main/java/org/apache/juddi/api/impl/UDDIPublicationImpl.java
@@ -57,6 +57,7 @@ import org.apache.juddi.query.util.FindQualifiers;
 import org.apache.juddi.replication.ReplicationNotifier;
 import org.apache.juddi.v3.error.ErrorMessage;
 import org.apache.juddi.v3.error.FatalErrorException;
+import org.apache.juddi.v3.error.InvalidValueException;
 import org.apache.juddi.validation.ValidatePublish;
 import org.uddi.api_v3.AddPublisherAssertions;
 import org.uddi.api_v3.AssertionStatusItem;
@@ -154,12 +155,15 @@ public class UDDIPublicationImpl extends 
AuthenticatedService implements UDDIPub
                                                         
existingPubAssertion.setToCheck("true");
                                                 }
 
+                                                em.merge(existingPubAssertion);
                                                 persistNewAssertion = false;
+                                                
changes.add(getChangeRecord_deletePublisherAssertion(apiPubAssertion, node, 
existingPubAssertion.getToCheck().equalsIgnoreCase("false"), 
existingPubAssertion.getFromCheck().equalsIgnoreCase("false"),  
System.currentTimeMillis()));
                                         } else {
                                                 // Otherwise, it is a new 
relationship between these entities.  Remove the old one so the new one can be 
added.
                                                 // TODO: the model only seems 
to allow one assertion per two business (primary key is fromKey and toKey). 
Spec seems to imply as 
                                                 // many relationships as 
desired (the differentiator would be the keyedRef values).
                                                 
em.remove(existingPubAssertion);
+                                                
changes.add(getChangeRecord_deletePublisherAssertion(apiPubAssertion, node, 
true, true, System.currentTimeMillis()));
                                         }
                                 }
 
@@ -339,6 +343,8 @@ public class UDDIPublicationImpl extends 
AuthenticatedService implements UDDIPub
 
                                 org.apache.juddi.model.PublisherAssertion 
existingPubAssertion = em.find(org.apache.juddi.model.PublisherAssertion.class,
                                         modelPubAssertion.getId());
+                                if (existingPubAssertion==null)
+                                        throw new InvalidValueException(new 
ErrorMessage("E_assertionNotFound"));
 
                                 boolean fromkey = 
publisher.isOwner(em.find(BusinessEntity.class, entity.getFromKey()));
                                 boolean tokey = 
publisher.isOwner(em.find(BusinessEntity.class, entity.getToKey()));
@@ -356,7 +362,7 @@ public class UDDIPublicationImpl extends 
AuthenticatedService implements UDDIPub
                                         em.persist(existingPubAssertion);
                                 }
 
-                                
changes.add(getChangeRecord_deletePublisherAssertion(entity, node, fromkey, 
tokey, existingPubAssertion.getModified().getTime()));
+                                
changes.add(getChangeRecord_deletePublisherAssertion(entity, node, 
tokey,fromkey, existingPubAssertion.getModified().getTime()));
                         }
 
                         tx.commit();
@@ -398,7 +404,7 @@ public class UDDIPublicationImpl extends 
AuthenticatedService implements UDDIPub
                         modelPubAssertion.getId());
 
                 if (existingPubAssertion == null) {
-                        throw new FatalErrorException(new 
ErrorMessage("assertionNotFound"));
+                        throw new FatalErrorException(new 
ErrorMessage("E_assertionNotFound"));
                 }
                 boolean fromkey = entity.isFromBusinessCheck();// 
publisher.isOwner(em.find(BusinessEntity.class, entity.getFromKey()));
                 boolean tokey = entity.isToBusinessCheck();//  
publisher.isOwner(em.find(BusinessEntity.class, entity.getToKey()));
@@ -410,9 +416,11 @@ public class UDDIPublicationImpl extends 
AuthenticatedService implements UDDIPub
                 }
                 if ("false".equalsIgnoreCase(existingPubAssertion.getToCheck())
                         && 
"false".equalsIgnoreCase(existingPubAssertion.getFromCheck())) {
+                        logger.info("!!!Deletion of publisher assertion from 
database via replication");
                         em.remove(existingPubAssertion);
                 } else {
                         existingPubAssertion.setModified(new Date());
+                        logger.info("!!!Publisher assertion update database 
via replication");
                         em.persist(existingPubAssertion);
                 }
 

http://git-wip-us.apache.org/repos/asf/juddi/blob/b2179ec4/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 7826cc5..c32f264 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
@@ -109,13 +109,13 @@ import org.uddi.v3_service.UDDIReplicationPortType;
         org.uddi.policy_v3_instanceparms.ObjectFactory.class
 })
 public class UDDIReplicationImpl extends AuthenticatedService implements 
UDDIReplicationPortType {
-
+        
         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 ConcurrentLinkedQueue<String>();
@@ -128,9 +128,9 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                 queue.add(s);
                         }
                 }
-
+                
         }
-
+        
         private static Set<String> getNodes(ReplicationConfiguration 
oldConfig) {
                 Set<String> ret = new HashSet<String>();
                 if (oldConfig == null) {
@@ -169,19 +169,19 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                         if (!found) {
                                 diff.add(lhs);
                         }
-
+                        
                 }
                 return diff;
         }
-
+        
         private UDDIServiceCounter serviceCounter;
-
+        
         private static PullTimerTask timer = null;
         private long startBuffer = 
5000l;//AppConfig.getConfiguration().getLong(Property.JUDDI_NOTIFICATION_START_BUFFER,
 20000l); // 20s startup delay default 
         private long interval = 5000l;// 
AppConfig.getConfiguration().getLong(Property.JUDDI_NOTIFICATION_INTERVAL, 
300000l); //5 min default
 
         private static UDDIPublicationImpl pub = null;
-
+        
         public UDDIReplicationImpl() {
                 super();
                 if (pub == null) {
@@ -195,17 +195,17 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                 } catch (ConfigurationException ex) {
                         logger.fatal(ex);
                 }
-
+                
         }
-
+        
         private synchronized void Init() {
                 if (queue == null) {
                         queue = new ConcurrentLinkedQueue<String>();
                 }
                 timer = new PullTimerTask();
-
+                
         }
-
+        
         private boolean Excluded(HighWaterMarkVectorType changesAlreadySeen, 
ChangeRecord r) {
                 if (changesAlreadySeen != null) {
                         for (int i = 0; i < 
changesAlreadySeen.getHighWaterMark().size(); i++) {
@@ -223,18 +223,18 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
          * available
          */
         private class PullTimerTask extends TimerTask {
-
+                
                 private Timer timer = null;
-
+                
                 public PullTimerTask() {
                         super();
                         timer = new Timer(true);
                         timer.scheduleAtFixedRate(this, startBuffer, interval);
                 }
-
+                
                 @Override
                 public void run() {
-
+                        
                         if (!queue.isEmpty()) {
                                 logger.info("Replication change puller thread 
started. Queue size: " + queue.size());
                         }
@@ -260,10 +260,10 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                                                 
GetChangeRecords body = new GetChangeRecords();
                                                                 
body.setRequestingNode(node);
                                                                 
body.setResponseLimitCount(BigInteger.valueOf(20));
-
+                                                                
                                                                 
body.setChangesAlreadySeen(getLastChangeRecordFrom(poll));
                                                                 
logger.info("fetching updates from " + poll + " since " + 
body.getChangesAlreadySeen().getHighWaterMark().get(0).getOriginatingUSN() + " 
items still in the queue: " + queue.size());
-
+                                                                
                                                                 
List<ChangeRecord> records
                                                                         = 
replicationClient.getChangeRecords(body).getChangeRecord();
                                                                 //ok now we 
need to persist the change records
@@ -275,7 +275,7 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                                                 
recordsreturned = records.size();
                                                         }
                                                 } catch (Exception ex) {
-                                                        logger.error("Error 
caught fetching replication changes from " + poll + " @" + 
((BindingProvider)replicationClient).getRequestContext().get(BindingProvider.ENDPOINT_ADDRESS_PROPERTY),
 ex);
+                                                        logger.error("Error 
caught fetching replication changes from " + poll + " @" + ((BindingProvider) 
replicationClient).getRequestContext().get(BindingProvider.ENDPOINT_ADDRESS_PROPERTY),
 ex);
                                                 }
                                         }
                                 } else {
@@ -283,7 +283,7 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                 }
                         }
                 }
-
+                
                 @Override
                 public boolean cancel() {
                         timer.cancel();
@@ -300,9 +300,9 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                         if (rec == null) {
                                 return;
                         }
-                         logger.debug("_______________________Remote change 
request " + rec.getChangeID().getNodeID() + ":" + 
rec.getChangeID().getOriginatingUSN());
-
-                        if 
(rec.getChangeID().getNodeID().equalsIgnoreCase(node)){
+                        logger.debug("_______________________Remote change 
request " + rec.getChangeID().getNodeID() + ":" + 
rec.getChangeID().getOriginatingUSN());
+                        
+                        if 
(rec.getChangeID().getNodeID().equalsIgnoreCase(node)) {
                                 logger.info("Just received a change record 
that i created, ignoring....");
                                 return;
                         }
@@ -317,8 +317,7 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                          * a USN is less than the USN specified in the
                          * changesAlreadySeen highWaterMarkVector.
                          */
-
-                       
+                        
                         try {
                                 tx.begin();
                                 //the change record rec must also be 
persisted!!
@@ -326,11 +325,11 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                 mapChangeRecord.setId(null);
                                 em.persist(mapChangeRecord);
                                 tx.commit();
-                                logger.debug("Remote CR saved, it was from " + 
mapChangeRecord.getNodeID() + 
-                                        " USN:" + 
mapChangeRecord.getOriginatingUSN() + 
-                                        " Type:" + 
mapChangeRecord.getRecordType().name() +
-                                        " Key:"+mapChangeRecord.getEntityKey() 
+ 
-                                        " Local id:"+mapChangeRecord.getId());
+                                logger.debug("Remote CR saved, it was from " + 
mapChangeRecord.getNodeID()
+                                        + " USN:" + 
mapChangeRecord.getOriginatingUSN()
+                                        + " Type:" + 
mapChangeRecord.getRecordType().name()
+                                        + " Key:" + 
mapChangeRecord.getEntityKey()
+                                        + " Local id:" + 
mapChangeRecord.getId());
                                 tx = em.getTransaction();
                                 tx.begin();
                                 //<editor-fold defaultstate="collapsed" 
desc="delete a record">
@@ -372,14 +371,16 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                 //<editor-fold defaultstate="collapsed" 
desc="New Data">
                                 if (rec.getChangeRecordNewData() != null) {
 
-                                        if 
(rec.getChangeRecordNewData().getOperationalInfo().getNodeID() == null) {
-                                                throw new Exception("Inbound 
replication data is missiong node id!");
-                                        }
-
                                         //The operationalInfo element MUST 
contain the operational information associated with the indicated new data.
                                         if 
(rec.getChangeRecordNewData().getOperationalInfo() == null) {
                                                 logger.warn("Inbound 
replication data does not have the required OperationalInfo element and is NOT 
spec compliant. Data will be ignored");
                                         } else {
+                                                if 
(rec.getChangeRecordNewData().getOperationalInfo().getNodeID() == null) {
+                                                        throw new 
Exception("Inbound replication data is missiong node id! Change will not be 
applied");
+                                                }
+                                                if 
(rec.getChangeRecordNewData().getOperationalInfo().getNodeID().equalsIgnoreCase(node))
 {
+                                                        logger.warn("Inbound 
replication data is modifying locally owned data. This is not allowed");
+                                                }
                                                 if 
(rec.getChangeRecordNewData().getBindingTemplate() != null) {
                                                         //fetch the binding 
template if it exists already
                                                         //if it exists, 
@@ -390,10 +391,11 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                                         if (model == null) {
                                                                 
logger.error("Replication error, attempting to insert a binding where the 
service doesn't exist yet");
                                                         } else {
-                                                                
ValidateNodeIdMatches(model.getNodeId(), 
rec.getChangeRecordNewData().getOperationalInfo());
-
+                                                                
ValidateNodeIdMatches(rec.getChangeRecordNewData().getOperationalInfo().getNodeID(),
 model.getNodeId());
+                                                                
                                                                 
org.apache.juddi.model.BindingTemplate bt = 
em.find(org.apache.juddi.model.BindingTemplate.class, 
rec.getChangeRecordNewData().getBindingTemplate().getBindingKey());
                                                                 if (bt != 
null) {
+                                                                        
//ValidateNodeIdMatches(node, bt.getNodeId());
                                                                         
em.remove(bt);
                                                                 }
                                                                 bt = new 
BindingTemplate();
@@ -402,12 +404,12 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                                                 // 
MappingApiToModel.mapOperationalInfoIncludingChildren(model, 
rec.getChangeRecordNewData().getOperationalInfo());
                                                                 em.persist(bt);
                                                         }
-
+                                                        
                                                 } else if 
(rec.getChangeRecordNewData().getBusinessEntity() != null) {
-
+                                                        
                                                         BusinessEntity model = 
em.find(org.apache.juddi.model.BusinessEntity.class, 
rec.getChangeRecordNewData().getBusinessEntity().getBusinessKey());
                                                         if (model != null) {
-                                                                
ValidateNodeIdMatches(model.getNodeId(), 
rec.getChangeRecordNewData().getOperationalInfo());
+                                                                
ValidateNodeIdMatches(rec.getChangeRecordNewData().getOperationalInfo().getNodeID(),
 model.getNodeId());
                                                                 
//em.remove(model);
                                                                 
MappingApiToModel.mapBusinessEntity(rec.getChangeRecordNewData().getBusinessEntity(),
 model);
                                                                 
MappingApiToModel.mapOperationalInfoIncludingChildren(model, 
rec.getChangeRecordNewData().getOperationalInfo());
@@ -424,39 +426,39 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                                         if (find == null) {
                                                                 
logger.error("Replication error, attempting to insert a service where the 
business doesn't exist yet");
                                                         } else {
-
+                                                                
                                                                 
org.apache.juddi.model.BusinessService model = null;
                                                                 model = 
em.find(org.apache.juddi.model.BusinessService.class, 
rec.getChangeRecordNewData().getBusinessService().getServiceKey());
                                                                 if (model != 
null) {
-                                                                        
ValidateNodeIdMatches(model.getNodeId(), 
rec.getChangeRecordNewData().getOperationalInfo());
+                                                                        
ValidateNodeIdMatches(rec.getChangeRecordNewData().getOperationalInfo().getNodeID(),
 model.getNodeId());
                                                                         
em.remove(model);
                                                                 }
-
+                                                                
                                                                 model = new 
org.apache.juddi.model.BusinessService();
                                                                 
MappingApiToModel.mapBusinessService(rec.getChangeRecordNewData().getBusinessService(),
 model, find);
                                                                 
MappingApiToModel.mapOperationalInfo(model, 
rec.getChangeRecordNewData().getOperationalInfo());
                                                                 
MappingApiToModel.mapOperationalInfoIncludingChildren(model, 
rec.getChangeRecordNewData().getOperationalInfo());
-
+                                                                
                                                                 
em.persist(model);
                                                         }
-
+                                                        
                                                 } else if 
(rec.getChangeRecordNewData().getTModel() != null) {
-
+                                                        
                                                         Tmodel model = 
em.find(org.apache.juddi.model.Tmodel.class, 
rec.getChangeRecordNewData().getTModel().getTModelKey());
                                                         if (model != null) {
-                                                                
ValidateNodeIdMatches(model.getNodeId(), 
rec.getChangeRecordNewData().getOperationalInfo());
+                                                                
ValidateNodeIdMatches(rec.getChangeRecordNewData().getOperationalInfo().getNodeID(),
 model.getNodeId());
                                                                 
em.remove(model);
                                                         }
                                                         model = new Tmodel();
                                                         
MappingApiToModel.mapTModel(rec.getChangeRecordNewData().getTModel(), model);
-
+                                                        
                                                         
MappingApiToModel.mapOperationalInfo(model, 
rec.getChangeRecordNewData().getOperationalInfo());
-
+                                                        
                                                         em.persist(model);
                                                 }
-
+                                                
                                         }
-
+                                        
                                 }
 //</editor-fold>
 
@@ -484,19 +486,61 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
 
                                 //<editor-fold defaultstate="collapsed" 
desc="changeRecordPublisherAssertion">
                                 if (rec.getChangeRecordPublisherAssertion() != 
null) {
-
+                                        
+                                        logger.info("Repl CR Publisher 
Assertion");
                                         //TODO are publisher assertions owned 
by a given node?
                                         PublisherAssertionId paid = new 
PublisherAssertionId(rec.getChangeRecordPublisherAssertion().getPublisherAssertion().getFromKey(),
 rec.getChangeRecordPublisherAssertion().getPublisherAssertion().getToKey());
                                         
org.apache.juddi.model.PublisherAssertion model = 
em.find(org.apache.juddi.model.PublisherAssertion.class, paid);
                                         if (model != null) {
-                                                //permission check?
+                                                logger.info("Repl CR Publisher 
Assertion - Existing");
+                                                
+                                                if 
(rec.getChangeRecordPublisherAssertion().isFromBusinessCheck()) {
+                                                        
model.setFromCheck("true");
+                                                } else {
+                                                        
model.setFromCheck("false");
+                                                }
+                                                
+                                                if 
(rec.getChangeRecordPublisherAssertion().isToBusinessCheck()) {
+                                                        
model.setToCheck("true");
+                                                } else {
+                                                        
model.setToCheck("false");
+                                                }
+                                                
+                                                
model.setKeyName(rec.getChangeRecordPublisherAssertion().getPublisherAssertion().getKeyedReference().getKeyName());
+                                                
model.setKeyValue(rec.getChangeRecordPublisherAssertion().getPublisherAssertion().getKeyedReference().getKeyValue());
+                                                
model.setTmodelKey(rec.getChangeRecordPublisherAssertion().getPublisherAssertion().getKeyedReference().getTModelKey());
+                                                
model.setModified(rec.getChangeRecordPublisherAssertion().getModified().toGregorianCalendar().getTime());
+                                                
//model.setSignatures(MappingApiToModel.mapApiSignaturesToModelSignatures(rec.getChangeRecordPublisherAssertion().getPublisherAssertion().getSignature()));
+                                                if 
("false".equalsIgnoreCase(model.getFromCheck())
+                                                        && 
"false".equalsIgnoreCase(model.getToCheck())) {
+                                                        logger.warn("!!!New 
publisher assertion is both false and false, strange. no need to save it 
then!");
+                                                        em.remove(model);
+                                                }
+                                                em.merge(model);
+                                        } else {
+                                                logger.info("Repl CR Publisher 
Assertion - new PA");
+                                                
+                                                model = new 
PublisherAssertion();
+                                                
MappingApiToModel.mapPublisherAssertion(rec.getChangeRecordPublisherAssertion().getPublisherAssertion(),
 model);
+                                                
model.setBusinessEntityByFromKey(null);
+                                                
model.setBusinessEntityByToKey(null);
+                                                
model.setBusinessEntityByFromKey(em.find(BusinessEntity.class, 
rec.getChangeRecordPublisherAssertion().getPublisherAssertion().getFromKey()));
+                                                
model.setBusinessEntityByToKey(em.find(BusinessEntity.class, 
rec.getChangeRecordPublisherAssertion().getPublisherAssertion().getToKey()));
+                                                
+                                                if 
(rec.getChangeRecordPublisherAssertion().isFromBusinessCheck()) {
+                                                        
model.setFromCheck("true");
+                                                } else {
+                                                        
model.setFromCheck("false");
+                                                }
+                                                
+                                                if 
(rec.getChangeRecordPublisherAssertion().isToBusinessCheck()) {
+                                                        
model.setToCheck("true");
+                                                } else {
+                                                        
model.setToCheck("false");
+                                                }
+                                                
model.setModified(rec.getChangeRecordPublisherAssertion().getModified().toGregorianCalendar().getTime());
+                                                em.persist(model);
                                         }
-                                        model = new PublisherAssertion();
-
-                                        
MappingApiToModel.mapPublisherAssertion(rec.getChangeRecordPublisherAssertion().getPublisherAssertion(),
 model);
-                                        
model.setModified(rec.getChangeRecordPublisherAssertion().getModified().toGregorianCalendar().getTime());
-                                        em.persist(model);
-
                                 }
 //</editor-fold>
 
@@ -508,7 +552,7 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                         
ReplicationNotifier.Enqueue(MappingApiToModel.mapChangeRecord(posack));
                                 }
                                 if (rec.getChangeRecordNewDataConditional() != 
null) {
-
+                                        
                                         if 
(rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getOperationalInfo().getNodeID()
 == null) {
                                                 throw new Exception("Inbound 
replication data is missiong node id!");
                                         }
@@ -527,10 +571,11 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                                         if (model == null) {
                                                                 
logger.error("Replication error, attempting to insert a binding where the 
service doesn't exist yet");
                                                         } else {
-                                                                
ValidateNodeIdMatches(model.getNodeId(), 
rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getOperationalInfo());
-
+                                                                
                                                                 
org.apache.juddi.model.BindingTemplate bt = 
em.find(org.apache.juddi.model.BindingTemplate.class, 
rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getBindingTemplate().getBindingKey());
                                                                 if (bt != 
null) {
+                                                                        
ValidateNodeIdMatches(rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getOperationalInfo().getNodeID(),
 bt.getNodeId());
+                                                                        
                                                                         
em.remove(bt);
                                                                 }
                                                                 bt = new 
BindingTemplate();
@@ -539,12 +584,12 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                                                 // 
MappingApiToModel.mapOperationalInfoIncludingChildren(model, 
rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getOperationalInfo());
                                                                 em.persist(bt);
                                                         }
-
+                                                        
                                                 } else if 
(rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getBusinessEntity()
 != null) {
-
+                                                        
                                                         BusinessEntity model = 
em.find(org.apache.juddi.model.BusinessEntity.class, 
rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getBusinessEntity().getBusinessKey());
                                                         if (model != null) {
-                                                                
ValidateNodeIdMatches(model.getNodeId(), 
rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getOperationalInfo());
+                                                                
ValidateNodeIdMatches(rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getOperationalInfo().getNodeID(),
 model.getNodeId());
                                                                 //TODO revisit 
access control rules
                                                                 
em.remove(model);
                                                         }
@@ -555,46 +600,46 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                                         
MappingApiToModel.mapOperationalInfoIncludingChildren(model, 
rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getOperationalInfo());
                                                         logger.warn("Name size 
on save is " + model.getBusinessNames().size());
                                                         em.persist(model);
-
+                                                        
                                                 }
                                                 if 
(rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getBusinessService()
 != null) {
                                                         BusinessEntity find = 
em.find(org.apache.juddi.model.BusinessEntity.class, 
rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getBusinessService().getBusinessKey());
                                                         if (find == null) {
                                                                 
logger.error("Replication error, attempting to insert a service where the 
business doesn't exist yet");
                                                         } else {
-
+                                                                
                                                                 
org.apache.juddi.model.BusinessService model = null;
                                                                 model = 
em.find(org.apache.juddi.model.BusinessService.class, 
rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getBusinessService().getServiceKey());
                                                                 if (model != 
null) {
-                                                                        
ValidateNodeIdMatches(model.getNodeId(), 
rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getOperationalInfo());
+                                                                        
ValidateNodeIdMatches(rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getOperationalInfo().getNodeID(),
 model.getNodeId());
                                                                         
em.remove(model);
                                                                 }
-
+                                                                
                                                                 model = new 
org.apache.juddi.model.BusinessService();
                                                                 
MappingApiToModel.mapBusinessService(rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getBusinessService(),
 model, find);
                                                                 
MappingApiToModel.mapOperationalInfo(model, 
rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getOperationalInfo());
                                                                 
MappingApiToModel.mapOperationalInfoIncludingChildren(model, 
rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getOperationalInfo());
-
+                                                                
                                                                 
em.persist(model);
                                                         }
-
+                                                        
                                                 } else if 
(rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getTModel() 
!= null) {
-
+                                                        
                                                         Tmodel model = 
em.find(org.apache.juddi.model.Tmodel.class, 
rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getTModel().getTModelKey());
                                                         if (model != null) {
-                                                                
ValidateNodeIdMatches(model.getNodeId(), 
rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getOperationalInfo());
+                                                                
ValidateNodeIdMatches(rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getOperationalInfo().getNodeID(),
 model.getNodeId());
                                                                 
em.remove(model);
                                                         }
                                                         model = new Tmodel();
                                                         
MappingApiToModel.mapTModel(rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getTModel(),
 model);
-
+                                                        
                                                         
MappingApiToModel.mapOperationalInfo(model, 
rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getOperationalInfo());
-
+                                                        
                                                         em.persist(model);
                                                 }
-
+                                                
                                         }
-
+                                        
                                 }
                                 if (rec.getChangeRecordNull() != null) {
                                         //No action required
@@ -609,7 +654,7 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
 
                                 }
                                 tx.commit();
-
+                                
                         } catch (Exception drfm) {
                                 logger.warn("Error persisting change record!", 
drfm);
                                 StringWriter sw = new StringWriter();
@@ -622,7 +667,7 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                 em.close();
                         }
                 }
-
+                
                 private HighWaterMarkVectorType getLastChangeRecordFrom(String 
notifyingNode) {
                         HighWaterMarkVectorType ret = new 
HighWaterMarkVectorType();
                         ChangeRecordIDType cid = new ChangeRecordIDType();
@@ -638,9 +683,9 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                 } catch (Exception ex) {
                                         logger.info(ex);
                                 }
-
+                                
                                 tx.rollback();
-
+                                
                         } catch (Exception drfm) {
                                 logger.warn("error caught fetching newest 
record from node " + notifyingNode, drfm);
                         } finally {
@@ -649,22 +694,22 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                 }
                                 em.close();
                         }
-
+                        
                         ret.getHighWaterMark().add(cid);
-
+                        
                         return ret;
                 }
         }
 
         // private void ValidateDontChangeMyRecordsAtAnotherNode(String )
-        private void ValidateNodeIdMatches(String modelNodeId, OperationalInfo 
newDataOperationalInfo) throws Exception {
-                if (modelNodeId == null || newDataOperationalInfo == null) {
+        private void ValidateNodeIdMatches(String newNodeId, String 
currentOwningNode) throws Exception {
+                if (newNodeId == null || currentOwningNode == null) {
                         throw new Exception("either the local node ID is null 
or the inbound replication data's node id is null");
                 }
                 //only time this is allowed is custody transfer
-                if (!modelNodeId.equals(newDataOperationalInfo.getNodeID())) {
+                if (!newNodeId.equals(currentOwningNode)) {
                         //throw new Exception("node id mismatch!");
-                        //logger.info("AUDIT, custory transfer from node, " + 
modelNodeId + " to " + newDataOperationalInfo.getNodeID() + "/" + 
newDataOperationalInfo.getAuthorizedName());
+                        logger.info("AUDIT, custory transfer from node, " + 
currentOwningNode + " to " + newNodeId);
                 }
 
                 //if i already have a record and "own it" and the remote node 
has a record with the same key, reject the update
@@ -683,18 +728,18 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                  * Custody and Ownership Transfer API.
                  */
                 //so someone else attempted to update one of my records, 
reject it
-                if (modelNodeId.equals(node)) {
+                if (newNodeId.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) {
                 if (cache.containsKey(node)) {
                         return cache.get(node);
                 }
                 UDDIService svc = new UDDIService();
                 UDDIReplicationPortType replicationClient = 
svc.getUDDIReplicationPort();
-
+                
                 EntityManager em = PersistenceManager.getEntityManager();
                 EntityTransaction tx = em.getTransaction();
                 try {
@@ -703,7 +748,7 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                         sql.toString();
                         Query qry = em.createQuery(sql.toString());
                         qry.setMaxResults(1);
-
+                        
                         org.apache.juddi.model.ReplicationConfiguration 
resultList = (org.apache.juddi.model.ReplicationConfiguration) 
qry.getSingleResult();
                         for (Operator o : resultList.getOperator()) {
                                 if 
(o.getOperatorNodeID().equalsIgnoreCase(node)) {
@@ -713,7 +758,7 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                 }
                         }
                         tx.rollback();
-
+                        
                 } catch (Exception ex) {
                         logger.fatal("Node not found!" + node, ex);
                 } finally {
@@ -724,7 +769,7 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                 }
                 //em.close();
                 return null;
-
+                
         }
         private Map<String, UDDIReplicationPortType> cache = new 
HashMap<String, UDDIReplicationPortType>();
 
@@ -738,11 +783,11 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                 long startTime = System.currentTimeMillis();
                 long procTime = System.currentTimeMillis() - startTime;
                 serviceCounter.update(ReplicationQuery.DO_PING, 
QueryStatus.SUCCESS, procTime);
-
+                
                 return node;
-
+                
         }
-
+        
         @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
         @WebResult(name = "changeRecords", targetNamespace = 
"urn:uddi-org:repl_v3", partName = "body")
         // @WebMethod(operationName = "get_changeRecords", action = 
"get_changeRecords")
@@ -755,7 +800,7 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                 HighWaterMarkVectorType changesAlreadySeen = 
body.getChangesAlreadySeen();
                 BigInteger responseLimitCount = body.getResponseLimitCount();
                 HighWaterMarkVectorType responseLimitVector = 
body.getResponseLimitVector();
-
+                
                 new 
ValidateReplication(null).validateGetChangeRecords(requestingNode, 
changesAlreadySeen, responseLimitCount, responseLimitVector, FetchEdges(), ctx);
 
                 //TODO should we validate that "requestingNode" is in the 
replication config?
@@ -788,7 +833,7 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                         tx.begin();
                         Long firstrecord = 0L;
                         Long lastrecord = null;
-
+                        
                         if (changesAlreadySeen != null) {
                                 //this is basically a lower limit (i.e. the 
newest record that was processed by the requestor
                                 //therefore we want the oldest record stored 
locally to return to the requestor for processing
@@ -807,23 +852,23 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                         }
                                 }
                         }
-
+                        
                         logger.info("Query db for replication changes, lower 
index is " + (firstrecord) + " last index " + lastrecord + " record limit " + 
maxrecords);
                         Query createQuery = null;
-                       /* 
-                        //this don't work
-                        if (lastrecord != null) {
-                                createQuery = em.createQuery("select e from 
ChangeRecord e where "
-                                        + "((e.id > :inbound AND e.nodeID = 
:node AND e.id < :lastrecord) OR "
-                                        + "(e.originatingUSN > :inbound AND 
e.nodeID <> :node AND e.originatingUSN < :lastrecord)) "
-                                        + "order by e.id ASC");
-                                createQuery.setParameter("lastrecord", 
lastrecord);
-                        } else {
-                                createQuery = em.createQuery("select e from 
ChangeRecord e where "
-                                        + "((e.id > :inbound AND e.nodeID = 
:node) OR "
-                                        + "(e.originatingUSN > :inbound AND 
e.nodeID <> :node)) "
-                                        + "order by e.id ASC");
-                        }*/
+                        /* 
+                         //this don't work
+                         if (lastrecord != null) {
+                         createQuery = em.createQuery("select e from 
ChangeRecord e where "
+                         + "((e.id > :inbound AND e.nodeID = :node AND e.id < 
:lastrecord) OR "
+                         + "(e.originatingUSN > :inbound AND e.nodeID <> :node 
AND e.originatingUSN < :lastrecord)) "
+                         + "order by e.id ASC");
+                         createQuery.setParameter("lastrecord", lastrecord);
+                         } else {
+                         createQuery = em.createQuery("select e from 
ChangeRecord e where "
+                         + "((e.id > :inbound AND e.nodeID = :node) OR "
+                         + "(e.originatingUSN > :inbound AND e.nodeID <> 
:node)) "
+                         + "order by e.id ASC");
+                         }*/
                         if (lastrecord != null) {
                                 createQuery = em.createQuery("select e from 
ChangeRecord e where "
                                         + "(e.id > :inbound AND e.nodeID = 
:node AND e.id < :lastrecord) "
@@ -837,7 +882,7 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                         createQuery.setMaxResults(maxrecords);
                         createQuery.setParameter("inbound", firstrecord);
                         createQuery.setParameter("node", node);
-
+                        
                         List<org.apache.juddi.model.ChangeRecord> records = 
(List<org.apache.juddi.model.ChangeRecord>) createQuery.getResultList();
                         logger.info(records.size() + " CR records returned 
from query");
                         for (int i = 0; i < records.size(); i++) {
@@ -845,18 +890,18 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                 if (!Excluded(changesAlreadySeen, r)) {
                                         ret.add(r);
                                 }
-
+                                
                         }
-
+                        
                         tx.rollback();
                         long procTime = System.currentTimeMillis() - startTime;
                         
serviceCounter.update(ReplicationQuery.GET_CHANGERECORDS,
                                 QueryStatus.SUCCESS, procTime);
-
+                        
                 } catch (Exception ex) {
                         logger.fatal("Error, this node is: " + node, ex);
                         throw new FatalErrorException(new 
ErrorMessage("E_fatalError", ex.getMessage()));
-
+                        
                 } finally {
                         if (tx.isActive()) {
                                 tx.rollback();
@@ -884,12 +929,12 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
         public List<ChangeRecordIDType> getHighWaterMarks()
                 throws DispositionReportFaultMessage {
                 long startTime = System.currentTimeMillis();
-
+                
                 List<ChangeRecordIDType> ret = new 
ArrayList<ChangeRecordIDType>();
 
                 //fetch from database the highest known watermark
                 ReplicationConfiguration FetchEdges = FetchEdges();
-
+                
                 EntityManager em = PersistenceManager.getEntityManager();
                 EntityTransaction tx = em.getTransaction();
                 HashMap<String, Long> map = new HashMap<String, Long>();
@@ -912,7 +957,7 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                                                                 //per the spec
                                                         }
                                                         map.put(nextNode, id);
-
+                                                        
                                                 }
                                         }
                                 }
@@ -927,21 +972,21 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                         x.setNodeID(node);
                         x.setOriginatingUSN(id);
                         ret.add(x);
-
+                        
                         tx.rollback();
                         long procTime = System.currentTimeMillis() - startTime;
                         
serviceCounter.update(ReplicationQuery.GET_HIGHWATERMARKS, QueryStatus.SUCCESS, 
procTime);
-
+                        
                 } catch (Exception drfm) {
                         throw new FatalErrorException(new 
ErrorMessage("E_fatalError", drfm.getMessage()));
-
+                        
                 } finally {
                         if (tx.isActive()) {
                                 tx.rollback();
                         }
                         em.close();
                 }
-
+                
                 Iterator<Map.Entry<String, Long>> iterator = 
map.entrySet().iterator();
                 while (iterator.hasNext()) {
                         Map.Entry<String, Long> next = iterator.next();
@@ -965,7 +1010,7 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                 //some other node just told us there's new records available, 
call
                 //getChangeRecords from the remote node asynch
                 new 
ValidateReplication(null).validateNotifyChangeRecordsAvailable(body, ctx);
-
+                
                 logger.info(body.getNotifyingNode() + " just told me that 
there are change records available, enqueuing...size is " + queue.size());
                 if (!queue.contains(body.getNotifyingNode())) {
                         queue.add(body.getNotifyingNode());
@@ -1019,9 +1064,9 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                         if (!ok) {
                                 throw new TransferNotAllowedException(new 
ErrorMessage("E_transferNotAllowedUnknownNode"));
                         }
-
+                        
                         new ValidateReplication(null).validateTransfer(em, 
body);
-
+                        
                         TransferEntities te = new TransferEntities();
                         te.setKeyBag(body.getKeyBag());
                         te.setTransferToken(body.getTransferToken());
@@ -1031,7 +1076,7 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                         //discard the token
                         logger.debug("request validated, processing transfer");
                         List<ChangeRecord> executeTransfer = new 
UDDICustodyTransferImpl().executeTransfer(te, em, 
body.getTransferOperationalInfo().getAuthorizedName(), 
body.getTransferOperationalInfo().getNodeID());
-
+                        
                         for (ChangeRecord c : executeTransfer) {
                                 try {
                                         c.setChangeID(new 
ChangeRecordIDType());
@@ -1096,5 +1141,5 @@ public class UDDIReplicationImpl extends 
AuthenticatedService implements UDDIRep
                         }
                 }
         }
-
+        
 }

http://git-wip-us.apache.org/repos/asf/juddi/blob/b2179ec4/juddi-core/src/main/java/org/apache/juddi/mapping/MappingApiToModel.java
----------------------------------------------------------------------
diff --git 
a/juddi-core/src/main/java/org/apache/juddi/mapping/MappingApiToModel.java 
b/juddi-core/src/main/java/org/apache/juddi/mapping/MappingApiToModel.java
index ab814d6..0648a02 100644
--- a/juddi-core/src/main/java/org/apache/juddi/mapping/MappingApiToModel.java
+++ b/juddi-core/src/main/java/org/apache/juddi/mapping/MappingApiToModel.java
@@ -149,7 +149,7 @@ public class MappingApiToModel {
                 mapBusinessSignature(apiBusinessEntity.getSignature(), 
modelBusinessEntity);
         }
 
-        private static List<Signature> 
mapApiSignaturesToModelSignatures(List<org.w3._2000._09.xmldsig_.SignatureType> 
apiSignatures)
+        public static List<Signature> 
mapApiSignaturesToModelSignatures(List<org.w3._2000._09.xmldsig_.SignatureType> 
apiSignatures)
                 throws DispositionReportFaultMessage {
                 List<Signature> modelSignatures = new ArrayList<Signature>();
                 modelSignatures.clear();
@@ -975,7 +975,9 @@ public class MappingApiToModel {
         }
 
         /**
-         *
+         * note that when using this, it does not reference the instance of the
+         * specific businesses, it will create new ones. be sure to overwrite 
them 
+         * with the correct references
          * @param apiPubAssertion
          * @param modelPubAssertion
          * @throws DispositionReportFaultMessage
@@ -1000,6 +1002,13 @@ public class MappingApiToModel {
                         modelPubAssertion.setKeyName(apiKeyedRef.getKeyName());
                         
modelPubAssertion.setKeyValue(apiKeyedRef.getKeyValue());
                 }
+                if (!apiPubAssertion.getSignature().isEmpty())
+                {
+                      /*  
modelPubAssertion.setSignatures(mapApiSignaturesToModelSignatures(apiPubAssertion.getSignature()));
+                        for (Signature s : modelPubAssertion.getSignatures())
+                                s.setPublisherAssertion(modelPubAssertion);
+                        */
+                }
         }
 
         /**

http://git-wip-us.apache.org/repos/asf/juddi/blob/b2179ec4/juddi-core/src/main/java/org/apache/juddi/mapping/MappingModelToApi.java
----------------------------------------------------------------------
diff --git 
a/juddi-core/src/main/java/org/apache/juddi/mapping/MappingModelToApi.java 
b/juddi-core/src/main/java/org/apache/juddi/mapping/MappingModelToApi.java
index 26e37aa..98d3ec9 100644
--- a/juddi-core/src/main/java/org/apache/juddi/mapping/MappingModelToApi.java
+++ b/juddi-core/src/main/java/org/apache/juddi/mapping/MappingModelToApi.java
@@ -60,6 +60,7 @@ import org.apache.juddi.model.KeyDataValue;
 import org.apache.juddi.model.Node;
 import org.apache.juddi.model.ReplicationConfiguration;
 import org.apache.juddi.model.ReplicationConfigurationNode;
+import org.apache.juddi.model.Signature;
 import org.apache.juddi.model.SignatureTransformDataValue;
 import org.apache.juddi.subscription.TypeConvertor;
 import org.apache.juddi.v3.error.ErrorMessage;
@@ -1017,7 +1018,13 @@ public class MappingModelToApi {
                 keyedRef.setKeyName(modelPublisherAssertion.getKeyName());
                 keyedRef.setKeyValue(modelPublisherAssertion.getKeyValue());
 
+               /* if (modelPublisherAssertion.getSignatures()!=null &&
+                        !modelPublisherAssertion.getSignatures().isEmpty())
+                {
+                        mapSignature(modelPublisherAssertion.getSignatures(), 
apiPublisherAssertion.getSignature());
+                }*/
                 apiPublisherAssertion.setKeyedReference(keyedRef);
+               
         }
 
         public static void 
mapAssertionStatusItem(org.apache.juddi.model.PublisherAssertion 
modelPublisherAssertion,

http://git-wip-us.apache.org/repos/asf/juddi/blob/b2179ec4/juddi-core/src/main/java/org/apache/juddi/model/BusinessEntity.java
----------------------------------------------------------------------
diff --git 
a/juddi-core/src/main/java/org/apache/juddi/model/BusinessEntity.java 
b/juddi-core/src/main/java/org/apache/juddi/model/BusinessEntity.java
index 794e1b5..83ab88a 100644
--- a/juddi-core/src/main/java/org/apache/juddi/model/BusinessEntity.java
+++ b/juddi-core/src/main/java/org/apache/juddi/model/BusinessEntity.java
@@ -46,7 +46,7 @@ public class BusinessEntity extends UddiEntity implements 
java.io.Serializable {
        private List<BusinessService> businessServices = new 
ArrayList<BusinessService>(0);
        private List<BusinessDescr> businessDescrs = new 
ArrayList<BusinessDescr>(0);
        private List<ServiceProjection> serviceProjections = new 
ArrayList<ServiceProjection>(0);
-    private List<Signature> signatures = new ArrayList<Signature>(0);
+        private List<Signature> signatures = new ArrayList<Signature>(0);
 
        public BusinessEntity() {
        }

http://git-wip-us.apache.org/repos/asf/juddi/blob/b2179ec4/juddi-core/src/main/java/org/apache/juddi/model/PublisherAssertion.java
----------------------------------------------------------------------
diff --git 
a/juddi-core/src/main/java/org/apache/juddi/model/PublisherAssertion.java 
b/juddi-core/src/main/java/org/apache/juddi/model/PublisherAssertion.java
index f0e1f03..3f9d592 100644
--- a/juddi-core/src/main/java/org/apache/juddi/model/PublisherAssertion.java
+++ b/juddi-core/src/main/java/org/apache/juddi/model/PublisherAssertion.java
@@ -15,15 +15,20 @@ package org.apache.juddi.model;
  * limitations under the License.
  */
 
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 import javax.persistence.AttributeOverride;
 import javax.persistence.AttributeOverrides;
+import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.EmbeddedId;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.OrderBy;
 import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
@@ -45,6 +50,7 @@ public class PublisherAssertion implements 
java.io.Serializable {
        private String fromCheck;
        private String toCheck;
        private Date modified;
+        private List<Signature> signatures = new ArrayList<Signature>(0);
 
        public PublisherAssertion() {
        }
@@ -163,4 +169,14 @@ public class PublisherAssertion implements 
java.io.Serializable {
                 PublisherAssertion rhs = (PublisherAssertion) compareto;
                 return (this.id.equals(rhs.id));
         }
+        
+        /*
+        @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+        public List<Signature> getSignatures() {
+                return signatures;
+        }
+
+        public void setSignatures(List<Signature> signatures) {
+                this.signatures = signatures;
+        }*/
 }

http://git-wip-us.apache.org/repos/asf/juddi/blob/b2179ec4/juddi-core/src/main/java/org/apache/juddi/model/Signature.java
----------------------------------------------------------------------
diff --git a/juddi-core/src/main/java/org/apache/juddi/model/Signature.java 
b/juddi-core/src/main/java/org/apache/juddi/model/Signature.java
index ecea539..3b36265 100644
--- a/juddi-core/src/main/java/org/apache/juddi/model/Signature.java
+++ b/juddi-core/src/main/java/org/apache/juddi/model/Signature.java
@@ -24,6 +24,7 @@ import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
 import javax.persistence.OrderBy;
@@ -49,6 +50,7 @@ public class Signature implements java.io.Serializable {
     private ReplicationConfiguration replConfig;
     private Tmodel tmodel;
     private String xmlID;
+    private PublisherAssertion assertion;
 
     @Id
     @GeneratedValue(strategy=GenerationType.AUTO)
@@ -69,6 +71,19 @@ public class Signature implements java.io.Serializable {
     public void setBindingTemplate(BindingTemplate bindingTemplate) {
         this.bindingTemplate = bindingTemplate;
     }
+    
+    /*@ManyToOne
+    @JoinColumns({  
+        @JoinColumn(name = "fromKey", nullable = true),
+        @JoinColumn(name = "toKey", nullable = true)
+        })
+    public PublisherAssertion getPublisherAssertion() {
+        return assertion;
+    }
+
+    public void setPublisherAssertion(PublisherAssertion item) {
+        this.assertion = item;
+    }*/
  
     
      @ManyToOne

http://git-wip-us.apache.org/repos/asf/juddi/blob/b2179ec4/juddi-core/src/main/java/org/apache/juddi/replication/ReplicationNotifier.java
----------------------------------------------------------------------
diff --git 
a/juddi-core/src/main/java/org/apache/juddi/replication/ReplicationNotifier.java
 
b/juddi-core/src/main/java/org/apache/juddi/replication/ReplicationNotifier.java
index 23a8845..8bd298c 100644
--- 
a/juddi-core/src/main/java/org/apache/juddi/replication/ReplicationNotifier.java
+++ 
b/juddi-core/src/main/java/org/apache/juddi/replication/ReplicationNotifier.java
@@ -111,7 +111,7 @@ public class ReplicationNotifier extends TimerTask {
                         tx.begin();
 
                         em.persist(j);
-                        log.debug("CR saved locally, it was from " + 
j.getNodeID()
+                        log.info("CR saved locally, it was from " + 
j.getNodeID()
                                 + " USN:" + j.getOriginatingUSN()
                                 + " Type:" + j.getRecordType().name()
                                 + " Key:" + j.getEntityKey()

http://git-wip-us.apache.org/repos/asf/juddi/blob/b2179ec4/uddi-tck/src/test/java/org/apache/juddi/v3/tck/JUDDI_300_MultiNodeIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/uddi-tck/src/test/java/org/apache/juddi/v3/tck/JUDDI_300_MultiNodeIntegrationTest.java
 
b/uddi-tck/src/test/java/org/apache/juddi/v3/tck/JUDDI_300_MultiNodeIntegrationTest.java
index 812d41b..177ba86 100644
--- 
a/uddi-tck/src/test/java/org/apache/juddi/v3/tck/JUDDI_300_MultiNodeIntegrationTest.java
+++ 
b/uddi-tck/src/test/java/org/apache/juddi/v3/tck/JUDDI_300_MultiNodeIntegrationTest.java
@@ -25,6 +25,7 @@ import org.junit.Assert;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.juddi.v3.client.UDDIConstants;
 import org.apache.juddi.v3.client.UDDIService;
 import org.apache.juddi.v3.client.config.UDDIClient;
 import org.apache.juddi.v3.client.transport.Transport;
@@ -35,20 +36,26 @@ import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.uddi.api_v3.AccessPoint;
+import org.uddi.api_v3.AddPublisherAssertions;
+import org.uddi.api_v3.AssertionStatusItem;
 import org.uddi.api_v3.BindingTemplate;
 import org.uddi.api_v3.BindingTemplates;
 import org.uddi.api_v3.BusinessDetail;
 import org.uddi.api_v3.BusinessEntity;
 import org.uddi.api_v3.BusinessService;
 import org.uddi.api_v3.BusinessServices;
+import org.uddi.api_v3.CompletionStatus;
 import org.uddi.api_v3.Contact;
+import org.uddi.api_v3.DeletePublisherAssertions;
 import org.uddi.api_v3.DeleteTModel;
 import org.uddi.api_v3.GetBusinessDetail;
 import org.uddi.api_v3.GetOperationalInfo;
 import org.uddi.api_v3.GetTModelDetail;
+import org.uddi.api_v3.KeyedReference;
 import org.uddi.api_v3.Name;
 import org.uddi.api_v3.OperationalInfos;
 import org.uddi.api_v3.PersonName;
+import org.uddi.api_v3.PublisherAssertion;
 import org.uddi.api_v3.SaveBusiness;
 import org.uddi.api_v3.TModel;
 import org.uddi.api_v3.TModelDetail;
@@ -457,16 +464,15 @@ public class JUDDI_300_MultiNodeIntegrationTest {
                         // TModel saveSamSyndicatorTmodel = 
samTModelNode2.saveSamSyndicatorTmodel(samTokenNode2);
                         BusinessEntity saveSamSyndicatorBusiness = 
samBizNode2.saveSamSyndicatorBusiness(samTokenNode2);
 
-                       // getReplicationStatus();//block until synched
-
+                        // getReplicationStatus();//block until synched
                         //confirm mary's tmodel is on the other node
                         GetTModelDetail findTModel = new GetTModelDetail();
                         findTModel.setAuthInfo(samTokenNode2);
                         
findTModel.getTModelKey().add(TckTModel.MARY_PUBLISHER_TMODEL_KEY);
                         TModelDetail tModelDetail = null;
-                        
-                         int timeout = TckPublisher.getSubscriptionTimeout();
-                        
+
+                        int timeout = TckPublisher.getSubscriptionTimeout();
+
                         while (timeout > 0) {
                                 logger.info("Waiting for the update...");
                                 try {
@@ -475,13 +481,13 @@ public class JUDDI_300_MultiNodeIntegrationTest {
                                 } catch (Exception ex) {
                                         logger.warn(ex.getMessage());
                                         tModelDetail = null;
-                                       
+
                                 }
                                 timeout--;
                                 Thread.sleep(1000);
 
                         }
-                        
+
                         Assert.assertNotNull(tModelDetail);
                         Assert.assertNotNull(tModelDetail.getTModel());
                         Assert.assertTrue(tModelDetail.getTModel().size() == 
1);
@@ -490,39 +496,169 @@ public class JUDDI_300_MultiNodeIntegrationTest {
                         GetBusinessDetail gbd = new GetBusinessDetail();
                         gbd.setAuthInfo(samTokenNode2);
                         
gbd.getBusinessKey().add(TckBusiness.MARY_BUSINESS_KEY);
-                        
+
                         //confirm mary's biz made it too
                         timeout = TckPublisher.getSubscriptionTimeout();
-                        BusinessDetail businessDetail =null;
+                        BusinessDetail businessDetail = null;
                         while (timeout > 0) {
                                 logger.info("Waiting for the update...");
                                 try {
-                                         businessDetail = 
inquirySam.getBusinessDetail(gbd);
+                                        businessDetail = 
inquirySam.getBusinessDetail(gbd);
                                         break;
                                 } catch (Exception ex) {
                                         logger.warn(ex.getMessage());
                                         businessDetail = null;
-                                       
+
                                 }
                                 timeout--;
                                 Thread.sleep(1000);
 
                         }
-                        
-                        
-                        
+                        logger.info("Business replicated");
                         Assert.assertNotNull(businessDetail);
                         
Assert.assertNotNull(businessDetail.getBusinessEntity());
                         
Assert.assertTrue(businessDetail.getBusinessEntity().get(0).getBusinessKey().equals(TckBusiness.MARY_BUSINESS_KEY));
 
+                        logger.info(">>> Saving a new publisher assertion on 
node 2 (sam)");
                         //setup a publisher assertion
+                        PublisherAssertion pa = new PublisherAssertion();
+                        pa.setFromKey(TckBusiness.SAM_BUSINESS_KEY);
+                        pa.setToKey(TckBusiness.MARY_BUSINESS_KEY);
+                        pa.setKeyedReference(new 
KeyedReference(UDDIConstants.RELATIONSHIPS, "parent-child", "child"));
+                        AddPublisherAssertions apa = new 
AddPublisherAssertions();
+                        apa.setAuthInfo(samTokenNode2);
+                        apa.getPublisherAssertion().add(pa);
+                        publishSam.addPublisherAssertions(apa);
+
+                        logger.info("Confirming that the assertion is saved on 
node2 (sam, origin)");
+                        List<AssertionStatusItem> assertionStatusReport = null;
+                        boolean found = false;
+                        assertionStatusReport = 
publishSam.getAssertionStatusReport(samTokenNode2, null);
+                        logger.info("Publisher assertions returned: " + 
assertionStatusReport.size());
+                        for (int x = 0; x < assertionStatusReport.size(); x++) 
{
+                                JAXB.marshal(assertionStatusReport.get(x), 
System.out);
+                                if 
(assertionStatusReport.get(x).getFromKey().equalsIgnoreCase(TckBusiness.SAM_BUSINESS_KEY)
+                                        && 
assertionStatusReport.get(x).getToKey().equalsIgnoreCase(TckBusiness.MARY_BUSINESS_KEY)
+                                        && 
assertionStatusReport.get(x).getKeyedReference().getTModelKey().equalsIgnoreCase(UDDIConstants.RELATIONSHIPS)
+                                        && 
assertionStatusReport.get(x).getKeyedReference().getKeyName().equalsIgnoreCase("parent-child")
+                                        && 
assertionStatusReport.get(x).getKeyedReference().getKeyValue().equalsIgnoreCase("child"))
 {
+                                        found = true;
+                                        break;
+                                }
+
+                        }
+                        Assert.assertTrue("Assertion not found on Sam's node 
(2)!!", found);
+                        logger.info("Ok it's saved.");
+                        //wait for synch
+                        timeout = TckPublisher.getSubscriptionTimeout();
+                        logger.info("confirming that the assertion made it to 
node 1");
+                        found = false;
+                        while (timeout > 0) {
+                                logger.info("Waiting for the update...");
+                                try {
+                                        assertionStatusReport = 
publishMary.getAssertionStatusReport(maryTokenNode1, null);
+                                        logger.info("Publisher assertions 
returned: " + assertionStatusReport.size());
+                                        for (int x = 0; x < 
assertionStatusReport.size(); x++) {
+                                                
JAXB.marshal(assertionStatusReport.get(x), System.out);
+                                                if 
(assertionStatusReport.get(x).getFromKey().equalsIgnoreCase(TckBusiness.SAM_BUSINESS_KEY)
+                                                        && 
assertionStatusReport.get(x).getToKey().equalsIgnoreCase(TckBusiness.MARY_BUSINESS_KEY)
+                                                        && 
assertionStatusReport.get(x).getKeyedReference().getTModelKey().equalsIgnoreCase(UDDIConstants.RELATIONSHIPS)
+                                                        && 
assertionStatusReport.get(x).getKeyedReference().getKeyName().equalsIgnoreCase("parent-child")
+                                                        && 
assertionStatusReport.get(x).getKeyedReference().getKeyValue().equalsIgnoreCase("child"))
 {
+                                                        found = true;
+                                                        break;
+                                                }
+
+                                        }
+                                        if (found) {
+                                                break;
+                                        }
+                                } catch (Exception ex) {
+                                        logger.warn(ex.getMessage());
+                                        Assert.fail("Unexpected failure " + 
ex.getMessage());
+
+                                }
+                                timeout--;
+                                Thread.sleep(1000);
+
+                        }
+                        Assert.assertTrue("Assertion wasn't replicated", 
found);
                         
+                        logger.info("Publisher Assertion replicated...");
+                        logger.info("confirming the pa is still on node 2 
origin (sam)");
+                        found = false;
+                        assertionStatusReport = 
publishSam.getAssertionStatusReport(samTokenNode2, null);
+                        logger.info("Publisher assertions returned: " + 
assertionStatusReport.size());
+                        for (int x = 0; x < assertionStatusReport.size(); x++) 
{
+                                JAXB.marshal(assertionStatusReport.get(x), 
System.out);
+                                if 
(assertionStatusReport.get(x).getFromKey().equalsIgnoreCase(TckBusiness.SAM_BUSINESS_KEY)
+                                        && 
assertionStatusReport.get(x).getToKey().equalsIgnoreCase(TckBusiness.MARY_BUSINESS_KEY)
+                                        && 
assertionStatusReport.get(x).getKeyedReference().getTModelKey().equalsIgnoreCase(UDDIConstants.RELATIONSHIPS)
+                                        && 
assertionStatusReport.get(x).getKeyedReference().getKeyName().equalsIgnoreCase("parent-child")
+                                        && 
assertionStatusReport.get(x).getKeyedReference().getKeyValue().equalsIgnoreCase("child"))
 {
+                                        found = true;
+                                        break;
+                                }
+
+                        }
+                        Assert.assertTrue("The PA is not found on node 
2(origin), very strange", found);
+                        
+                        //delete the pa
+                        DeletePublisherAssertions dpa = new 
DeletePublisherAssertions();
+                        dpa.setAuthInfo(samTokenNode2);
+                        dpa.getPublisherAssertion().add(pa);
+                        String sam = 
TckCommon.DumpAllBusinesses(samTokenNode2, inquirySam);
+                        String mary = 
TckCommon.DumpAllBusinesses(maryTokenNode1, inquiryMary);
+                        logger.info("Publisher Assertion deletion...");
+                        try {
+                                publishSam.deletePublisherAssertions(dpa);
+                        } catch (Exception ex) {
+                                ex.printStackTrace();
+                                logger.info("Sam's businesses " + sam);
+                                logger.info("Mary's businesses " + mary);
+                                Assert.fail("unable to delete the assertion on 
sam's node!");
+                        }
+                        //wait for synch
+                        timeout = TckPublisher.getSubscriptionTimeout();
+
+                        found = false;
+                        while (timeout > 0) {
+                                logger.info("Waiting for the update...");
+                                try {
+                                        assertionStatusReport = 
publishMary.getAssertionStatusReport(maryTokenNode1, null);
+                                        found = false;
+                                        for (int x = 0; x < 
assertionStatusReport.size(); x++) {
+                                                
JAXB.marshal(assertionStatusReport.get(x), System.out);
+                                                if 
(assertionStatusReport.get(x).getFromKey().equalsIgnoreCase(TckBusiness.SAM_BUSINESS_KEY)
+                                                        && 
assertionStatusReport.get(x).getToKey().equalsIgnoreCase(TckBusiness.MARY_BUSINESS_KEY)
+                                                        && 
assertionStatusReport.get(x).getKeyedReference().getTModelKey().equalsIgnoreCase(UDDIConstants.RELATIONSHIPS)
+                                                        && 
assertionStatusReport.get(x).getKeyedReference().getKeyName().equalsIgnoreCase("parent-child")
+                                                        && 
assertionStatusReport.get(x).getKeyedReference().getKeyValue().equalsIgnoreCase("child"))
 //still there
+                                                {
+                                                        found = true;
+                                                }
+
+                                        }
+                                        if (!found) {
+                                                break;
+                                        }
+                                } catch (Exception ex) {
+                                        logger.warn(ex.getMessage());
+                                        Assert.fail("Unexpected failure " + 
ex.getMessage());
+
+                                }
+                                timeout--;
+                                Thread.sleep(1000);
+
+                        }
+                        Assert.assertFalse("Assertion deletion wasn't 
replicated", found);
+                        logger.info("Publisher assertion deletion replicated");
                         //clean up
                         
maryBizNode1.deleteMaryPublisherBusiness(maryTokenNode1);
                         
maryTModelNode1.deleteMaryPublisherTmodel(maryTokenNode1);
 
                         //delete both
-                         timeout = TckPublisher.getSubscriptionTimeout();
+                        timeout = TckPublisher.getSubscriptionTimeout();
                         businessDetail = null;
                         while (timeout > 0) {
                                 logger.info("Waiting for the update...");
@@ -543,6 +679,7 @@ public class JUDDI_300_MultiNodeIntegrationTest {
                         if (businessDetail != null) {
                                 Assert.fail(TckBusiness.MARY_BUSINESS_KEY + " 
wasn't deleted on node 2");
                         }
+                        logger.info("Mary's business deletion was replicated");
 
                         tModelDetail = inquirySam.getTModelDetail(findTModel);
                         Assert.assertNotNull(tModelDetail);
@@ -550,14 +687,14 @@ public class JUDDI_300_MultiNodeIntegrationTest {
                         Assert.assertNotNull(tModelDetail.getTModel().get(0));
                         
Assert.assertEquals(tModelDetail.getTModel().get(0).getTModelKey(), 
TckTModel.MARY_PUBLISHER_TMODEL_KEY);
                         
Assert.assertEquals(tModelDetail.getTModel().get(0).isDeleted(), true);
+                        logger.info("Mary's tModel was deleted(hidden) 
replicated");
+                        // TckCommon.PrintMarker();
 
-                        TckCommon.PrintMarker();
-                       
                 } finally {
-                        
+
                         samBizNode2.deleteSamSyndicatorBusiness(samTokenNode2);
                         restTmodels();
-                        
+
                 }
                 //check node2 for a "hidden" tmodel should be accessible via 
getDetails
         }
@@ -634,7 +771,7 @@ public class JUDDI_300_MultiNodeIntegrationTest {
         }
 
         private void restTmodels() {
-               
+
                 logger.info("resting tmodels");
                 DeleteTModel dtm = new DeleteTModel();
                 dtm.setAuthInfo(rootNode1Token);


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

Reply via email to