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/23 03:09:33 UTC
juddi git commit: JUDDI-256 adding basic unit test for transfer
to/from publishers on the same node JUDDI-272 adding hooks for node to node
transfer
Repository: juddi
Updated Branches:
refs/heads/master 47d12803c -> 70903c270
JUDDI-256 adding basic unit test for transfer to/from publishers on the same node
JUDDI-272 adding hooks for node to node transfer
Project: http://git-wip-us.apache.org/repos/asf/juddi/repo
Commit: http://git-wip-us.apache.org/repos/asf/juddi/commit/70903c27
Tree: http://git-wip-us.apache.org/repos/asf/juddi/tree/70903c27
Diff: http://git-wip-us.apache.org/repos/asf/juddi/diff/70903c27
Branch: refs/heads/master
Commit: 70903c27054e1ebb8c064cc3a1afce9842c07cb5
Parents: 47d1280
Author: Alex <al...@apache.org>
Authored: Mon Dec 22 21:09:26 2014 -0500
Committer: Alex <al...@apache.org>
Committed: Mon Dec 22 21:09:26 2014 -0500
----------------------------------------------------------------------
.../juddi/api/impl/UDDICustodyTransferImpl.java | 260 ++++++++++++-------
.../juddi/api/impl/UDDIReplicationImpl.java | 153 ++++++++++-
.../apache/juddi/model/UddiEntityPublisher.java | 5 +-
.../juddi/replication/ReplicationNotifier.java | 2 -
.../validation/ValidateCustodyTransfer.java | 23 +-
.../juddi/validation/ValidateReplication.java | 30 +++
.../src/main/resources/messages.properties | 1 +
.../api/impl/API_170_CustodyTransferTest.java | 129 +++++++++
8 files changed, 480 insertions(+), 123 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/juddi/blob/70903c27/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 2bb21f2..2c5d295 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
@@ -16,7 +16,9 @@
*/
package org.apache.juddi.api.impl;
+import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
+import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.UUID;
@@ -31,6 +33,7 @@ import javax.persistence.Query;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
+import javax.xml.ws.BindingProvider;
import javax.xml.ws.Holder;
import org.apache.commons.configuration.ConfigurationException;
@@ -38,18 +41,22 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.juddi.api.util.CustodyTransferQuery;
import org.apache.juddi.api.util.QueryStatus;
-import org.apache.juddi.api.util.ValueSetValidationQuery;
import org.apache.juddi.config.AppConfig;
import org.apache.juddi.config.PersistenceManager;
import org.apache.juddi.config.Property;
+import org.apache.juddi.mapping.MappingApiToModel;
+import org.apache.juddi.mapping.MappingModelToApi;
import org.apache.juddi.model.BindingTemplate;
import org.apache.juddi.model.BusinessEntity;
import org.apache.juddi.model.BusinessService;
+import org.apache.juddi.model.Operator;
+import org.apache.juddi.model.Tmodel;
import org.apache.juddi.model.TransferTokenKey;
import org.apache.juddi.model.UddiEntity;
import org.apache.juddi.model.UddiEntityPublisher;
import org.apache.juddi.query.util.DynamicQuery;
import org.apache.juddi.replication.ReplicationNotifier;
+import org.apache.juddi.v3.client.UDDIService;
import org.apache.juddi.v3.error.ErrorMessage;
import org.apache.juddi.v3.error.FatalErrorException;
import org.apache.juddi.validation.ValidateCustodyTransfer;
@@ -57,16 +64,22 @@ import org.uddi.api_v3.OperationalInfo;
import org.uddi.custody_v3.DiscardTransferToken;
import org.uddi.custody_v3.KeyBag;
import org.uddi.custody_v3.TransferEntities;
+import org.uddi.custody_v3.TransferOperationalInfo;
+import org.uddi.repl_v3.ChangeRecord;
+import org.uddi.repl_v3.ChangeRecordIDType;
+import org.uddi.repl_v3.ChangeRecordNewData;
+import org.uddi.repl_v3.TransferCustody;
import org.uddi.v3_service.DispositionReportFaultMessage;
import org.uddi.v3_service.UDDICustodyTransferPortType;
+import org.uddi.v3_service.UDDIReplicationPortType;
/**
* This implements the UDDI v3 Custody Transfer API web service
*
*/
@WebService(serviceName = "UDDICustodyTransferService",
- endpointInterface = "org.uddi.v3_service.UDDICustodyTransferPortType",
- targetNamespace = "urn:uddi-org:v3_service")
+ endpointInterface = "org.uddi.v3_service.UDDICustodyTransferPortType",
+ targetNamespace = "urn:uddi-org:v3_service")
public class UDDICustodyTransferImpl extends AuthenticatedService implements UDDICustodyTransferPortType {
public static final String TRANSFER_TOKEN_PREFIX = "transfertoken:";
@@ -77,7 +90,7 @@ public class UDDICustodyTransferImpl extends AuthenticatedService implements UDD
private static DatatypeFactory df = null;
private UDDIServiceCounter serviceCounter;
- public UDDICustodyTransferImpl() {
+ public UDDICustodyTransferImpl() {
super();
serviceCounter = ServiceCounterLifecycleResource.getServiceCounter(this.getClass());
if (df == null) {
@@ -90,8 +103,9 @@ public class UDDICustodyTransferImpl extends AuthenticatedService implements UDD
}
@SuppressWarnings("unchecked")
+ @Override
public void discardTransferToken(DiscardTransferToken body)
- throws DispositionReportFaultMessage {
+ throws DispositionReportFaultMessage {
long startTime = System.currentTimeMillis();
EntityManager em = PersistenceManager.getEntityManager();
@@ -119,8 +133,8 @@ public class UDDICustodyTransferImpl extends AuthenticatedService implements UDD
for (String key : keyList) {
// Creating parameters for key-checking query
DynamicQuery.Parameter param = new DynamicQuery.Parameter("UPPER(ttk.entityKey)",
- key.toUpperCase(),
- DynamicQuery.PREDICATE_EQUALS);
+ key.toUpperCase(),
+ DynamicQuery.PREDICATE_EQUALS);
params.add(param);
}
@@ -142,7 +156,7 @@ public class UDDICustodyTransferImpl extends AuthenticatedService implements UDD
tx.commit();
long procTime = System.currentTimeMillis() - startTime;
serviceCounter.update(CustodyTransferQuery.DISCARD_TRANSFERTOKEN,
- QueryStatus.SUCCESS, procTime);
+ QueryStatus.SUCCESS, procTime);
} finally {
if (tx.isActive()) {
@@ -152,9 +166,10 @@ public class UDDICustodyTransferImpl extends AuthenticatedService implements UDD
}
}
+ @Override
public void getTransferToken(String authInfo, KeyBag keyBag,
- Holder<String> nodeID, Holder<XMLGregorianCalendar> expirationTime,
- Holder<byte[]> opaqueToken) throws DispositionReportFaultMessage {
+ Holder<String> nodeID, Holder<XMLGregorianCalendar> expirationTime,
+ Holder<byte[]> opaqueToken) throws DispositionReportFaultMessage {
long startTime = System.currentTimeMillis();
EntityManager em = PersistenceManager.getEntityManager();
@@ -206,7 +221,7 @@ public class UDDICustodyTransferImpl extends AuthenticatedService implements UDD
long procTime = System.currentTimeMillis() - startTime;
serviceCounter.update(CustodyTransferQuery.GET_TRANSFERTOKEN,
- QueryStatus.SUCCESS, procTime);
+ QueryStatus.SUCCESS, procTime);
} finally {
if (tx.isActive()) {
@@ -216,111 +231,124 @@ public class UDDICustodyTransferImpl extends AuthenticatedService implements UDD
}
}
+ @Override
public void transferEntities(TransferEntities body)
- throws DispositionReportFaultMessage {
+ throws DispositionReportFaultMessage {
long startTime = System.currentTimeMillis();
EntityManager em = PersistenceManager.getEntityManager();
EntityTransaction tx = em.getTransaction();
+ List<ChangeRecord> changes = new ArrayList<ChangeRecord>();
try {
tx.begin();
UddiEntityPublisher publisher = this.getEntityPublisher(em, body.getAuthInfo());
- new ValidateCustodyTransfer(publisher).validateTransferEntities(em, body);
-
- // Once validated, the ownership transfer is as simple as switching the publisher
- KeyBag keyBag = body.getKeyBag();
- List<String> keyList = keyBag.getKey();
- //used for the change journal
- List<OperationalInfo> op_info = new ArrayList<OperationalInfo>();
- for (String key : keyList) {
- UddiEntity uddiEntity = em.find(UddiEntity.class, key);
- uddiEntity.setAuthorizedName(publisher.getAuthorizedName());
- OperationalInfo o = new OperationalInfo();
- o.setAuthorizedName(publisher.getAuthorizedName());
-
- GregorianCalendar gcal = new GregorianCalendar();
- gcal.setTime(uddiEntity.getCreated());
- o.setCreated(df.newXMLGregorianCalendar(gcal));
-
- o.setEntityKey(uddiEntity.getEntityKey());
-
- gcal = new GregorianCalendar();
- gcal.setTime(uddiEntity.getModified());
- o.setModified(df.newXMLGregorianCalendar(gcal));
-
- gcal = new GregorianCalendar();
- gcal.setTime(uddiEntity.getModifiedIncludingChildren());
- o.setModifiedIncludingChildren(df.newXMLGregorianCalendar(gcal));
- o.setNodeID(uddiEntity.getNodeId());
- op_info.add(o);
-
- if (uddiEntity instanceof BusinessEntity) {
- BusinessEntity be = (BusinessEntity) uddiEntity;
-
- List<BusinessService> bsList = be.getBusinessServices();
- for (BusinessService bs : bsList) {
- bs.setAuthorizedName(publisher.getAuthorizedName());
- OperationalInfo o2 = new OperationalInfo();
- o2.setAuthorizedName(bs.getAuthorizedName());
-
- gcal = new GregorianCalendar();
- gcal.setTime(bs.getCreated());
- o2.setCreated(df.newXMLGregorianCalendar(gcal));
-
- o2.setEntityKey(bs.getEntityKey());
-
- gcal = new GregorianCalendar();
- gcal.setTime(bs.getModified());
- o2.setModified(df.newXMLGregorianCalendar(gcal));
-
- gcal = new GregorianCalendar();
- gcal.setTime(bs.getModifiedIncludingChildren());
- o2.setModifiedIncludingChildren(df.newXMLGregorianCalendar(gcal));
- o2.setNodeID(bs.getNodeId());
- op_info.add(o2);
-
- List<BindingTemplate> btList = bs.getBindingTemplates();
- for (BindingTemplate bt : btList) {
- bt.setAuthorizedName(publisher.getAuthorizedName());
- OperationalInfo o3 = new OperationalInfo();
- o3.setAuthorizedName(bt.getAuthorizedName());
-
- gcal = new GregorianCalendar();
- gcal.setTime(bt.getCreated());
- o3.setCreated(df.newXMLGregorianCalendar(gcal));
-
- o3.setEntityKey(bt.getEntityKey());
-
- gcal = new GregorianCalendar();
- gcal.setTime(bt.getModified());
- o3.setModified(df.newXMLGregorianCalendar(gcal));
-
- gcal = new GregorianCalendar();
- gcal.setTime(bt.getModifiedIncludingChildren());
- o3.setModifiedIncludingChildren(df.newXMLGregorianCalendar(gcal));
- o3.setNodeID(bt.getNodeId());
- op_info.add(o3);
+ ValidateCustodyTransfer verifier = new ValidateCustodyTransfer(publisher);
+
+ //if the destination transfer is to a different node,
+ if (!verifier.validateTransferEntities(em, body)) {
+ //i don't own these entities, so tell the ower to transfer to me.
+
+ //look up the replication config endpoint for that node and trigger the transfer, then return
+ //ok this is a node to node transfer, first up a replication client to the destination node
+ String sourceNode = null;
+ try {
+ KeyBag keyBag = body.getKeyBag();
+ List<String> keyList = keyBag.getKey();
+ for (String key : keyList) {
+ UddiEntity uddiEntity = em.find(UddiEntity.class, key);
+ if (sourceNode != null
+ && !uddiEntity.getNodeId().equals(sourceNode)) {
+ throw new Exception("All entities to be transfer must be transfered to the same source and destination node");
}
+ sourceNode = uddiEntity.getNodeId();
}
+
+ UDDIReplicationPortType replicationClient = getReplicationClient(sourceNode);
+ if (replicationClient == null) {
+ throw new Exception("Unknown node. is it in the replication graph?" + sourceNode);
+ }
+ TransferCustody transferCustody = new TransferCustody();
+ transferCustody.setTransferToken(body.getTransferToken());
+ transferCustody.setKeyBag(body.getKeyBag());
+ transferCustody.setTransferOperationalInfo(new TransferOperationalInfo());
+ transferCustody.getTransferOperationalInfo().setAuthorizedName(publisher.getAuthorizedName());
+ transferCustody.getTransferOperationalInfo().setNodeID(node);
+
+ replicationClient.transferCustody(transferCustody);
+ } catch (Exception ex) {
+ logger.error("Unable to transfer entities to node " + sourceNode + ".", ex);
}
- }
+ //and trigger the transfer
+ } else {
- // After transfer is finished, the token can be removed
- org.uddi.custody_v3.TransferToken apiTransferToken = body.getTransferToken();
- String transferTokenId = new String(apiTransferToken.getOpaqueToken());
- org.apache.juddi.model.TransferToken modelTransferToken = em.find(org.apache.juddi.model.TransferToken.class, transferTokenId);
- em.remove(modelTransferToken);
+ // Once validated, the ownership transfer is as simple as switching the publisher
+ KeyBag keyBag = body.getKeyBag();
+ List<String> keyList = keyBag.getKey();
+ //used for the change journal
+
+ for (String key : keyList) {
+ UddiEntity uddiEntity = em.find(UddiEntity.class, key);
+ uddiEntity.setAuthorizedName(publisher.getAuthorizedName());
+ Date now = new Date();
+ uddiEntity.setModified(now);
+ uddiEntity.setModifiedIncludingChildren(now);
+
+ if (uddiEntity instanceof BusinessEntity) {
+ BusinessEntity be = (BusinessEntity) uddiEntity;
+
+ List<BusinessService> bsList = be.getBusinessServices();
+ for (BusinessService bs : bsList) {
+ bs.setAuthorizedName(publisher.getAuthorizedName());
+ bs.setModified(now);
+ bs.setModifiedIncludingChildren(now);
+
+ List<BindingTemplate> btList = bs.getBindingTemplates();
+ for (BindingTemplate bt : btList) {
+ bt.setAuthorizedName(publisher.getAuthorizedName());
+ bt.setModified(now);
+ bt.setModifiedIncludingChildren(now);
+
+ }
+ }
+ }
+ ChangeRecord cr = new ChangeRecord();
+ cr.setChangeRecordNewData(new ChangeRecordNewData());
+ if (uddiEntity instanceof BusinessEntity) {
+ cr.getChangeRecordNewData().setBusinessEntity(new org.uddi.api_v3.BusinessEntity());
+ MappingModelToApi.mapBusinessEntity((BusinessEntity) uddiEntity, cr.getChangeRecordNewData().getBusinessEntity());
+ }
+ if (uddiEntity instanceof Tmodel) {
+ cr.getChangeRecordNewData().setTModel(new org.uddi.api_v3.TModel());
+ MappingModelToApi.mapTModel((Tmodel) uddiEntity, cr.getChangeRecordNewData().getTModel());
+ }
+ changes.add(cr);
+ em.persist(uddiEntity);
+
+ }
+ // After transfer is finished, the token can be removed
+ org.uddi.custody_v3.TransferToken apiTransferToken = body.getTransferToken();
+ String transferTokenId = new String(apiTransferToken.getOpaqueToken());
+ org.apache.juddi.model.TransferToken modelTransferToken = em.find(org.apache.juddi.model.TransferToken.class, transferTokenId);
+ em.remove(modelTransferToken);
+ }
tx.commit();
- //TODO do we need to do something for replication purposes here?
- //OperationalInfoWrapper t = new OperationalInfoWrapper();
- //t.data = op_info;
- //ReplicationNotifier.Enqueue(UDDIPublicationImpl.);
+ //we need to do something for replication purposes here
+ //enqueue notifications and storage of the changed records
+ for (ChangeRecord c: changes)
+ try {
+ c.setChangeID(new ChangeRecordIDType());
+ c.getChangeID().setNodeID(node);
+ c.getChangeID().setOriginatingUSN(null);
+ ReplicationNotifier.Enqueue(MappingApiToModel.mapChangeRecord(c));
+ } catch (UnsupportedEncodingException ex) {
+ Logger.getLogger(UDDICustodyTransferImpl.class.getName()).log(Level.SEVERE, null, ex);
+ }
long procTime = System.currentTimeMillis() - startTime;
serviceCounter.update(CustodyTransferQuery.TRANSFER_ENTITIES,
- QueryStatus.SUCCESS, procTime);
+ QueryStatus.SUCCESS, procTime);
} finally {
if (tx.isActive()) {
@@ -331,8 +359,40 @@ public class UDDICustodyTransferImpl extends AuthenticatedService implements UDD
}
- public class OperationalInfoWrapper {
+ private synchronized UDDIReplicationPortType getReplicationClient(String node) {
+
+ UDDIService svc = new UDDIService();
+ UDDIReplicationPortType replicationClient = svc.getUDDIReplicationPort();
+
+ EntityManager em = PersistenceManager.getEntityManager();
+ EntityTransaction tx = em.getTransaction();
+ try {
+ StringBuilder sql = new StringBuilder();
+ sql.append("select c from ReplicationConfiguration c order by c.serialNumber desc");
+ 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)) {
+ ((BindingProvider) replicationClient).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, o.getSoapReplicationURL());
+
+ return replicationClient;
+ }
+ }
+ tx.rollback();
+
+ } catch (Exception ex) {
+ logger.fatal("Node not found (or there isn't a replication config)!" + node, ex);
+ } finally {
+ if (tx.isActive()) {
+ tx.rollback();
+ }
+ em.close();
+ }
+ //em.close();
+ return null;
- public List<OperationalInfo> data;
}
}
http://git-wip-us.apache.org/repos/asf/juddi/blob/70903c27/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 ee48bd5..af3a46b 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
@@ -54,14 +54,18 @@ import org.apache.juddi.model.Operator;
import org.apache.juddi.model.PublisherAssertion;
import org.apache.juddi.model.PublisherAssertionId;
import org.apache.juddi.model.Tmodel;
+import org.apache.juddi.replication.ReplicationNotifier;
import static org.apache.juddi.replication.ReplicationNotifier.FetchEdges;
import org.apache.juddi.v3.client.UDDIService;
import org.apache.juddi.v3.error.ErrorMessage;
import org.apache.juddi.v3.error.FatalErrorException;
+import org.apache.juddi.v3.error.TransferNotAllowedException;
+import org.apache.juddi.validation.ValidateCustodyTransfer;
import org.apache.juddi.validation.ValidateReplication;
import org.uddi.api_v3.OperationalInfo;
import org.uddi.custody_v3.DiscardTransferToken;
import org.uddi.repl_v3.ChangeRecord;
+import org.uddi.repl_v3.ChangeRecordAcknowledgement;
import org.uddi.repl_v3.ChangeRecordIDType;
import org.uddi.repl_v3.ChangeRecords;
import org.uddi.repl_v3.DoPing;
@@ -218,8 +222,9 @@ public class UDDIReplicationImpl extends AuthenticatedService implements UDDIRep
@Override
public void run() {
- if (!queue.isEmpty())
+ if (!queue.isEmpty()) {
logger.info("Replication change puller thread started. Queue size: " + queue.size());
+ }
//ok someone told me there's a change available
while (!queue.isEmpty()) {
NotifyChangeRecordsAvailable poll = queue.poll();
@@ -469,12 +474,105 @@ public class UDDIReplicationImpl extends AuthenticatedService implements UDDIRep
}
//</editor-fold>
+
+ if (rec.isAcknowledgementRequested()) {
+ ChangeRecord posack = new ChangeRecord();
+ posack.setChangeRecordAcknowledgement(new ChangeRecordAcknowledgement());
+ posack.getChangeRecordAcknowledgement().setAcknowledgedChange(rec.getChangeID());
+ posack.setAcknowledgementRequested(false);
+ ReplicationNotifier.Enqueue(MappingApiToModel.mapChangeRecord(posack));
+ }
if (rec.getChangeRecordNewDataConditional() != null) {
- //TODO
+
+ if (rec.getChangeRecordNewDataConditional().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.getChangeRecordNewDataConditional().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.getChangeRecordNewDataConditional().getChangeRecordNewData().getBindingTemplate() != null) {
+ //fetch the binding template if it exists already
+ //if it exists,
+ // confirm the owning node, it shouldn't be the local node id, if it is, throw
+ // the owning node should be the same as it was before
+
+ BusinessService model = em.find(org.apache.juddi.model.BusinessService.class, rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getBindingTemplate().getServiceKey());
+ 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) {
+ em.remove(bt);
+ }
+ bt = new BindingTemplate();
+ MappingApiToModel.mapBindingTemplate(rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getBindingTemplate(), bt, model);
+ MappingApiToModel.mapOperationalInfo(bt, rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getOperationalInfo());
+ // 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());
+ //TODO revisit access control rules
+ em.remove(model);
+ }
+ model = new BusinessEntity();
+ MappingApiToModel.mapBusinessEntity(rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getBusinessEntity(), model);
+ // MappingApiToModel.mapOperationalInfo(model, rec.getChangeRecordNewDataConditional().getChangeRecordNewData().getOperationalInfo());
+
+ 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());
+ 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());
+ 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) {
- //TODO
+ //No action required
}
if (rec.getChangeRecordCorrection() != null) {
@@ -832,23 +930,30 @@ public class UDDIReplicationImpl extends AuthenticatedService implements UDDIRep
public void notifyChangeRecordsAvailable(NotifyChangeRecordsAvailable body)
throws DispositionReportFaultMessage {
long startTime = System.currentTimeMillis();
- long procTime = System.currentTimeMillis() - startTime;
- serviceCounter.update(ReplicationQuery.NOTIFY_CHANGERECORDSAVAILABLE,
- QueryStatus.SUCCESS, procTime);
+
//some other node just told us there's new records available, call
//getChangeRecords from the remote node asynch
-
new ValidateReplication(null).validateNotifyChangeRecordsAvailable(body, ctx);
queue.add(body);
logger.info(body.getNotifyingNode() + " just told me that there are change records available, enqueuing...size is " + queue.size());
//ValidateReplication.unsupportedAPICall();
+ long procTime = System.currentTimeMillis() - startTime;
+ serviceCounter.update(ReplicationQuery.NOTIFY_CHANGERECORDSAVAILABLE,
+ QueryStatus.SUCCESS, procTime);
}
private static Queue<NotifyChangeRecordsAvailable> queue = null;
/**
* transfers custody of an entity from node1/user1 to node2/user2
- *
+ *
+ * assume this node is node 2.
+ *
+ * user1 on node1 requests a transfer token. node 1 issues the token.
+ *
+ * user1 now has a transfer token for their stuff
+ * user now takes the token to node 2 and calls transferEntities
+ *<img src="http://www.uddi.org/pubs/uddi-v3.0.2-20041019_files/image086.gif">
* @param body
* @throws DispositionReportFaultMessage
*/
@@ -858,12 +963,35 @@ public class UDDIReplicationImpl extends AuthenticatedService implements UDDIRep
long startTime = System.currentTimeMillis();
//*this node is transfering data to another node
- //body.getTransferOperationalInfo().
- ValidateReplication.unsupportedAPICall();
+ //ValidateReplication.unsupportedAPICall();
+ //a remote node just told me to give up control of some of my entities
EntityManager em = PersistenceManager.getEntityManager();
//EntityTransaction tx = em.getTransaction();
-
+ //confirm i have a replication config
+ boolean ok =false;
+ ReplicationConfiguration FetchEdges = ReplicationNotifier.FetchEdges();
+ for (int i=0; i<FetchEdges.getOperator().size(); i++){
+ //confirm that the destination node is in the replication config
+ if (FetchEdges.getOperator().get(i).getOperatorNodeID().equals(body.getTransferOperationalInfo().getNodeID()))
+ {
+ ok = true;
+ break;
+ }
+ }
+ if (!ok){
+ throw new TransferNotAllowedException(new ErrorMessage("E_transferNotAllowedUnknownNode"));
+ }
+
+
+
+ new ValidateReplication(null).validateTransfer(em,body);
+
+
+ //make the change
+ //enqueue in replication notifier
+ //discard the token
+
/**
* The custodial node must verify that it has granted permission
* to transfer the entities identified and that this permission
@@ -903,6 +1031,9 @@ public class UDDIReplicationImpl extends AuthenticatedService implements UDDIRep
dtt.setKeyBag(body.getKeyBag());
dtt.setTransferToken(body.getTransferToken());
new UDDICustodyTransferImpl().discardTransferToken(dtt);
+ long procTime = System.currentTimeMillis() - startTime;
+ serviceCounter.update(ReplicationQuery.TRANSFER_CUSTODY,
+ QueryStatus.SUCCESS, procTime);
}
}
http://git-wip-us.apache.org/repos/asf/juddi/blob/70903c27/juddi-core/src/main/java/org/apache/juddi/model/UddiEntityPublisher.java
----------------------------------------------------------------------
diff --git a/juddi-core/src/main/java/org/apache/juddi/model/UddiEntityPublisher.java b/juddi-core/src/main/java/org/apache/juddi/model/UddiEntityPublisher.java
index 255ed5f..20c9aed 100644
--- a/juddi-core/src/main/java/org/apache/juddi/model/UddiEntityPublisher.java
+++ b/juddi-core/src/main/java/org/apache/juddi/model/UddiEntityPublisher.java
@@ -97,20 +97,19 @@ public class UddiEntityPublisher {
* @return true/false
*/
public boolean isOwner(UddiEntity entity){
- boolean ret = false;
try {
AppConfig instance = AppConfig.getInstance();
if (entity != null) {
if (entity.getAuthorizedName().equals(getAuthorizedName())
&& entity.getNodeId().equals((AppConfig.getConfiguration().getString(Property.JUDDI_NODE_ID)))) {
- ret = true;
+ return true;
}
}
} catch (Exception ex) {
logger.log(Level.WARNING, "Error caught determining node id! Defaulting to access denied", ex);
}
- return ret;
+ return false;
}
http://git-wip-us.apache.org/repos/asf/juddi/blob/70903c27/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 b724ae5..9af0093 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
@@ -17,7 +17,6 @@
package org.apache.juddi.replication;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
import java.util.Queue;
import java.util.Timer;
@@ -40,7 +39,6 @@ import org.apache.juddi.model.ChangeRecord;
import org.apache.juddi.model.ReplicationConfiguration;
import org.apache.juddi.v3.client.UDDIService;
import org.uddi.repl_v3.ChangeRecordIDType;
-import org.uddi.repl_v3.CommunicationGraph;
import org.uddi.repl_v3.HighWaterMarkVectorType;
import org.uddi.repl_v3.NotifyChangeRecordsAvailable;
import org.uddi.repl_v3.Operator;
http://git-wip-us.apache.org/repos/asf/juddi/blob/70903c27/juddi-core/src/main/java/org/apache/juddi/validation/ValidateCustodyTransfer.java
----------------------------------------------------------------------
diff --git a/juddi-core/src/main/java/org/apache/juddi/validation/ValidateCustodyTransfer.java b/juddi-core/src/main/java/org/apache/juddi/validation/ValidateCustodyTransfer.java
index 4b399ff..14b6d56 100644
--- a/juddi-core/src/main/java/org/apache/juddi/validation/ValidateCustodyTransfer.java
+++ b/juddi-core/src/main/java/org/apache/juddi/validation/ValidateCustodyTransfer.java
@@ -123,9 +123,9 @@ public class ValidateCustodyTransfer extends ValidateUDDIApi {
throw new UserMismatchException(new ErrorMessage("errors.usermismatch.InvalidOwner", key));
// Creating parameters for key-checking query
- DynamicQuery.Parameter param = new DynamicQuery.Parameter("UPPER(ttk.entityKey)",
- key.toUpperCase(),
- DynamicQuery.PREDICATE_EQUALS);
+ DynamicQuery.Parameter param = new DynamicQuery.Parameter("UPPER(ttk.entityKey)",
+ key.toUpperCase(),
+ DynamicQuery.PREDICATE_EQUALS);
params.add(param);
}
@@ -142,8 +142,16 @@ public class ValidateCustodyTransfer extends ValidateUDDIApi {
}
- public void validateTransferEntities(EntityManager em, TransferEntities body) throws DispositionReportFaultMessage {
-
+ /**
+ * returns true if all items to be transfered are within this node (no node to node transfers)
+ * @param em
+ * @param body
+ * @return
+ * @throws DispositionReportFaultMessage
+ */
+ public boolean validateTransferEntities(EntityManager em, TransferEntities body) throws DispositionReportFaultMessage {
+
+ boolean ret = true;
// No null input
if (body == null)
throw new FatalErrorException(new ErrorMessage("errors.NullInput"));
@@ -193,10 +201,11 @@ public class ValidateCustodyTransfer extends ValidateUDDIApi {
UddiEntity uddiEntity = em.find(UddiEntity.class, key);
if (uddiEntity == null)
throw new InvalidKeyPassedException(new ErrorMessage("errors.invalidkey.EntityNotFound", key));
-
+ if (!uddiEntity.getNodeId().equalsIgnoreCase(nodeID))
+ ret = false;
count++;
}
+ return ret;
}
-
}
http://git-wip-us.apache.org/repos/asf/juddi/blob/70903c27/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 df5a436..717b691 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
@@ -26,11 +26,13 @@ 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.v3.error.ValueNotAllowedException;
+import org.uddi.custody_v3.TransferEntities;
import org.uddi.repl_v3.CommunicationGraph.Edge;
import org.uddi.repl_v3.HighWaterMarkVectorType;
import org.uddi.repl_v3.NotifyChangeRecordsAvailable;
import org.uddi.repl_v3.Operator;
import org.uddi.repl_v3.ReplicationConfiguration;
+import org.uddi.repl_v3.TransferCustody;
import org.uddi.v3_service.DispositionReportFaultMessage;
/**
@@ -177,4 +179,32 @@ public class ValidateReplication extends ValidateUDDIApi {
return false;
}
+ public void validateTransfer(EntityManager em, TransferCustody body) throws DispositionReportFaultMessage {
+
+ if (body == null)
+ throw new FatalErrorException(new ErrorMessage("errors.NullInput"));
+ if (body.getTransferToken()==null)
+ throw new FatalErrorException(new ErrorMessage("errors.NullInput"));
+ if (body.getKeyBag()==null)
+ throw new FatalErrorException(new ErrorMessage("errors.NullInput"));
+ if (body.getTransferOperationalInfo()==null)
+ throw new FatalErrorException(new ErrorMessage("errors.NullInput"));
+
+ if (body.getTransferOperationalInfo().getNodeID()==null)
+ throw new FatalErrorException(new ErrorMessage("errors.NullInput"));
+ if (body.getTransferOperationalInfo().getAuthorizedName()==null)
+ throw new FatalErrorException(new ErrorMessage("errors.NullInput"));
+
+
+ //confirm i own the records in question
+ //confirm i issued the transfer token
+
+ TransferEntities x = new TransferEntities();
+ x.setKeyBag(body.getKeyBag());
+ x.setTransferToken(body.getTransferToken());
+ new ValidateCustodyTransfer(null).validateTransferEntities(em, x);
+
+
+ }
+
}
http://git-wip-us.apache.org/repos/asf/juddi/blob/70903c27/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 3428580..bf11ed7 100644
--- a/juddi-core/src/main/resources/messages.properties
+++ b/juddi-core/src/main/resources/messages.properties
@@ -52,6 +52,7 @@ E_tokenAlreadyExists=Key already exists in transfer request
E_tooManyOptions=Too many options
E_transferAborted=Transfer Aborted
E_transferNotAllowed=The transfer request is not allowed
+E_transferNotAllowedUnknownNode=The transfer request is not allowed because the destination node is not in the replication config.
E_unknownUser=The user ID and password pair passed in a get_authToken API is not known to the UDDI node or is not valid.
E_unrecognizedVersion=The value of the namespace attribute is unsupported by the node being queried.
E_unsupported=Unsupported feature or API.
http://git-wip-us.apache.org/repos/asf/juddi/blob/70903c27/juddi-core/src/test/java/org/apache/juddi/api/impl/API_170_CustodyTransferTest.java
----------------------------------------------------------------------
diff --git a/juddi-core/src/test/java/org/apache/juddi/api/impl/API_170_CustodyTransferTest.java b/juddi-core/src/test/java/org/apache/juddi/api/impl/API_170_CustodyTransferTest.java
new file mode 100644
index 0000000..75dbdb2
--- /dev/null
+++ b/juddi-core/src/test/java/org/apache/juddi/api/impl/API_170_CustodyTransferTest.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2014 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.juddi.api.impl;
+
+import java.rmi.RemoteException;
+import javax.xml.datatype.XMLGregorianCalendar;
+import javax.xml.ws.Holder;
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.juddi.Registry;
+import org.apache.juddi.v3.tck.TckBusiness;
+import org.apache.juddi.v3.tck.TckFindEntity;
+import org.apache.juddi.v3.tck.TckPublisher;
+import org.apache.juddi.v3.tck.TckSecurity;
+import org.apache.juddi.v3.tck.TckTModel;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.uddi.api_v3.BusinessDetail;
+import org.uddi.api_v3.GetBusinessDetail;
+import org.uddi.api_v3.GetOperationalInfo;
+import org.uddi.api_v3.OperationalInfos;
+import org.uddi.custody_v3.KeyBag;
+import org.uddi.custody_v3.TransferEntities;
+import org.uddi.custody_v3.TransferToken;
+import org.uddi.v3_service.UDDISecurityPortType;
+
+/**
+ *
+ * @author alex
+ */
+public class API_170_CustodyTransferTest {
+
+ private static Log logger = LogFactory.getLog(API_030_BusinessEntityTest.class);
+ private static API_010_PublisherTest api010 = new API_010_PublisherTest();
+ private static TckTModel tckTModel = new TckTModel(new UDDIPublicationImpl(), new UDDIInquiryImpl());
+ private static TckBusiness tckBusiness = new TckBusiness(new UDDIPublicationImpl(), new UDDIInquiryImpl());
+ private static TckFindEntity tckFindEntity = new TckFindEntity(new UDDIInquiryImpl());
+ private static String authInfoMary = null;
+ private static String authInfoSam = null;
+
+ @BeforeClass
+ public static void setup() throws ConfigurationException {
+ Registry.start();
+ logger.info("API_030_BusinessEntityTest");
+ logger.debug("Getting auth token..");
+ try {
+ api010.saveJoePublisher();
+ api010.saveSamSyndicator();
+ UDDISecurityPortType security = new UDDISecurityImpl();
+ authInfoMary = TckSecurity.getAuthToken(security, TckPublisher.getMaryPublisherId(), TckPublisher.getMaryPassword());
+ authInfoSam = TckSecurity.getAuthToken(security, TckPublisher.getSamPublisherId(), TckPublisher.getSamPassword());
+ String authInfoUDDI = TckSecurity.getAuthToken(security, TckPublisher.getUDDIPublisherId(), TckPublisher.getUDDIPassword());
+ tckTModel.saveUDDIPublisherTmodel(authInfoUDDI);
+ tckTModel.saveTModels(authInfoUDDI, TckTModel.TMODELS_XML);
+ tckTModel.saveMaryPublisherTmodel(authInfoMary);
+ tckTModel.saveSamSyndicatorTmodel(authInfoSam);
+ } catch (RemoteException e) {
+ logger.error(e.getMessage(), e);
+ Assert.fail("Could not obtain authInfo token.");
+ }
+ }
+
+ @AfterClass
+ public static void stopRegistry() throws ConfigurationException {
+ tckTModel.deleteCreatedTModels(authInfoMary);
+ tckTModel.deleteCreatedTModels(authInfoSam);
+ Registry.stop();
+ }
+
+
+ @Test
+ public void testTransfer() throws Exception{
+ UDDIInquiryImpl inquire = new UDDIInquiryImpl();
+
+
+ //save sam's business
+ tckBusiness.saveSamSyndicatorBusiness(authInfoSam);
+
+ //save mary's business
+ tckBusiness.saveMaryPublisherBusiness(authInfoMary);
+
+ GetOperationalInfo goi = new GetOperationalInfo();
+ goi.getEntityKey().add(TckBusiness.SAM_BUSINESS_KEY);
+
+ OperationalInfos operationalInfo = inquire.getOperationalInfo(goi);
+ Assert.assertEquals(operationalInfo.getOperationalInfo().get(0).getAuthorizedName(), TckPublisher.getSamPublisherId());
+
+ //sam wants to transfer to mary, get a token
+ UDDICustodyTransferImpl custody = new UDDICustodyTransferImpl();
+ KeyBag kb = new KeyBag();
+ kb.getKey().add(TckBusiness.SAM_BUSINESS_KEY);
+ Holder<String> node = new Holder<String>();
+ Holder<XMLGregorianCalendar> expires = new Holder<XMLGregorianCalendar>();
+ Holder<byte[]> token = new Holder<byte[]>();
+ custody.getTransferToken(authInfoSam,kb , node, expires, token);
+
+ //use mary's account to accept and transfer
+ TransferEntities te = new TransferEntities();
+ te.setAuthInfo(authInfoMary);
+ te.setKeyBag(kb);
+ te.setTransferToken(new TransferToken());
+ te.getTransferToken().setExpirationTime(expires.value);
+ te.getTransferToken().setNodeID(node.value);
+ te.getTransferToken().setOpaqueToken(token.value);
+ custody.transferEntities(te);
+
+
+
+ operationalInfo = inquire.getOperationalInfo(goi);
+
+ Assert.assertEquals(operationalInfo.getOperationalInfo().get(0).getAuthorizedName(), TckPublisher.getMaryPublisherId());
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@juddi.apache.org
For additional commands, e-mail: commits-help@juddi.apache.org