Issue #1682 Fixed replication/query errors and added synchronous notification delivery

Change-Id: Ia6a07c3abf6c48ef18d354dc2866ed981e6f1478

Former-commit-id: 2f6dc771e86cf290bb72743f1855f02c616e57d5
This commit is contained in:
Benjamin Phillippe 2013-10-20 16:00:47 -05:00
parent a4e5cd5fd7
commit 64b0a4d065
14 changed files with 294 additions and 93 deletions

View file

@ -23,12 +23,14 @@ package oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4;
import javax.jws.Oneway;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import javax.xml.bind.annotation.XmlSeeAlso;
import oasis.names.tc.ebxml.regrep.xsd.rim.v4.NotificationType;
import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryResponseType;
import org.apache.cxf.annotations.GZIP;
@ -43,6 +45,7 @@ import com.raytheon.uf.common.registry.EbxmlNamespaces;
* ------------ ---------- ----------- --------------------------
* 2012 bphillip Initial implementation
* 10/17/2013 1682 bphillip Added software history
* 10/20/2013 1682 bphillip Added synchronous notification delivery
* </pre>
*
* @author bphillip
@ -72,4 +75,10 @@ public interface NotificationListener {
public void onNotification(
@WebParam(name = "Notification", targetNamespace = EbxmlNamespaces.RIM_URI, partName = "Notification") NotificationType notification);
@WebMethod(action = "SynchronousNotification")
@WebResult(name = "RegistryResponse", targetNamespace = EbxmlNamespaces.RS_URI, partName = "partRegistryResponse")
public RegistryResponseType synchronousNotification(
@WebParam(name = "Notification", targetNamespace = EbxmlNamespaces.RIM_URI, partName = "Notification") NotificationType notification)
throws MsgRegistryException;
}

View file

@ -47,9 +47,6 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionTemplate;
import com.raytheon.uf.common.registry.constants.CanonicalQueryTypes;
import com.raytheon.uf.common.registry.constants.Format;
import com.raytheon.uf.common.registry.constants.Languages;
import com.raytheon.uf.common.registry.constants.QueryReturnTypes;
import com.raytheon.uf.common.registry.services.RegistryRESTServices;
import com.raytheon.uf.common.registry.services.RegistrySOAPServices;
import com.raytheon.uf.common.serialization.SerializationException;
@ -58,6 +55,7 @@ import com.raytheon.uf.edex.database.RunnableWithTransaction;
import com.raytheon.uf.edex.datadelivery.registry.replication.RegistryReplicationManager;
import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException;
import com.raytheon.uf.edex.registry.ebxml.init.RegistryInitializedListener;
import com.raytheon.uf.edex.registry.ebxml.services.query.QueryConstants;
/**
*
@ -71,6 +69,7 @@ import com.raytheon.uf.edex.registry.ebxml.init.RegistryInitializedListener;
* ------------ ---------- ----------- --------------------------
* 5/22/2013 1707 bphillip Initial implementation
* 7/29/2013 2191 bphillip Implemented registry sync for registries that have been down for an extended period of time
* 10/20/2013 1682 bphillip Fixed query invocation
* </pre>
*
* @author bphillip
@ -187,17 +186,20 @@ public class WfoRegistryFederationManager extends RegistryFederationManager
protected FederationType getFederation() throws EbxmlRegistryException {
statusHandler
.info("Attempting to acquire federation object from NCF...");
QueryType query = new QueryType(CanonicalQueryTypes.GET_OBJECT_BY_ID,
new SlotType("id", new StringValueType(FEDERATION_ID)));
QueryRequest queryRequest = new QueryRequest("Query for federation",
"Query to get the status of the federation",
new ResponseOptionType(QueryReturnTypes.REGISTRY_OBJECT, true),
query, false, null, Format.EBRIM, Languages.EN_US, 0, 0, 0,
false);
QueryType query = new QueryType();
query.setQueryDefinition(CanonicalQueryTypes.GET_OBJECT_BY_ID);
query.getSlot().add(
new SlotType(QueryConstants.ID, new StringValueType(
FEDERATION_ID)));
QueryRequest request = new QueryRequest();
request.setResponseOption(new ResponseOptionType(
ResponseOptionType.RETURN_TYPE.RegistryObject.toString(), true));
request.setId("Query For Federation");
request.setQuery(query);
QueryResponse response = null;
try {
response = RegistrySOAPServices.getQueryServiceForHost(ncfAddress)
.executeQuery(queryRequest);
.executeQuery(request);
} catch (Exception e) {
throw new EbxmlRegistryException(
"Error getting Federation from NCF!", e);

View file

@ -66,6 +66,7 @@ import com.raytheon.uf.common.registry.RegistryException;
import com.raytheon.uf.common.registry.constants.CanonicalQueryTypes;
import com.raytheon.uf.common.registry.constants.DeliveryMethodTypes;
import com.raytheon.uf.common.registry.constants.NotificationOptionTypes;
import com.raytheon.uf.common.registry.constants.QueryLanguages;
import com.raytheon.uf.common.registry.constants.RegistryObjectTypes;
import com.raytheon.uf.common.registry.constants.StatusTypes;
import com.raytheon.uf.common.registry.ebxml.RegistryUtil;
@ -81,6 +82,7 @@ import com.raytheon.uf.edex.datadelivery.registry.availability.FederatedRegistry
import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectDao;
import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException;
import com.raytheon.uf.edex.registry.ebxml.exception.NoReplicationServersAvailableException;
import com.raytheon.uf.edex.registry.ebxml.services.query.QueryConstants;
import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil;
/**
@ -98,6 +100,7 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil;
* 7/29/2013 2191 bphillip Implemented registry sync for registries that have been down for an extended period of time
* 8/1/2013 1693 bphillip Switch to use rest service instead of query manager for federation synchronization
* 9/5/2013 1538 bphillip Changed when the registry availability monitor is started
* 10/20/2013 1682 bphillip Fixed query invocation
* </pre>
*
* @author bphillip
@ -497,13 +500,24 @@ public class RegistryReplicationManager {
sub.setStartTime(EbxmlObjectUtil.getTimeAsXMLGregorianCalendar(0));
QueryType selectorQuery = new QueryType();
selectorQuery.setQueryDefinition(CanonicalQueryTypes.BASIC_QUERY);
SlotType slot = new SlotType();
StringValueType valType = new StringValueType();
valType.setValue(objectType);
slot.setName("objectType");
slot.setSlotValue(valType);
selectorQuery.getSlot().add(slot);
selectorQuery.setQueryDefinition(CanonicalQueryTypes.ADHOC_QUERY);
SlotType expressionSlot = new SlotType();
StringValueType expressionValue = new StringValueType();
expressionValue
.setValue("FROM RegistryObjectType obj where obj.objectType='"
+ objectType + "'");
expressionSlot.setName(QueryConstants.QUERY_EXPRESSION);
expressionSlot.setSlotValue(expressionValue);
selectorQuery.getSlot().add(expressionSlot);
SlotType languageSlot = new SlotType();
StringValueType languageValue = new StringValueType();
languageValue.setValue(QueryLanguages.HQL);
languageSlot.setName(QueryConstants.QUERY_LANGUAGE);
languageSlot.setSlotValue(languageValue);
selectorQuery.getSlot().add(languageSlot);
sub.setSelector(selectorQuery);
Duration notificationInterval = DatatypeFactory.newInstance()

View file

@ -20,7 +20,6 @@
class="com.raytheon.uf.edex.registry.ebxml.services.notification.NotificationListenerImpl">
<property name="lcm" ref="lcmServiceImpl" />
<property name="registryObjectDao" ref="registryObjectDao" />
<property name="classificationNodeDao" ref="classificationNodeDao" />
<property name="registryDao" ref="registryDao" />
</bean>

View file

@ -19,10 +19,17 @@
**/
package com.raytheon.uf.edex.registry.ebxml.services.notification;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.MsgRegistryException;
import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.NotificationListener;
import oasis.names.tc.ebxml.regrep.xsd.rim.v4.NotificationType;
import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryResponseType;
import com.google.common.annotations.VisibleForTesting;
import com.raytheon.uf.common.registry.EbxmlNamespaces;
import com.raytheon.uf.common.registry.constants.DeliveryMethodTypes;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
@ -40,6 +47,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.notification.listeners.WebSe
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 17, 2013 1672 djohnson Initial creation
* 10/20/2013 1682 bphillip Added synchronous notification delivery
*
* </pre>
*
@ -73,6 +81,17 @@ public class NotificationListenerFactory implements
statusHandler.warn("Unsupported delivery type: " + endpointType
+ ". Notification will not be delivered!");
}
@Override
@WebMethod(action = "SynchronousNotification")
@WebResult(name = "RegistryResponse", targetNamespace = EbxmlNamespaces.RS_URI, partName = "partRegistryResponse")
public RegistryResponseType synchronousNotification(
@WebParam(name = "Notification", targetNamespace = EbxmlNamespaces.RIM_URI, partName = "Notification") NotificationType notification)
throws MsgRegistryException {
statusHandler.warn("Unsupported delivery type: " + endpointType
+ ". Notification will not be delivered!");
return null;
}
}
private final EmailSender emailSender;

View file

@ -24,6 +24,9 @@ import java.util.Collection;
import java.util.List;
import javax.annotation.Resource;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.xml.ws.WebServiceContext;
import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.MsgRegistryException;
@ -46,25 +49,27 @@ import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryObjectType;
import oasis.names.tc.ebxml.regrep.xsd.rim.v4.RegistryType;
import oasis.names.tc.ebxml.regrep.xsd.rim.v4.SlotType;
import oasis.names.tc.ebxml.regrep.xsd.rim.v4.StringValueType;
import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryResponseStatus;
import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryResponseType;
import org.springframework.transaction.annotation.Transactional;
import com.raytheon.uf.common.registry.EbxmlNamespaces;
import com.raytheon.uf.common.registry.constants.ActionTypes;
import com.raytheon.uf.common.registry.constants.CanonicalQueryTypes;
import com.raytheon.uf.common.registry.constants.DeletionScope;
import com.raytheon.uf.common.registry.constants.Format;
import com.raytheon.uf.common.registry.constants.Languages;
import com.raytheon.uf.common.registry.constants.QueryLanguages;
import com.raytheon.uf.common.registry.constants.QueryReturnTypes;
import com.raytheon.uf.common.registry.services.RegistrySOAPServices;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.util.CollectionUtil;
import com.raytheon.uf.edex.registry.ebxml.dao.ClassificationNodeDao;
import com.raytheon.uf.edex.registry.ebxml.dao.RegistryDao;
import com.raytheon.uf.edex.registry.ebxml.dao.RegistryObjectDao;
import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException;
import com.raytheon.uf.edex.registry.ebxml.services.lifecycle.LifecycleManagerImpl;
import com.raytheon.uf.edex.registry.ebxml.services.query.QueryConstants;
import com.raytheon.uf.edex.registry.ebxml.util.EbxmlExceptionUtil;
import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil;
/**
@ -80,6 +85,7 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil;
* 4/9/2013 1802 bphillip Implemented notification handling
* 5/21/2013 2022 bphillip Reworked how notifications are handled
* 9/11/2013 2254 bphillip Cleaned up handling of notifications and removed unneccessary code
* 10/20/2013 1682 bphillip Added synchronous notification delivery
*
* </pre>
*
@ -109,9 +115,6 @@ public class NotificationListenerImpl implements NotificationListener {
/** Data access object for getting RegistryType objects */
private RegistryDao registryDao;
/** The classification node data access object */
private ClassificationNodeDao classificationNodeDao;
@Override
public void onNotification(NotificationType notification) {
@ -129,7 +132,8 @@ public class NotificationListenerImpl implements NotificationListener {
List<AuditableEventType> events = notification.getEvent();
// Process the received auditable events and add them to the appropriate
// Process the received auditable events and add them to the
// appropriate
// list based on the action performed
for (AuditableEventType event : events) {
@ -138,13 +142,6 @@ public class NotificationListenerImpl implements NotificationListener {
String eventType = action.getEventType();
List<String> objectIds = new ArrayList<String>();
// Verify this is a valid event type
if (!classificationNodeDao.isValidNode(eventType)) {
statusHandler.info("Unknown event type [" + eventType
+ "] received in notification");
continue;
}
if (action.getAffectedObjectRefs() != null) {
for (ObjectRefType ref : action.getAffectedObjectRefs()
.getObjectRef()) {
@ -169,10 +166,10 @@ public class NotificationListenerImpl implements NotificationListener {
Mode.CREATE_OR_REPLACE);
lcm.submitObjects(submitRequest);
} catch (MsgRegistryException e) {
statusHandler.error(
throw new RuntimeException(
"Error creating objects in registry!", e);
} catch (EbxmlRegistryException e) {
statusHandler.error(
throw new RuntimeException(
"Error creating submit objects request!", e);
}
} else if (eventType.equals(ActionTypes.delete)) {
@ -193,14 +190,33 @@ public class NotificationListenerImpl implements NotificationListener {
try {
lcm.removeObjects(request);
} catch (MsgRegistryException e) {
statusHandler.error(
throw new RuntimeException(
"Error creating remove objects request!", e);
}
} else {
statusHandler.info("Unknown event type [" + eventType
+ "] received in notification");
}
}
}
}
@Override
@WebMethod(action = "SynchronousNotification")
@WebResult(name = "RegistryResponse", targetNamespace = EbxmlNamespaces.RS_URI, partName = "partRegistryResponse")
public RegistryResponseType synchronousNotification(
@WebParam(name = "Notification", targetNamespace = EbxmlNamespaces.RIM_URI, partName = "Notification") NotificationType notification)
throws MsgRegistryException {
RegistryResponseType response = new RegistryResponseType();
response.setRequestId(notification.getId());
try {
onNotification(notification);
response.setStatus(RegistryResponseStatus.SUCCESS);
return response;
} catch (Throwable e) {
throw EbxmlExceptionUtil.createMsgRegistryException(
"Error processing notification.", e);
}
}
/**
@ -288,21 +304,23 @@ public class NotificationListenerImpl implements NotificationListener {
}
queryExpression.append(")");
ResponseOptionType responseOption = new ResponseOptionType();
responseOption.setReturnComposedObjects(true);
responseOption.setReturnType(QueryReturnTypes.REGISTRY_OBJECT);
SlotType queryLanguageSlot = new SlotType(
QueryConstants.QUERY_LANGUAGE, new StringValueType(
QueryLanguages.HQL));
SlotType queryExpressionSlot = new SlotType(
QueryConstants.QUERY_EXPRESSION, new StringValueType(
queryExpression.toString()));
QueryType query = new QueryType();
query.setQueryDefinition(CanonicalQueryTypes.ADHOC_QUERY);
query.getSlot().add(queryLanguageSlot);
query.getSlot().add(queryExpressionSlot);
SlotType queryLanguageSlot = new SlotType("queryLanguage",
new StringValueType(QueryLanguages.HQL));
SlotType queryExpressionSlot = new SlotType("queryExpression",
new StringValueType(queryExpression.toString()));
QueryType selectorQuery = new QueryType(
CanonicalQueryTypes.ADHOC_QUERY, queryLanguageSlot,
queryExpressionSlot);
return new QueryRequest("NotificationListener object update",
"NotificationListener object Update", new ResponseOptionType(
QueryReturnTypes.REGISTRY_OBJECT, true), selectorQuery,
false, null, Format.EBRIM, Languages.EN_US, 0, 0, 0, false);
QueryRequest request = new QueryRequest();
request.setResponseOption(new ResponseOptionType(
QueryReturnTypes.REGISTRY_OBJECT, true));
request.setId("Notification Update Query");
request.setQuery(query);
return request;
}
public void setLcm(LifecycleManagerImpl lcm) {
@ -313,13 +331,7 @@ public class NotificationListenerImpl implements NotificationListener {
this.registryObjectDao = registryObjectDao;
}
public void setClassificationNodeDao(
ClassificationNodeDao classificationNodeDao) {
this.classificationNodeDao = classificationNodeDao;
}
public void setRegistryDao(RegistryDao registryDao) {
this.registryDao = registryDao;
}
}

View file

@ -22,13 +22,18 @@ package com.raytheon.uf.edex.registry.ebxml.services.notification;
import javax.jws.Oneway;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.MsgRegistryException;
import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.NotificationListener;
import oasis.names.tc.ebxml.regrep.xsd.rim.v4.NotificationType;
import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryResponseStatus;
import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryResponseType;
import org.springframework.transaction.annotation.Transactional;
import com.raytheon.uf.common.registry.EbxmlNamespaces;
import com.raytheon.uf.edex.registry.ebxml.util.EbxmlExceptionUtil;
/**
*
@ -42,6 +47,7 @@ import com.raytheon.uf.common.registry.EbxmlNamespaces;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 7/11/2013 1707 bphillip Initial implementation
* 10/20/2013 1682 bphillip Added synchronous notification delivery
* </pre>
*
* @author bphillip
@ -69,4 +75,22 @@ public class NotificationListenerImplWrapper implements NotificationListener {
notificationListener.onNotification(notification);
}
@Override
@WebMethod(action = "SynchronousNotification")
@WebResult(name = "RegistryResponse", targetNamespace = EbxmlNamespaces.RS_URI, partName = "partRegistryResponse")
public RegistryResponseType synchronousNotification(
@WebParam(name = "Notification", targetNamespace = EbxmlNamespaces.RIM_URI, partName = "Notification") NotificationType notification)
throws MsgRegistryException {
RegistryResponseType response = new RegistryResponseType();
response.setRequestId(notification.getId());
try {
notificationListener.synchronousNotification(notification);
response.setStatus(RegistryResponseStatus.SUCCESS);
return response;
} catch (Throwable e) {
throw EbxmlExceptionUtil.createMsgRegistryException(
"Error processing notification.", e);
}
}
}

View file

@ -71,6 +71,7 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil;
* 9/11/2013 2354 bphillip Added logic to ensure delete events get included in notifications
* 9/30/2013 2191 bphillip Fixing federated replication
* 10/8/2013 1682 bphillip Moved get objects of interest from RegistrySubscriptionManager and javadoc
* 10/20/2013 1682 bphillip Added synchronous notification delivery
* </pre>
*
* @author bphillip
@ -176,13 +177,22 @@ public class RegistryNotificationManager {
* The notification to send
* @param address
* The address to send the notification to
* @throws MsgRegistryException
*/
protected void sendNotification(NotificationListenerWrapper listener,
NotificationType notification, String address) {
NotificationType notification, String address)
throws MsgRegistryException {
statusHandler.info("Sending notification [" + notification.getId()
+ "] to address [" + address + "]");
listener.notificationListener.onNotification(notification);
try {
listener.notificationListener.synchronousNotification(notification);
} catch (MsgRegistryException e) {
statusHandler.error("Notification [" + notification.getId()
+ " failed to address [" + address + "]", e);
throw e;
}
statusHandler.info("Notification [" + notification.getId()
+ " successfully sent to address [" + address + "]");
@ -223,30 +233,36 @@ public class RegistryNotificationManager {
/ notificationBatchSize;
int lastListSize = eventsOfInterest.size()
% notificationBatchSize;
for (int i = 0; i < subListCount; i++) {
try {
for (int i = 0; i < subListCount; i++) {
NotificationType notification = getNotification(
subscription, listener.address, objectsOfInterest,
eventsOfInterest.subList(notificationBatchSize * i,
notificationBatchSize * i
+ notificationBatchSize));
if (!notification.getEvent().isEmpty()) {
sendNotification(listener, notification,
listener.address);
NotificationType notification = getNotification(
subscription,
listener.address,
objectsOfInterest,
eventsOfInterest.subList(notificationBatchSize
* i, notificationBatchSize * i
+ notificationBatchSize));
if (!notification.getEvent().isEmpty()) {
sendNotification(listener, notification,
listener.address);
}
}
}
if (lastListSize > 0) {
NotificationType notification = getNotification(
subscription,
listener.address,
objectsOfInterest,
eventsOfInterest.subList(notificationBatchSize
* subListCount, notificationBatchSize
* subListCount + lastListSize));
if (!notification.getEvent().isEmpty()) {
sendNotification(listener, notification,
listener.address);
if (lastListSize > 0) {
NotificationType notification = getNotification(
subscription,
listener.address,
objectsOfInterest,
eventsOfInterest.subList(notificationBatchSize
* subListCount, notificationBatchSize
* subListCount + lastListSize));
if (!notification.getEvent().isEmpty()) {
sendNotification(listener, notification,
listener.address);
}
}
} catch (MsgRegistryException e) {
statusHandler.error("Notification delivery failed!", e);
}
}

View file

@ -19,15 +19,24 @@
**/
package com.raytheon.uf.edex.registry.ebxml.services.notification.listeners;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.MsgRegistryException;
import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.NotificationListener;
import oasis.names.tc.ebxml.regrep.xsd.rim.v4.ExtrinsicObjectType;
import oasis.names.tc.ebxml.regrep.xsd.rim.v4.NotificationType;
import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryResponseStatus;
import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryResponseType;
import com.raytheon.uf.common.registry.EbxmlNamespaces;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException;
import com.raytheon.uf.edex.registry.ebxml.services.notification.EmailSender;
import com.raytheon.uf.edex.registry.ebxml.services.notification.NotificationDestination;
import com.raytheon.uf.edex.registry.ebxml.util.EbxmlExceptionUtil;
/**
* Email notification listener.
@ -39,6 +48,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.notification.NotificationDes
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 16, 2013 1672 djohnson Extracted from RegistryNotificationManager.
* 10/20/2013 1682 bphillip Added synchronous notification delivery
*
* </pre>
*
@ -105,4 +115,22 @@ public class EmailNotificationListener implements NotificationListener {
}
}
@Override
@WebMethod(action = "SynchronousNotification")
@WebResult(name = "RegistryResponse", targetNamespace = EbxmlNamespaces.RS_URI, partName = "partRegistryResponse")
public RegistryResponseType synchronousNotification(
@WebParam(name = "Notification", targetNamespace = EbxmlNamespaces.RIM_URI, partName = "Notification") NotificationType notification)
throws MsgRegistryException {
RegistryResponseType response = new RegistryResponseType();
response.setRequestId(notification.getId());
try {
onNotification(notification);
response.setStatus(RegistryResponseStatus.SUCCESS);
return response;
} catch (Throwable e) {
throw EbxmlExceptionUtil.createMsgRegistryException(
"Error processing notification.", e);
}
}
}

View file

@ -19,14 +19,23 @@
**/
package com.raytheon.uf.edex.registry.ebxml.services.notification.listeners;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.MsgRegistryException;
import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.NotificationListener;
import oasis.names.tc.ebxml.regrep.xsd.rim.v4.NotificationType;
import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryResponseStatus;
import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryResponseType;
import com.raytheon.uf.common.registry.EbxmlNamespaces;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.edex.core.EDEXUtil;
import com.raytheon.uf.edex.registry.ebxml.services.notification.NotificationDestination;
import com.raytheon.uf.edex.registry.ebxml.util.EbxmlExceptionUtil;
/**
* Implements the plugin based notification listener of the EBXML specification.
@ -38,6 +47,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.notification.NotificationDes
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 17, 2013 1672 djohnson Initial creation
* 10/20/2013 1682 bphillip Added synchronous notification delivery
*
* </pre>
*
@ -84,4 +94,22 @@ public class SpringBeanNotificationListener implements NotificationListener {
}
}
@Override
@WebMethod(action = "SynchronousNotification")
@WebResult(name = "RegistryResponse", targetNamespace = EbxmlNamespaces.RS_URI, partName = "partRegistryResponse")
public RegistryResponseType synchronousNotification(
@WebParam(name = "Notification", targetNamespace = EbxmlNamespaces.RIM_URI, partName = "Notification") NotificationType notification)
throws MsgRegistryException {
RegistryResponseType response = new RegistryResponseType();
response.setRequestId(notification.getId());
try {
onNotification(notification);
response.setStatus(RegistryResponseStatus.SUCCESS);
return response;
} catch (Throwable e) {
throw EbxmlExceptionUtil.createMsgRegistryException(
"Error processing notification.", e);
}
}
}

View file

@ -19,14 +19,24 @@
**/
package com.raytheon.uf.edex.registry.ebxml.services.notification.listeners;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.MsgRegistryException;
import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.NotificationListener;
import oasis.names.tc.ebxml.regrep.xsd.rim.v4.NotificationType;
import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryResponseStatus;
import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryResponseType;
import com.raytheon.uf.common.registry.EbxmlNamespaces;
import com.raytheon.uf.common.registry.services.RegistrySOAPServices;
import com.raytheon.uf.common.registry.services.RegistryServiceException;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.edex.registry.ebxml.exception.EbxmlRegistryException;
import com.raytheon.uf.edex.registry.ebxml.services.notification.NotificationDestination;
import com.raytheon.uf.edex.registry.ebxml.util.EbxmlExceptionUtil;
/**
* Notifies listeners via a web service.
@ -39,6 +49,7 @@ import com.raytheon.uf.edex.registry.ebxml.services.notification.NotificationDes
* ------------ ---------- ----------- --------------------------
* Apr 16, 2013 1672 djohnson Extracted from RegistryNotificationManager.
* 8/28/2013 1538 bphillip Changed to catch a Throwable instead of just EbxmlRegistryException
* 10/20/2013 1682 bphillip Added synchronous notification delivery
*
* </pre>
*
@ -74,6 +85,24 @@ public class WebServiceNotificationListener implements NotificationListener {
}
}
@Override
@WebMethod(action = "SynchronousNotification")
@WebResult(name = "RegistryResponse", targetNamespace = EbxmlNamespaces.RS_URI, partName = "partRegistryResponse")
public RegistryResponseType synchronousNotification(
@WebParam(name = "Notification", targetNamespace = EbxmlNamespaces.RIM_URI, partName = "Notification") NotificationType notification)
throws MsgRegistryException {
RegistryResponseType response = new RegistryResponseType();
response.setRequestId(notification.getId());
try {
onNotification(notification);
response.setStatus(RegistryResponseStatus.SUCCESS);
return response;
} catch (Throwable e) {
throw EbxmlExceptionUtil.createMsgRegistryException(
"Error processing notification.", e);
}
}
/**
* Sends the notification via SOAP
*
@ -83,13 +112,16 @@ public class WebServiceNotificationListener implements NotificationListener {
* The address to send the notification to
* @throws EbxmlRegistryException
* If errors occur while sending the notification
* @throws MsgRegistryException
* @throws RegistryServiceException
*/
protected void sendNotificationViaSoap(NotificationType notification,
String serviceAddress) throws EbxmlRegistryException {
String serviceAddress) throws EbxmlRegistryException,
RegistryServiceException, MsgRegistryException {
statusHandler.info("Sending notification [" + notification.getId()
+ "]");
RegistrySOAPServices.getNotificationListenerServiceForUrl(
serviceAddress).onNotification(notification);
serviceAddress).synchronousNotification(notification);
statusHandler.info("Notification [" + notification.getId() + "] sent!");
}
}

View file

@ -70,8 +70,6 @@ import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.raytheon.uf.common.registry.constants.CanonicalQueryTypes;
import com.raytheon.uf.common.registry.constants.Format;
import com.raytheon.uf.common.registry.constants.Languages;
import com.raytheon.uf.common.registry.constants.QueryReturnTypes;
import com.raytheon.uf.common.registry.constants.RegistryObjectTypes;
import com.raytheon.uf.common.registry.services.RegistrySOAPServices;
@ -122,6 +120,7 @@ import com.raytheon.uf.edex.registry.ebxml.util.EbxmlObjectUtil;
* Jun 24, 2013 2106 djohnson Transaction must already be open.
* 9/5/2013 1538 bphillip Removed log message
* 10/8/2013 1682 bphillip Refactored querying
* 10/201 1682 bphillip Fixed federated query invocation
*
* </pre>
*
@ -729,13 +728,12 @@ public class QueryManagerImpl implements QueryManager, ApplicationContextAware {
QueryType query = new QueryType(
CanonicalQueryTypes.FIND_ASSOCIATED_OBJECTS,
associationTypeSlot, sourceObjectIdSlot);
QueryRequest queryRequest = new QueryRequest(
"Query for federation members",
"Query to get the members of the federation",
new ResponseOptionType(QueryReturnTypes.REGISTRY_OBJECT, true),
query, false, null, Format.EBRIM, Languages.EN_US, 0, 0, 0,
false);
QueryResponse response = executeQuery(queryRequest);
QueryRequest request = new QueryRequest();
request.setResponseOption(new ResponseOptionType(
QueryReturnTypes.REGISTRY_OBJECT, true));
request.setId("Get Members of Federation Query");
request.setQuery(query);
QueryResponse response = executeQuery(request);
if (response.getRegistryObjectList() != null) {
List<RegistryObjectType> responseObjects = response
.getRegistryObjectList().getRegistryObject();

View file

@ -54,6 +54,7 @@ import com.raytheon.uf.common.status.UFStatus;
* Jan 19, 2012 184 bphillip Initial creation
* Apr 23, 2013 1910 djohnson Add createUnresolvedReferenceException().
* 8/1/2013 1693 bphillip Added methods to create exceptions
* 10/20/2013 1682 bphillip createMsgRegistryException changed to accept throwable
*
* </pre>
*
@ -102,7 +103,7 @@ public class EbxmlExceptionUtil {
* @return The MsgRegistryException
*/
public static MsgRegistryException createMsgRegistryException(
String message, String detail, Exception exception) {
String message, String detail, Throwable exception) {
StringBuilder builder = new StringBuilder();
if (detail == null || detail.isEmpty()) {
builder.append("Exception Encountered");
@ -144,7 +145,7 @@ public class EbxmlExceptionUtil {
* @return The MsgRegistryException
*/
public static MsgRegistryException createMsgRegistryException(
String message, Exception exception) {
String message, Throwable exception) {
return createMsgRegistryException(message, null, exception);
}

View file

@ -19,11 +19,19 @@
**/
package com.raytheon.uf.edex.registry.ebxml.dao;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.MsgRegistryException;
import oasis.names.tc.ebxml.regrep.wsdl.registry.services.v4.NotificationListener;
import oasis.names.tc.ebxml.regrep.xsd.rim.v4.NotificationType;
import oasis.names.tc.ebxml.regrep.xsd.rs.v4.RegistryResponseType;
import org.junit.Ignore;
import com.raytheon.uf.common.registry.EbxmlNamespaces;
/**
* A plugin subscribed listener.
*
@ -34,6 +42,7 @@ import org.junit.Ignore;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 17, 2013 1672 djohnson Initial creation
* 10/20/2013 1682 bphillip Added synchronous notification delivery
*
* </pre>
*
@ -53,6 +62,16 @@ public class PluginSubscribedListener implements NotificationListener {
this.notified = true;
}
@Override
@WebMethod(action = "SynchronousNotification")
@WebResult(name = "RegistryResponse", targetNamespace = EbxmlNamespaces.RS_URI, partName = "partRegistryResponse")
public RegistryResponseType synchronousNotification(
@WebParam(name = "Notification", targetNamespace = EbxmlNamespaces.RIM_URI, partName = "Notification") NotificationType notification)
throws MsgRegistryException {
this.notified = true;
return null;
}
/**
* Check whether the listener was notified.
*