Issue #1543 Use XML to represent retrieval

- Only include request identifier for serialized retrieval data
- RetrievalAttributes are now retrieved from the database
- Remove plugin data objects from class names
- Add retrievalDao to retrieval task constructor

Amend:
   Add call-through method to prepare for serialization.

Change-Id: Ic5d2243dd77e1aefd49057a0b7843329e95f0c9d

Former-commit-id: 62a84aea76 [formerly 2cd0aa465fe10282b4be9225011fa8c780204edb]
Former-commit-id: 437a168b50
This commit is contained in:
Dustin Johnson 2013-02-15 08:38:56 -06:00
parent 3ad71676b3
commit f16c1507d0
24 changed files with 363 additions and 188 deletions

View file

@ -1,17 +0,0 @@
package com.raytheon.uf.common.datadelivery.registry;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class CoverageAdapter extends XmlAdapter<GriddedCoverage, Coverage> {
@Override
public Coverage unmarshal(GriddedCoverage v) throws Exception {
return v;
}
@Override
public GriddedCoverage marshal(Coverage v) throws Exception {
return new GriddedCoverage(v); // you must provide such c-tor
}
}

View file

@ -54,7 +54,8 @@ import com.vividsolutions.jts.geom.Coordinate;
* Jan 31, 2011 191 dhladky Initial creation
* Nov 19, 2012 1166 djohnson Clean up JAXB representation of registry objects.
* Dec 10, 2012 1259 bsteffen Switch Data Delivery from LatLon to referenced envelopes.
*
* Feb 15, 2013 1543 djohnson Remove constructor accepting a Coverage.
*
* </pre>
*
* @author dhladky
@ -74,10 +75,6 @@ public class GriddedCoverage extends Coverage implements Serializable {
}
public GriddedCoverage(Coverage v) {
}
@XmlElement
@DynamicSerializeElement
private GridCoverage gridCoverage;

View file

@ -24,11 +24,11 @@ import java.io.Serializable;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.bind.annotation.XmlRootElement;
import com.raytheon.uf.common.datadelivery.registry.Coverage;
import com.raytheon.uf.common.datadelivery.registry.CoverageAdapter;
import com.raytheon.uf.common.datadelivery.registry.Ensemble;
import com.raytheon.uf.common.datadelivery.registry.Parameter;
import com.raytheon.uf.common.datadelivery.registry.Time;
@ -45,13 +45,14 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jan 17, 2011 191 dhladky Initial creation
* Feb 15, 2013 1543 djohnson Allow any type of Coverage instance without a JAXB adapter.
*
* </pre>
*
* @author dhladky
* @version 1.0
*/
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
@DynamicSerialize
public class RetrievalAttribute implements ISerializableObject, Serializable {
@ -92,8 +93,7 @@ public class RetrievalAttribute implements ISerializableObject, Serializable {
@DynamicSerializeElement
private String plugin;
@XmlElement(name = "coverage")
@XmlJavaTypeAdapter(value = CoverageAdapter.class)
@XmlAnyElement(lax = true)
@DynamicSerializeElement
private Coverage coverage;

View file

@ -30,7 +30,7 @@
<constructor-arg value="OPSNET" />
<constructor-arg>
<bean
class="com.raytheon.uf.edex.datadelivery.retrieval.handlers.PerformRetrievalPluginDataObjectsFinder">
class="com.raytheon.uf.edex.datadelivery.retrieval.handlers.PerformRetrievalsThenReturnFinder">
<constructor-arg value="OPSNET" />
<constructor-arg ref="retrievalDao" />
</bean>
@ -39,6 +39,7 @@
<bean
class="com.raytheon.uf.edex.datadelivery.retrieval.handlers.StoreRetrievedData">
<constructor-arg value="directvm:dataDeliveryNotify" />
<constructor-arg ref="retrievalDao" />
</bean>
</constructor-arg>
<constructor-arg>
@ -48,6 +49,7 @@
<constructor-arg ref="retrievalDao" />
</bean>
</constructor-arg>
<constructor-arg ref="retrievalDao" />
</bean>
<!--
@ -60,7 +62,7 @@
<constructor-arg value="OPSNET" />
<constructor-arg>
<bean
class="com.raytheon.uf.edex.datadelivery.retrieval.handlers.PerformRetrievalPluginDataObjectsFinder">
class="com.raytheon.uf.edex.datadelivery.retrieval.handlers.PerformRetrievalsThenReturnFinder">
<constructor-arg value="OPSNET" />
<constructor-arg ref="retrievalDao" />
</bean>
@ -75,6 +77,7 @@
<util:constant
static-field="com.raytheon.uf.edex.datadelivery.retrieval.handlers.IRetrievalResponseCompleter.NULL" />
</constructor-arg>
<constructor-arg ref="retrievalDao" />
</bean>
-->
@ -91,6 +94,7 @@
<bean
class="com.raytheon.uf.edex.datadelivery.retrieval.handlers.StoreRetrievedData">
<constructor-arg value="directvm:dataDeliveryNotify" />
<constructor-arg ref="retrievalDao" />
</bean>
</constructor-arg>
<constructor-arg>
@ -100,6 +104,7 @@
<constructor-arg ref="retrievalDao" />
</bean>
</constructor-arg>
<constructor-arg ref="retrievalDao" />
</bean>
<bean id="scheduledExecutorService" class="java.util.concurrent.Executors"

View file

@ -23,6 +23,10 @@ import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
@ -42,6 +46,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
* ------------ ---------- ----------- --------------------------
* May 09, 2012 rjpeter Initial creation
* Feb 11, 2013 1543 djohnson Override equals/hashCode to remove Hibernate warning.
* Feb 15, 2013 1543 djohnson Add JAXB annotations.
*
* </pre>
*
@ -50,6 +55,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
*/
@Embeddable
@DynamicSerialize
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class RetrievalRequestRecordPK implements
IPersistableDataObject<RetrievalRequestRecordPK>,
Serializable, ISerializableObject {
@ -58,10 +65,12 @@ public class RetrievalRequestRecordPK implements
@Column
@DynamicSerializeElement
@XmlAttribute
private String subscriptionName;
@Column
@DynamicSerializeElement
@XmlAttribute
private int index;
// TODO: Subscription only unique per owner

View file

@ -22,9 +22,12 @@ package com.raytheon.uf.edex.datadelivery.retrieval.handlers;
import java.io.File;
import java.io.FileFilter;
import com.raytheon.uf.common.serialization.SerializationUtil;
import javax.xml.bind.JAXBException;
import com.raytheon.uf.common.datadelivery.registry.Coverage;
import com.raytheon.uf.common.serialization.JAXBManager;
import com.raytheon.uf.common.util.CollectionUtil;
import com.raytheon.uf.common.util.FileUtil;
import com.raytheon.uf.edex.datadelivery.retrieval.opendap.OpenDapRetrievalResponse;
/**
* Deserializes the retrieved data in a directory.
@ -43,7 +46,7 @@ import com.raytheon.uf.common.util.FileUtil;
* @version 1.0
*/
public class DeserializeRetrievedDataFromDirectory implements
IRetrievalPluginDataObjectsFinder {
IRetrievalsFinder {
private static final FileFilter NO_DIRECTORIES = new FileFilter() {
@Override
@ -54,18 +57,28 @@ public class DeserializeRetrievedDataFromDirectory implements
private final File directory;
private final JAXBManager jaxbManager;
/**
* @param directory
*/
public DeserializeRetrievedDataFromDirectory(File directory) {
this.directory = directory;
try {
this.jaxbManager = new JAXBManager(
RetrievalResponseXml.class,
OpenDapRetrievalResponse.class, Coverage.class);
} catch (JAXBException e) {
throw new ExceptionInInitializerError(e);
}
}
/**
* {@inheritDoc}
*/
@Override
public RetrievalPluginDataObjects findRetrievalPluginDataObjects()
public RetrievalResponseXml findRetrievals()
throws Exception {
final File[] files = directory.listFiles(NO_DIRECTORIES);
@ -76,9 +89,8 @@ public class DeserializeRetrievedDataFromDirectory implements
final File file = files[0];
try {
return SerializationUtil
.transformFromThrift(RetrievalPluginDataObjects.class,
FileUtil.file2bytes(file));
return (RetrievalResponseXml) jaxbManager
.jaxbUnmarshalFromXmlFile(file);
} finally {
file.delete();
}

View file

@ -22,7 +22,7 @@ package com.raytheon.uf.edex.datadelivery.retrieval.handlers;
import com.raytheon.uf.common.serialization.SerializationException;
/**
* Processes {@link RetrievalPluginDataObjects} that were generated from a
* Processes {@link RetrievalResponseXml} that were generated from a
* retrieval.
*
* <pre>
@ -51,6 +51,6 @@ public interface IRetrievalPluginDataObjectsProcessor {
* on error with serialization
*/
void processRetrievedPluginDataObjects(
RetrievalPluginDataObjects retrievalPluginDataObjects)
RetrievalResponseXml retrievalPluginDataObjects)
throws Exception;
}

View file

@ -21,7 +21,7 @@ package com.raytheon.uf.edex.datadelivery.retrieval.handlers;
/**
* Responsible for finding the {@link RetrievalPluginDataObjects} that should be
* Responsible for finding the {@link RetrievalResponseXml} that should be
* processed.
*
* <pre>
@ -37,13 +37,13 @@ package com.raytheon.uf.edex.datadelivery.retrieval.handlers;
* @author djohnson
* @version 1.0
*/
public interface IRetrievalPluginDataObjectsFinder {
public interface IRetrievalsFinder {
/**
* Finds the {@link RetrievalPluginDataObjects} that should be processed.
* Finds the {@link RetrievalResponseXml} that should be processed.
*
* @return the {@link RetrievalPluginDataObjects}
* @return the {@link RetrievalResponseXml}
* @throws Exception
*/
RetrievalPluginDataObjects findRetrievalPluginDataObjects()
RetrievalResponseXml findRetrievals()
throws Exception;
}

View file

@ -53,6 +53,7 @@ import com.raytheon.uf.edex.datadelivery.retrieval.interfaces.IRetrievalResponse
* Feb 01, 2013 1543 djohnson Initial creation
* Feb 07, 2013 1543 djohnson Expose process() for testing.
* Feb 12, 2013 1543 djohnson Retrieval responses are now passed further down the chain.
* Feb 15, 2013 1543 djohnson Retrieval responses are now xml.
*
* </pre>
*
@ -60,11 +61,11 @@ import com.raytheon.uf.edex.datadelivery.retrieval.interfaces.IRetrievalResponse
* @version 1.0
*/
public class PerformRetrievalPluginDataObjectsFinder implements
IRetrievalPluginDataObjectsFinder {
public class PerformRetrievalsThenReturnFinder implements
IRetrievalsFinder {
private static final IUFStatusHandler statusHandler = UFStatus
.getHandler(PerformRetrievalPluginDataObjectsFinder.class);
.getHandler(PerformRetrievalsThenReturnFinder.class);
private final Network network;
@ -75,7 +76,7 @@ public class PerformRetrievalPluginDataObjectsFinder implements
*
* @param network
*/
public PerformRetrievalPluginDataObjectsFinder(Network network,
public PerformRetrievalsThenReturnFinder(Network network,
IRetrievalDao retrievalDao) {
this.network = network;
this.retrievalDao = retrievalDao;
@ -85,9 +86,9 @@ public class PerformRetrievalPluginDataObjectsFinder implements
* {@inheritDoc}
*/
@Override
public RetrievalPluginDataObjects findRetrievalPluginDataObjects()
public RetrievalResponseXml findRetrievals()
throws Exception {
RetrievalPluginDataObjects retVal = null;
RetrievalResponseXml retVal = null;
ITimer timer = TimeUtil.getTimer();
try {
@ -133,9 +134,9 @@ public class PerformRetrievalPluginDataObjectsFinder implements
* The actual work gets done here.
*/
@VisibleForTesting
RetrievalPluginDataObjects process(RetrievalRequestRecord requestRecord) {
RetrievalResponseXml process(RetrievalRequestRecord requestRecord) {
requestRecord.setState(State.FAILED);
List<RetrievalAttributePluginDataObjects> retrievalAttributePluginDataObjects = new ArrayList<RetrievalAttributePluginDataObjects>();
List<RetrievalResponseWrapper> retrievalAttributePluginDataObjects = new ArrayList<RetrievalResponseWrapper>();
try {
Retrieval retrieval = requestRecord.getRetrievalObj();
@ -170,8 +171,8 @@ public class PerformRetrievalPluginDataObjectsFinder implements
setCompletionStateFromResponse(requestRecord, response);
retrievalAttributePluginDataObjects
.add(new RetrievalAttributePluginDataObjects(
attXML, response));
.add(new RetrievalResponseWrapper(
response));
} else {
throw new IllegalStateException("No PDO's to store: "
+ serviceType + " original: "
@ -188,8 +189,11 @@ public class PerformRetrievalPluginDataObjectsFinder implements
} catch (Exception e) {
statusHandler.handle(Priority.WARN, e.getLocalizedMessage(), e);
}
RetrievalPluginDataObjects retrievalPluginDataObject = new RetrievalPluginDataObjects(
requestRecord, retrievalAttributePluginDataObjects);
RetrievalResponseXml retrievalPluginDataObject = new RetrievalResponseXml(
requestRecord.getId(), retrievalAttributePluginDataObjects);
retrievalPluginDataObject
.setSuccess(requestRecord.getState() == State.COMPLETED);
return retrievalPluginDataObject;
}
@ -203,8 +207,8 @@ public class PerformRetrievalPluginDataObjectsFinder implements
* the response
*/
@VisibleForTesting
static void setCompletionStateFromResponse(RetrievalRequestRecord requestRecord,
IRetrievalResponse response) {
static void setCompletionStateFromResponse(
RetrievalRequestRecord requestRecord, IRetrievalResponse response) {
final State completionState = response.getPayLoad() == null ? State.FAILED
: State.COMPLETED;
requestRecord.setState(completionState);

View file

@ -19,7 +19,11 @@
**/
package com.raytheon.uf.edex.datadelivery.retrieval.handlers;
import com.raytheon.uf.common.datadelivery.retrieval.xml.RetrievalAttribute;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlRootElement;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
import com.raytheon.uf.edex.datadelivery.retrieval.interfaces.IRetrievalResponse;
@ -41,19 +45,19 @@ import com.raytheon.uf.edex.datadelivery.retrieval.interfaces.IRetrievalResponse
* @author djohnson
* @version 1.0
*/
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
@DynamicSerialize
public class RetrievalAttributePluginDataObjects {
@DynamicSerializeElement
private RetrievalAttribute attributeXml;
public class RetrievalResponseWrapper {
@XmlAnyElement(lax = true)
@DynamicSerializeElement
private IRetrievalResponse retrievalResponse;
/**
* Constructor.
*/
public RetrievalAttributePluginDataObjects() {
public RetrievalResponseWrapper() {
}
/**
@ -62,27 +66,10 @@ public class RetrievalAttributePluginDataObjects {
* @param attributeXml
* @param response
*/
public RetrievalAttributePluginDataObjects(RetrievalAttribute attributeXml,
IRetrievalResponse response) {
this.attributeXml = attributeXml;
public RetrievalResponseWrapper(IRetrievalResponse response) {
this.retrievalResponse = response;
}
/**
* @return the attributeXml
*/
public RetrievalAttribute getAttributeXml() {
return attributeXml;
}
/**
* @param attributeXml
* the attributeXml to set
*/
public void setAttributeXml(RetrievalAttribute attributeXml) {
this.attributeXml = attributeXml;
}
/**
* @return the retrievalResponse
*/

View file

@ -21,9 +21,16 @@ package com.raytheon.uf.edex.datadelivery.retrieval.handlers;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlRootElement;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
import com.raytheon.uf.edex.datadelivery.retrieval.db.RetrievalRequestRecord;
import com.raytheon.uf.edex.datadelivery.retrieval.db.RetrievalRequestRecordPK;
/**
* Associates plugin data objects with a retrieval.
@ -41,19 +48,27 @@ import com.raytheon.uf.edex.datadelivery.retrieval.db.RetrievalRequestRecord;
* @author djohnson
* @version 1.0
*/
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
@DynamicSerialize
public class RetrievalPluginDataObjects {
public class RetrievalResponseXml {
@XmlElement
@DynamicSerializeElement
private RetrievalRequestRecord requestRecord;
private RetrievalRequestRecordPK requestRecord;
@XmlElements(@XmlElement(name = "retrievalResponseWrapper"))
@DynamicSerializeElement
private List<RetrievalAttributePluginDataObjects> retrievalAttributePluginDataObjects;
private List<RetrievalResponseWrapper> retrievalAttributePluginDataObjects;
@XmlAttribute
@DynamicSerializeElement
private boolean success;
/**
* Constructor.
*/
public RetrievalPluginDataObjects() {
public RetrievalResponseXml() {
}
/**
@ -62,9 +77,8 @@ public class RetrievalPluginDataObjects {
* @param requestRecord
* @param retrievalAttributePluginDataObjects
*/
public RetrievalPluginDataObjects(
RetrievalRequestRecord requestRecord,
List<RetrievalAttributePluginDataObjects> retrievalAttributePluginDataObjects) {
public RetrievalResponseXml(RetrievalRequestRecordPK requestRecord,
List<RetrievalResponseWrapper> retrievalAttributePluginDataObjects) {
this.requestRecord = requestRecord;
this.retrievalAttributePluginDataObjects = retrievalAttributePluginDataObjects;
}
@ -72,7 +86,7 @@ public class RetrievalPluginDataObjects {
/**
* @return the requestRecord
*/
public RetrievalRequestRecord getRequestRecord() {
public RetrievalRequestRecordPK getRequestRecord() {
return requestRecord;
}
@ -80,14 +94,14 @@ public class RetrievalPluginDataObjects {
* @param requestRecord
* the requestRecord to set
*/
public void setRequestRecord(RetrievalRequestRecord requestRecord) {
public void setRequestRecord(RetrievalRequestRecordPK requestRecord) {
this.requestRecord = requestRecord;
}
/**
* @return the retrievalAttributePluginDataObjects
*/
public List<RetrievalAttributePluginDataObjects> getRetrievalAttributePluginDataObjects() {
public List<RetrievalResponseWrapper> getRetrievalAttributePluginDataObjects() {
return retrievalAttributePluginDataObjects;
}
@ -96,7 +110,33 @@ public class RetrievalPluginDataObjects {
* the retrievalAttributePluginDataObjects to set
*/
public void setRetrievalAttributePluginDataObjects(
List<RetrievalAttributePluginDataObjects> retrievalAttributePluginDataObjects) {
List<RetrievalResponseWrapper> retrievalAttributePluginDataObjects) {
this.retrievalAttributePluginDataObjects = retrievalAttributePluginDataObjects;
}
/**
* @return
*/
public boolean isSuccess() {
return success;
}
/**
*
* @param successful
*/
public void setSuccess(boolean successful) {
this.success = successful;
}
/**
* Prepares the object for serialization.
*/
public void prepareForSerialization() {
for (RetrievalResponseWrapper attribute : getRetrievalAttributePluginDataObjects()) {
// Null out the attribute since we can retrieve it from the database
// on the receiving side
attribute.getRetrievalResponse().setAttribute(null);
}
}
}

View file

@ -22,8 +22,8 @@ package com.raytheon.uf.edex.datadelivery.retrieval.handlers;
import com.raytheon.uf.common.datadelivery.registry.Network;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.edex.datadelivery.retrieval.db.IRetrievalDao;
import com.raytheon.uf.edex.datadelivery.retrieval.db.RetrievalRequestRecord;
import com.raytheon.uf.edex.datadelivery.retrieval.db.RetrievalRequestRecord.State;
/**
* Inner class to process individual retrievals.
@ -39,6 +39,7 @@ import com.raytheon.uf.edex.datadelivery.retrieval.db.RetrievalRequestRecord.Sta
* Aug 22, 2012 0743 djohnson Continue processing retrievals until there are no more.
* Nov 19, 2012 1166 djohnson Clean up JAXB representation of registry objects.
* Jan 30, 2013 1543 djohnson Constrain to the network retrievals are pulled for.
* Feb 15, 2013 1543 djohnson Using xml for retrievals now.
*
* </pre>
*
@ -56,16 +57,20 @@ public class RetrievalTask implements Runnable {
private final IRetrievalResponseCompleter retrievalCompleter;
private final IRetrievalPluginDataObjectsFinder retrievalDataFinder;
private final IRetrievalsFinder retrievalDataFinder;
private final IRetrievalDao retrievalDao;
public RetrievalTask(Network network,
IRetrievalPluginDataObjectsFinder retrievalDataFinder,
IRetrievalsFinder retrievalDataFinder,
IRetrievalPluginDataObjectsProcessor retrievedDataProcessor,
IRetrievalResponseCompleter retrievalCompleter) {
IRetrievalResponseCompleter retrievalCompleter,
IRetrievalDao retrievalDao) {
this.network = network;
this.retrievalDataFinder = retrievalDataFinder;
this.retrievedDataProcessor = retrievedDataProcessor;
this.retrievalCompleter = retrievalCompleter;
this.retrievalDao = retrievalDao;
}
@Override
@ -78,8 +83,8 @@ public class RetrievalTask implements Runnable {
RetrievalRequestRecord request = null;
try {
RetrievalPluginDataObjects retrievalPluginDataObject = retrievalDataFinder
.findRetrievalPluginDataObjects();
RetrievalResponseXml retrievalPluginDataObject = retrievalDataFinder
.findRetrievals();
// This forces the return from the while loop once there are
// no more retrievals to process
if (retrievalPluginDataObject == null) {
@ -88,8 +93,9 @@ public class RetrievalTask implements Runnable {
return;
}
request = retrievalPluginDataObject.getRequestRecord();
success = (request.getState() == State.COMPLETED);
request = retrievalDao.getById(retrievalPluginDataObject
.getRequestRecord());
success = retrievalPluginDataObject.isSuccess();
retrievedDataProcessor
.processRetrievedPluginDataObjects(retrievalPluginDataObject);
} catch (Exception e) {

View file

@ -20,12 +20,15 @@
package com.raytheon.uf.edex.datadelivery.retrieval.handlers;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import javax.xml.bind.JAXBException;
import com.raytheon.uf.common.datadelivery.registry.Coverage;
import com.raytheon.uf.common.serialization.JAXBManager;
import com.raytheon.uf.common.serialization.SerializationException;
import com.raytheon.uf.common.serialization.SerializationUtil;
import com.raytheon.uf.common.util.FileUtil;
import com.raytheon.uf.edex.datadelivery.retrieval.opendap.OpenDapRetrievalResponse;
/**
* Serializes the retrieved data to a directory.
@ -37,6 +40,7 @@ import com.raytheon.uf.common.util.FileUtil;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 01, 2013 1543 djohnson Initial creation
* Feb 15, 2013 1543 djohnson Serialize data out as XML.
*
* </pre>
*
@ -46,6 +50,8 @@ import com.raytheon.uf.common.util.FileUtil;
public class SerializeRetrievedDataToDirectory implements
IRetrievalPluginDataObjectsProcessor {
private final JAXBManager jaxbManager;
private final File targetDirectory;
/**
@ -53,6 +59,12 @@ public class SerializeRetrievedDataToDirectory implements
*/
public SerializeRetrievedDataToDirectory(File directory) {
this.targetDirectory = directory;
try {
this.jaxbManager = new JAXBManager(RetrievalResponseXml.class,
OpenDapRetrievalResponse.class, Coverage.class);
} catch (JAXBException e) {
throw new ExceptionInInitializerError(e);
}
}
/**
@ -60,13 +72,17 @@ public class SerializeRetrievedDataToDirectory implements
*/
@Override
public void processRetrievedPluginDataObjects(
RetrievalPluginDataObjects retrievalPluginDataObjects)
RetrievalResponseXml retrievalPluginDataObjects)
throws SerializationException {
retrievalPluginDataObjects.prepareForSerialization();
try {
FileUtil.bytes2File(SerializationUtil
.transformToThrift(retrievalPluginDataObjects), new File(
targetDirectory, UUID.randomUUID().toString()));
} catch (IOException e) {
final File output = new File(targetDirectory, UUID.randomUUID()
.toString());
final String xml = jaxbManager
.marshalToXml(retrievalPluginDataObjects);
FileUtil.bytes2File(xml.getBytes(), output);
} catch (Exception e) {
throw new SerializationException(e);
}
}

View file

@ -19,6 +19,7 @@
**/
package com.raytheon.uf.edex.datadelivery.retrieval.handlers;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@ -36,7 +37,9 @@ import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.util.CollectionUtil;
import com.raytheon.uf.edex.datadelivery.retrieval.ServiceTypeFactory;
import com.raytheon.uf.edex.datadelivery.retrieval.adapters.RetrievalAdapter;
import com.raytheon.uf.edex.datadelivery.retrieval.db.IRetrievalDao;
import com.raytheon.uf.edex.datadelivery.retrieval.db.RetrievalRequestRecord;
import com.raytheon.uf.edex.datadelivery.retrieval.interfaces.IRetrievalResponse;
import com.raytheon.uf.edex.datadelivery.retrieval.util.RetrievalPersistUtil;
/**
@ -51,6 +54,7 @@ import com.raytheon.uf.edex.datadelivery.retrieval.util.RetrievalPersistUtil;
* ------------ ---------- ----------- --------------------------
* Jan 31, 2013 1543 djohnson Initial creation
* Feb 12, 2013 1543 djohnson Now handles the retrieval responses directly.
* Feb 15, 2013 1543 djohnson Retrieve the retrieval attributes from the database.
*
* </pre>
*
@ -60,19 +64,23 @@ import com.raytheon.uf.edex.datadelivery.retrieval.util.RetrievalPersistUtil;
public class StoreRetrievedData implements IRetrievalPluginDataObjectsProcessor {
private final String generalDestinationUri;
private static final IUFStatusHandler statusHandler = UFStatus
.getHandler(StoreRetrievedData.class);
private final String generalDestinationUri;
private final IRetrievalDao retrievalDao;
/**
* Constructor.
*
* @param generalDestinationUri
* the destination uri most plugin data will travel through
*/
public StoreRetrievedData(String generalDestinationUri) {
public StoreRetrievedData(String generalDestinationUri,
IRetrievalDao retrievalDao) {
this.generalDestinationUri = generalDestinationUri;
this.retrievalDao = retrievalDao;
}
/**
@ -80,22 +88,34 @@ public class StoreRetrievedData implements IRetrievalPluginDataObjectsProcessor
*/
@Override
public void processRetrievedPluginDataObjects(
RetrievalPluginDataObjects retrievalPluginDataObjects)
RetrievalResponseXml retrievalPluginDataObjects)
throws Exception {
Map<String, PluginDataObject[]> pluginDataObjects = Maps.newHashMap();
final RetrievalRequestRecord requestRecord = retrievalPluginDataObjects
.getRequestRecord();
final List<RetrievalAttributePluginDataObjects> retrievalAttributePluginDataObjects = retrievalPluginDataObjects
final RetrievalRequestRecord requestRecord = retrievalDao
.getById(retrievalPluginDataObjects.getRequestRecord());
final List<RetrievalResponseWrapper> retrievalAttributePluginDataObjects = retrievalPluginDataObjects
.getRetrievalAttributePluginDataObjects();
final Retrieval retrieval = requestRecord.getRetrievalObj();
final Iterator<RetrievalAttribute> attributesIter = retrieval
.getAttributes().iterator();
final ServiceType serviceType = retrieval.getServiceType();
final RetrievalAdapter serviceRetrievalAdapter = ServiceTypeFactory
.retrieveServiceRetrievalAdapter(serviceType);
for (RetrievalAttributePluginDataObjects pluginDataObjectEntry : retrievalAttributePluginDataObjects) {
for (RetrievalResponseWrapper pluginDataObjectEntry : retrievalAttributePluginDataObjects) {
if (!attributesIter.hasNext()) {
statusHandler
.warn("Did not find a RetrievalAttribute to match the retrieval response! Skipping response...");
}
// Restore the attribute xml prior to processing the response
final IRetrievalResponse retrievalResponse = pluginDataObjectEntry
.getRetrievalResponse();
retrievalResponse.setAttribute(attributesIter.next());
Map<String, PluginDataObject[]> value = serviceRetrievalAdapter
.processResponse(pluginDataObjectEntry
.getRetrievalResponse());
.processResponse(retrievalResponse);
if (value == null || value.isEmpty()) {
continue;
@ -114,8 +134,7 @@ public class StoreRetrievedData implements IRetrievalPluginDataObjectsProcessor
pluginDataObjects.put(key, objectsForPlugin);
}
final RetrievalAttribute attXML = pluginDataObjectEntry
.getAttributeXml();
final RetrievalAttribute attXML = retrievalResponse.getAttribute();
for (Entry<String, PluginDataObject[]> entry : pluginDataObjects
.entrySet()) {
final String pluginName = entry.getKey();
@ -155,8 +174,8 @@ public class StoreRetrievedData implements IRetrievalPluginDataObjectsProcessor
String pluginName = pdos[0].getPluginName();
if (pluginName != null) {
RetrievalPersistUtil.routePlugin(generalDestinationUri,
pluginName, pdos);
RetrievalPersistUtil.routePlugin(generalDestinationUri, pluginName,
pdos);
}
}

View file

@ -32,6 +32,7 @@ import com.raytheon.uf.common.datadelivery.retrieval.xml.RetrievalAttribute;
* ------------ ---------- ----------- --------------------------
* Jan 16, 2011 dhladky Initial creation
* Feb 12, 2013 1543 djohnson The payload can just be an arbitrary object, implementations can define an array if required.
* Feb 15, 2013 1543 djohnson Expose the setAttributes method.
*
* </pre>
*
@ -43,10 +44,12 @@ import com.raytheon.uf.common.datadelivery.retrieval.xml.RetrievalAttribute;
public interface IRetrievalResponse {
public void setPayLoad(Object payLoad);
void setPayLoad(Object payLoad);
public Object getPayLoad();
Object getPayLoad();
public RetrievalAttribute getAttribute();
RetrievalAttribute getAttribute();
void setAttribute(RetrievalAttribute object);
}

View file

@ -19,10 +19,18 @@
**/
package com.raytheon.uf.edex.datadelivery.retrieval.opendap;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import com.raytheon.uf.common.datadelivery.retrieval.xml.RetrievalAttribute;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeTypeAdapter;
import com.raytheon.uf.edex.datadelivery.retrieval.response.RetrievalResponse;
import dods.dap.DataDDS;
/**
* {@link RetrievalResponse} for OpenDAP.
*
@ -33,6 +41,7 @@ import com.raytheon.uf.edex.datadelivery.retrieval.response.RetrievalResponse;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 12, 2013 1543 djohnson Initial creation
* Feb 15, 2013 1543 djohnson Only allow DataDDS payloads.
*
* </pre>
*
@ -40,8 +49,14 @@ import com.raytheon.uf.edex.datadelivery.retrieval.response.RetrievalResponse;
* @version 1.0
*/
@DynamicSerializeTypeAdapter(factory = OpenDapRetrievalResponseSerializer.class)
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class OpenDapRetrievalResponse extends RetrievalResponse {
@XmlElement
@XmlJavaTypeAdapter(value = OpenDapRetrievalResponseSerializer.class)
private DataDDS payload;
/**
* Constructor.
*/
@ -58,4 +73,24 @@ public class OpenDapRetrievalResponse extends RetrievalResponse {
super(attribute);
}
/**
* {@inheritDoc}
*/
@Override
public void setPayLoad(Object payload) {
if (payload != null && (!(payload instanceof DataDDS))) {
throw new IllegalArgumentException(
"Payload must be a DataDDS instance, not "
+ payload.getClass().getName());
}
this.payload = DataDDS.class.cast(payload);
}
/**
* {@inheritDoc}
*/
@Override
public DataDDS getPayLoad() {
return payload;
}
}

View file

@ -19,6 +19,8 @@
**/
package com.raytheon.uf.edex.datadelivery.retrieval.opendap;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import com.raytheon.uf.common.datadelivery.retrieval.xml.RetrievalAttribute;
import com.raytheon.uf.common.serialization.IDeserializationContext;
import com.raytheon.uf.common.serialization.ISerializationContext;
@ -37,13 +39,15 @@ import dods.dap.DataDDS;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 12, 2013 1543 djohnson Initial creation
* Feb 15, 2013 1543 djohnson Also can be used as JAXB adapter for DataDDS.
*
* </pre>
*
* @author djohnson
* @version 1.0
*/
public class OpenDapRetrievalResponseSerializer implements
public class OpenDapRetrievalResponseSerializer extends
XmlAdapter<byte[], DataDDS> implements
ISerializationTypeAdapter<OpenDapRetrievalResponse> {
/**
@ -53,8 +57,11 @@ public class OpenDapRetrievalResponseSerializer implements
public void serialize(ISerializationContext serializer,
OpenDapRetrievalResponse object) throws SerializationException {
serializer.writeObject(object.getAttribute());
serializer.writeBinary(DodsUtils
.convertDataDdsToByteArray((DataDDS) object.getPayLoad()));
try {
serializer.writeBinary(marshal(object.getPayLoad()));
} catch (Exception e) {
throw new SerializationException(e);
}
}
/**
@ -65,8 +72,29 @@ public class OpenDapRetrievalResponseSerializer implements
IDeserializationContext deserializer) throws SerializationException {
OpenDapRetrievalResponse response = new OpenDapRetrievalResponse();
response.setAttribute((RetrievalAttribute) deserializer.readObject());
response.setPayLoad(DodsUtils.restoreDataDdsFromByteArray(deserializer
.readBinary()));
try {
response.setPayLoad(unmarshal(deserializer.readBinary()));
} catch (Exception e) {
throw new SerializationException(e);
}
return response;
}
/**
* {@inheritDoc}
*/
@Override
public DataDDS unmarshal(byte[] v)
throws Exception {
return DodsUtils.restoreDataDdsFromByteArray(v);
}
/**
* {@inheritDoc}
*/
@Override
public byte[] marshal(DataDDS v)
throws Exception {
return DodsUtils.convertDataDdsToByteArray(v);
}
}

View file

@ -21,6 +21,10 @@ package com.raytheon.uf.edex.datadelivery.retrieval.response;
**/
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import com.raytheon.uf.common.datadelivery.retrieval.xml.RetrievalAttribute;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
@ -36,6 +40,7 @@ import com.raytheon.uf.edex.datadelivery.retrieval.interfaces.IRetrievalResponse
* ------------ ---------- ----------- --------------------------
* Jan 07, 2011 dhladky Initial creation
* Feb 12, 2013 1543 djohnson Abstract class now.
* Feb 15, 2013 1543 djohnson Sub-classes must implement payload methods, make JAXBable.
*
* </pre>
*
@ -44,15 +49,14 @@ import com.raytheon.uf.edex.datadelivery.retrieval.interfaces.IRetrievalResponse
* @author dhladky
* @version 1.0
*/
@XmlAccessorType(XmlAccessType.NONE)
@DynamicSerialize
public abstract class RetrievalResponse implements IRetrievalResponse {
@XmlElement
@DynamicSerializeElement
private RetrievalAttribute attribute;
@DynamicSerializeElement
private Object payLoad;
public RetrievalResponse() {
}
@ -61,21 +65,12 @@ public abstract class RetrievalResponse implements IRetrievalResponse {
this.attribute = attribute;
}
@Override
public void setPayLoad(Object payLoad) {
this.payLoad = payLoad;
}
@Override
public Object getPayLoad() {
return payLoad;
}
@Override
public RetrievalAttribute getAttribute() {
return attribute;
}
@Override
public void setAttribute(RetrievalAttribute attribute) {
this.attribute = attribute;
}

View file

@ -42,6 +42,7 @@ import com.raytheon.uf.common.util.TestUtil;
* ------------ ---------- ----------- --------------------------
* Feb 01, 2013 1543 djohnson Initial creation
* Feb 12, 2013 1543 djohnson Can only test the retrieval response is now not null.
* Feb 15, 2013 1543 djohnson Some renames.
*
* </pre>
*
@ -59,14 +60,14 @@ public class DeserializeRetrievedDataFromDirectoryTest {
public void deserializesRetrievedDataFromAFileInTheTargetDirectory()
throws Exception {
RetrievalPluginDataObjects retrievalPluginDataObjects = RetrievalPluginDataObjectsFixture.INSTANCE
RetrievalResponseXml retrievalPluginDataObjects = RetrievalPluginDataObjectsFixture.INSTANCE
.get();
new SerializeRetrievedDataToDirectory(directory)
.processRetrievedPluginDataObjects(retrievalPluginDataObjects);
final RetrievalPluginDataObjects restored = service
.findRetrievalPluginDataObjects();
final RetrievalResponseXml restored = service
.findRetrievals();
// Just make sure the payload is present
assertThat(restored.getRetrievalAttributePluginDataObjects().get(0)
@ -77,13 +78,13 @@ public class DeserializeRetrievedDataFromDirectoryTest {
public void deletesFileAfterRetrievingFromTheTargetDirectory()
throws Exception {
RetrievalPluginDataObjects retrievalPluginDataObjects = RetrievalPluginDataObjectsFixture.INSTANCE
RetrievalResponseXml retrievalPluginDataObjects = RetrievalPluginDataObjectsFixture.INSTANCE
.get();
new SerializeRetrievedDataToDirectory(directory)
.processRetrievedPluginDataObjects(retrievalPluginDataObjects);
service.findRetrievalPluginDataObjects();
service.findRetrievals();
assertThat(directory, hasNoFiles());
}
@ -93,14 +94,14 @@ public class DeserializeRetrievedDataFromDirectoryTest {
new File(directory, "subDir1").mkdirs();
service.findRetrievalPluginDataObjects();
service.findRetrievals();
}
@Test
public void returnsNullWhenNoFileInTheTargetDirectory() throws Exception {
final RetrievalPluginDataObjects restored = service
.findRetrievalPluginDataObjects();
final RetrievalResponseXml restored = service
.findRetrievals();
assertNull(restored);
}

View file

@ -42,7 +42,7 @@ import com.raytheon.uf.edex.datadelivery.retrieval.db.RetrievalRequestRecord.Sta
import com.raytheon.uf.edex.datadelivery.retrieval.interfaces.IRetrievalResponse;
/**
* Test {@link PerformRetrievalPluginDataObjectsFinder}.
* Test {@link PerformRetrievalsThenReturnFinder}.
*
* <pre>
*
@ -123,7 +123,7 @@ public class PerformRetrievalPluginDataObjectsFinderTest {
IRetrievalResponse retrievalResponse = mock(IRetrievalResponse.class);
when(retrievalResponse.getPayLoad()).thenReturn(null);
PerformRetrievalPluginDataObjectsFinder.setCompletionStateFromResponse(
PerformRetrievalsThenReturnFinder.setCompletionStateFromResponse(
retrievalThatDoesNotThrowException, retrievalResponse);
assertThat(retrievalThatDoesNotThrowException.getState(),
@ -131,7 +131,7 @@ public class PerformRetrievalPluginDataObjectsFinderTest {
}
private void processRetrieval(RetrievalRequestRecord retrieval) {
final PerformRetrievalPluginDataObjectsFinder pluginDataObjectsFinder = new PerformRetrievalPluginDataObjectsFinder(
final PerformRetrievalsThenReturnFinder pluginDataObjectsFinder = new PerformRetrievalsThenReturnFinder(
Network.OPSNET, MOCK_DAO);
pluginDataObjectsFinder.process(retrieval);
}

View file

@ -31,7 +31,7 @@ import com.raytheon.uf.edex.datadelivery.retrieval.interfaces.IRetrievalRequestB
import com.raytheon.uf.edex.datadelivery.retrieval.opendap.MockOpenDapRetrievalAdapter;
/**
* Fixture for {@link RetrievalPluginDataObjects} instances.
* Fixture for {@link RetrievalResponseXml} instances.
*
* <pre>
*
@ -41,6 +41,7 @@ import com.raytheon.uf.edex.datadelivery.retrieval.opendap.MockOpenDapRetrievalA
* ------------ ---------- ----------- --------------------------
* Feb 01, 2013 1543 djohnson Initial creation
* Feb 12, 2013 1543 djohnson No longer set plugin data objects themselves, just retrieval attributes.
* Feb 15, 2013 1543 djohnson Class renames.
*
* </pre>
*
@ -49,7 +50,7 @@ import com.raytheon.uf.edex.datadelivery.retrieval.opendap.MockOpenDapRetrievalA
*/
public class RetrievalPluginDataObjectsFixture extends
AbstractFixture<RetrievalPluginDataObjects> {
AbstractFixture<RetrievalResponseXml> {
public static final RetrievalPluginDataObjectsFixture INSTANCE = new RetrievalPluginDataObjectsFixture();
@ -64,16 +65,15 @@ public class RetrievalPluginDataObjectsFixture extends
* {@inheritDoc}
*/
@Override
public RetrievalPluginDataObjects get(long seedValue) {
public RetrievalResponseXml get(long seedValue) {
RetrievalRequestRecord requestRecord = RetrievalRequestRecordFixture.INSTANCE
.get(seedValue);
List<RetrievalAttributePluginDataObjects> retrievalAttributePluginDataObjects = new ArrayList<RetrievalAttributePluginDataObjects>();
List<RetrievalResponseWrapper> retrievalAttributePluginDataObjects = new ArrayList<RetrievalResponseWrapper>();
try {
for (final RetrievalAttribute attribute : requestRecord
.getRetrievalObj().getAttributes()) {
retrievalAttributePluginDataObjects
.add(new RetrievalAttributePluginDataObjects(
attribute,
.add(new RetrievalResponseWrapper(
new MockOpenDapRetrievalAdapter()
.performRequest(new IRetrievalRequestBuilder() {
@Override
@ -102,8 +102,8 @@ public class RetrievalPluginDataObjectsFixture extends
throw new RuntimeException(e);
}
final RetrievalPluginDataObjects retrievalPluginDataObjects = new RetrievalPluginDataObjects(
requestRecord, retrievalAttributePluginDataObjects);
final RetrievalResponseXml retrievalPluginDataObjects = new RetrievalResponseXml(
requestRecord.getId(), retrievalAttributePluginDataObjects);
return retrievalPluginDataObjects;
}
}

View file

@ -19,12 +19,15 @@
**/
package com.raytheon.uf.edex.datadelivery.retrieval.handlers;
import com.raytheon.uf.common.datadelivery.registry.GriddedCoverageFixture;
import com.raytheon.uf.common.datadelivery.registry.Provider;
import com.raytheon.uf.common.datadelivery.registry.ProviderFixture;
import com.raytheon.uf.common.datadelivery.registry.Subscription;
import com.raytheon.uf.common.datadelivery.registry.SubscriptionBundle;
import com.raytheon.uf.common.datadelivery.registry.SubscriptionFixture;
import com.raytheon.uf.common.datadelivery.retrieval.xml.Retrieval;
import com.raytheon.uf.common.datadelivery.retrieval.xml.Retrieval.SubscriptionType;
import com.raytheon.uf.common.datadelivery.retrieval.xml.RetrievalAttribute;
import com.raytheon.uf.common.serialization.SerializationException;
import com.raytheon.uf.common.serialization.SerializationUtil;
import com.raytheon.uf.common.time.util.TimeUtil;
@ -43,6 +46,7 @@ import com.raytheon.uf.edex.datadelivery.retrieval.opendap.MockOpenDapServiceFac
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jan 30, 2013 1543 djohnson Initial creation
* Feb 15, 2013 1543 djohnson Set coverage on retrieval attributes.
*
* </pre>
*
@ -90,10 +94,16 @@ public class RetrievalRequestRecordFixture extends
rec.setState(RetrievalRequestRecord.State.PENDING);
try {
rec.setRetrieval(SerializationUtil
.transformToThrift(new MockOpenDapServiceFactory(provider)
.getRetrievalGenerator().buildRetrieval(bundle)
.iterator().next()));
final Retrieval retrieval = new MockOpenDapServiceFactory(provider)
.getRetrievalGenerator().buildRetrieval(bundle).iterator()
.next();
for (RetrievalAttribute attribute : retrieval.getAttributes()) {
attribute.setCoverage(GriddedCoverageFixture.INSTANCE
.get(seedValue));
}
rec.setRetrieval(SerializationUtil.transformToThrift(retrieval));
} catch (SerializationException e) {
throw new RuntimeException(e);
}

View file

@ -24,11 +24,11 @@ import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@ -47,6 +47,7 @@ import com.raytheon.uf.common.datadelivery.event.retrieval.DataRetrievalEvent;
import com.raytheon.uf.common.datadelivery.registry.Network;
import com.raytheon.uf.common.datadelivery.registry.Provider.ServiceType;
import com.raytheon.uf.common.datadelivery.retrieval.xml.Retrieval;
import com.raytheon.uf.common.datadelivery.retrieval.xml.RetrievalAttribute;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.event.EventBus;
import com.raytheon.uf.common.localization.PathManagerFactoryTest;
@ -75,6 +76,7 @@ import com.raytheon.uf.edex.datadelivery.retrieval.interfaces.IRetrievalResponse
* Jan 30, 2013 1543 djohnson Initial creation
* Feb 07, 2013 1543 djohnson Add test to simulate SBN retrieval task behavior.
* Feb 12, 2013 1543 djohnson Retrieval responses are now sent further down the chain.
* Feb 15, 2013 1543 djohnson Class renames.
*
* </pre>
*
@ -84,12 +86,12 @@ import com.raytheon.uf.edex.datadelivery.retrieval.interfaces.IRetrievalResponse
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { DatabaseUtil.UNIT_TEST_DB_BEANS_XML,
SpringFiles.RETRIEVAL_DATADELIVERY_DAOS_XML })
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class RetrievalTaskTest {
/**
* Places the plugin data object into a collection for inspection.
*/
public static class PlaceInCollectionProcessor implements
public class PlaceInCollectionProcessor implements
IRetrievalPluginDataObjectsProcessor {
public final List<PluginDataObject> pluginDataObjects = new ArrayList<PluginDataObject>();
@ -98,22 +100,33 @@ public class RetrievalTaskTest {
*/
@Override
public void processRetrievedPluginDataObjects(
RetrievalPluginDataObjects retrievalPluginDataObjects)
RetrievalResponseXml retrievalPluginDataObjects)
throws Exception {
final List<RetrievalAttributePluginDataObjects> retrievalAttributePluginDataObjects = retrievalPluginDataObjects
final List<RetrievalResponseWrapper> retrievalAttributePluginDataObjects = retrievalPluginDataObjects
.getRetrievalAttributePluginDataObjects();
final RetrievalRequestRecord requestRecord = retrievalPluginDataObjects
.getRequestRecord();
final RetrievalRequestRecord requestRecord = dao
.getById(retrievalPluginDataObjects.getRequestRecord());
final Retrieval retrieval = requestRecord.getRetrievalObj();
final ServiceType serviceType = retrieval.getServiceType();
final RetrievalAdapter serviceRetrievalAdapter = ServiceTypeFactory
.retrieveServiceRetrievalAdapter(serviceType);
final Iterator<RetrievalAttribute> attributesIter = retrieval
.getAttributes().iterator();
for (RetrievalAttributePluginDataObjects pluginDataObjectEntry : retrievalAttributePluginDataObjects) {
IRetrievalResponse value = pluginDataObjectEntry
for (RetrievalResponseWrapper pluginDataObjectEntry : retrievalAttributePluginDataObjects) {
if (!attributesIter.hasNext()) {
throw new RuntimeException(
"Did not find a RetrievalAttribute to match the retrieval response!");
}
// Restore the attribute xml prior to processing the response
final IRetrievalResponse response = pluginDataObjectEntry
.getRetrievalResponse();
response.setAttribute(attributesIter.next());
final Map<String, PluginDataObject[]> processed = serviceRetrievalAdapter
.processResponse(value);
.processResponse(response);
for (PluginDataObject[] pdos : processed.values()) {
pluginDataObjects.addAll(Arrays.asList(pdos));
}
@ -202,14 +215,10 @@ public class RetrievalTaskTest {
@Test
public void retrievalTaskCanStoreDataToDirectoryThatAnotherTaskProcesses()
throws Exception {
RetrievalPluginDataObjects retrievalPluginDataObjects = RetrievalPluginDataObjectsFixture.INSTANCE
.get();
dao.create(RetrievalRequestRecordFixture.INSTANCE.get());
IRetrievalPluginDataObjectsFinder retrievalDataFinder = mock(IRetrievalPluginDataObjectsFinder.class);
when(retrievalDataFinder.findRetrievalPluginDataObjects()).thenReturn(
retrievalPluginDataObjects).thenReturn(null);
IRetrievalResponseCompleter retrievalCompleter = mock(IRetrievalResponseCompleter.class);
IRetrievalsFinder retrievalDataFinder = new PerformRetrievalsThenReturnFinder(
Network.OPSNET, dao);
final File testDirectory = TestUtil
.setupTestClassDir(RetrievalTaskTest.class);
@ -217,15 +226,30 @@ public class RetrievalTaskTest {
testDirectory);
RetrievalTask downloadTask = new RetrievalTask(Network.OPSNET,
retrievalDataFinder, serializeToDirectory, retrievalCompleter);
retrievalDataFinder, serializeToDirectory,
mock(IRetrievalResponseCompleter.class), dao);
RetrievalTask readDownloadsTask = new RetrievalTask(Network.OPSNET,
new DeserializeRetrievedDataFromDirectory(testDirectory),
retrievedDataProcessor, retrievalCompleter);
retrievedDataProcessor, new RetrievalResponseCompleter(
mock(SubscriptionNotifyTask.class), dao), dao);
downloadTask.run();
final List<RetrievalRequestRecord> all = dao.getAll();
for (RetrievalRequestRecord request : all) {
assertThat(request.getState(), is(State.RUNNING));
}
readDownloadsTask.run();
final List<RetrievalRequestRecord> allRetrievals = dao.getAll();
assertThat(allRetrievals, hasSize(1));
assertThat(retrievedDataProcessor.pluginDataObjects, hasSize(2));
for (RetrievalRequestRecord request : allRetrievals) {
assertThat(request.getState(), is(State.COMPLETED));
}
}
/**
@ -242,13 +266,13 @@ public class RetrievalTaskTest {
private void runRetrievalTask() {
// Create required strategies for finding, processing, and completing
// retrievals
final IRetrievalPluginDataObjectsFinder retrievalDataFinder = new PerformRetrievalPluginDataObjectsFinder(
final IRetrievalsFinder retrievalDataFinder = new PerformRetrievalsThenReturnFinder(
Network.OPSNET, dao);
final IRetrievalResponseCompleter retrievalCompleter = new RetrievalResponseCompleter(
mock(SubscriptionNotifyTask.class), dao);
new RetrievalTask(Network.OPSNET, retrievalDataFinder,
retrievedDataProcessor, retrievalCompleter).run();
retrievedDataProcessor, retrievalCompleter, dao).run();
}
/**

View file

@ -39,6 +39,7 @@ import com.raytheon.uf.common.util.TestUtil;
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Feb 01, 2013 1543 djohnson Initial creation
* Feb 15, 2013 1543 djohnson Class renames.
*
* </pre>
*
@ -57,7 +58,7 @@ public class SerializeRetrievedDataToDirectoryTest {
public void serializesRetrievedDataToAFileInTheTargetDirectory()
throws SerializationException {
RetrievalPluginDataObjects retrievalPluginDataObjects = RetrievalPluginDataObjectsFixture.INSTANCE
RetrievalResponseXml retrievalPluginDataObjects = RetrievalPluginDataObjectsFixture.INSTANCE
.get();
service.processRetrievedPluginDataObjects(retrievalPluginDataObjects);