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:
parent
3ad71676b3
commit
f16c1507d0
24 changed files with 363 additions and 188 deletions
|
@ -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
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
|
@ -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
|
||||
*/
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue