12.4.1-4 baseline

Former-commit-id: 4767b0e069 [formerly 750b7543dd] [formerly 67a5a68300] [formerly 2a216f333c [formerly 67a5a68300 [formerly ad648deaf4d3edaabdda15184289b3a927308bd7]]]
Former-commit-id: 2a216f333c
Former-commit-id: e8514db31c64b82122112f0e87cbbf3cda2d8c2b [formerly a4e519f3cd]
Former-commit-id: a2a6a18fae
This commit is contained in:
Steve Harris 2012-04-18 15:18:16 -05:00
parent ea7fcde242
commit 98d8b3f188
1286 changed files with 117107 additions and 116024 deletions

View file

View file

View file

@ -79,17 +79,24 @@ import com.raytheon.rcm.server.Log;
import com.raytheon.rcm.server.RadarServer; import com.raytheon.rcm.server.RadarServer;
import com.raytheon.rcm.server.StatusManager.RadarStatus; import com.raytheon.rcm.server.StatusManager.RadarStatus;
public class MsgServ implements RadarEventListener, MessageListener { public class MsgServ implements RadarEventListener, MessageListener {
QueueConnection queueConn; QueueConnection queueConn;
QueueSession queueSession; QueueSession queueSession;
QueueSender queueSender; QueueSender queueSender;
TopicConnection topicConn; TopicConnection topicConn;
TopicSession topicSession; TopicSession topicSession;
TopicPublisher topicPublisher; TopicPublisher topicPublisher;
JAXBContext jaxbCtx; JAXBContext jaxbCtx;
Marshaller m; Marshaller m;
Unmarshaller u; Unmarshaller u;
Serv serv; Serv serv;
@ -110,14 +117,16 @@ public class MsgServ implements RadarEventListener, MessageListener {
TopicConnectionFactory tConnFac) { TopicConnectionFactory tConnFac) {
try { try {
queueConn = qConnFac.createQueueConnection(); queueConn = qConnFac.createQueueConnection();
queueSession = queueConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); queueSession = queueConn.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
Queue queue = queueSession.createQueue("RadarServer"); Queue queue = queueSession.createQueue("RadarServer");
queueSender = queueSession.createSender(null); queueSender = queueSession.createSender(null);
QueueReceiver qr = queueSession.createReceiver(queue); QueueReceiver qr = queueSession.createReceiver(queue);
qr.setMessageListener(this); qr.setMessageListener(this);
topicConn = tConnFac.createTopicConnection(); topicConn = tConnFac.createTopicConnection();
topicSession = topicConn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); topicSession = topicConn.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
Topic topic = topicSession.createTopic("RadarEvents"); Topic topic = topicSession.createTopic("RadarEvents");
topicPublisher = topicSession.createPublisher(topic); topicPublisher = topicSession.createPublisher(topic);
@ -158,11 +167,13 @@ public class MsgServ implements RadarEventListener, MessageListener {
try { try {
po = handleRequest(replyToDestination, ro); po = handleRequest(replyToDestination, ro);
} catch (RuntimeException e) { } catch (RuntimeException e) {
error = "Unexpected error while processing request: " + e.toString(); error = "Unexpected error while processing request: "
+ e.toString();
exc = e; exc = e;
} }
} else if (o != null) } else if (o != null)
error = String.format("Invalid request class '%s'", o.getClass()); error = String.format("Invalid request class '%s'",
o.getClass());
} else } else
error = "Invalid JMS message type"; error = "Invalid JMS message type";
@ -186,8 +197,7 @@ public class MsgServ implements RadarEventListener, MessageListener {
Log.errorf("Error processing remote request: %s", e); Log.errorf("Error processing remote request: %s", e);
return; return;
} }
TextMessage rtm = queueSession.createTextMessage( TextMessage rtm = queueSession.createTextMessage(sw.toString());
sw.toString());
String id = msg.getJMSCorrelationID(); String id = msg.getJMSCorrelationID();
if (id == null) if (id == null)
@ -212,13 +222,12 @@ public class MsgServ implements RadarEventListener, MessageListener {
Log.eventf("Got remote request %s", ro); Log.eventf("Got remote request %s", ro);
if (ro instanceof GetRadarList) if (ro instanceof GetRadarList)
po = ReplyObj.toGetRadarList( po = ReplyObj.toGetRadarList(serv.getRadarList());
serv.getRadarList());
else if (ro instanceof GetRadarConfig) { else if (ro instanceof GetRadarConfig) {
GetRadarConfig grc = (GetRadarConfig) ro; GetRadarConfig grc = (GetRadarConfig) ro;
if (grc.radarID != null) if (grc.radarID != null)
po = ReplyObj.toGetRadarConfig( po = ReplyObj
serv.getRadarConfig(grc.radarID)); .toGetRadarConfig(serv.getRadarConfig(grc.radarID));
else else
po = ReplyObj.toGetRadarConfig(serv.getAllRadarConfigs()); po = ReplyObj.toGetRadarConfig(serv.getAllRadarConfigs());
} else if (ro instanceof SetRadarConfig) { } else if (ro instanceof SetRadarConfig) {
@ -227,28 +236,26 @@ public class MsgServ implements RadarEventListener, MessageListener {
} else if (ro instanceof GetRadarStatusMessages) { } else if (ro instanceof GetRadarStatusMessages) {
GetRadarStatusMessages grs = (GetRadarStatusMessages) ro; GetRadarStatusMessages grs = (GetRadarStatusMessages) ro;
if (grs.radarID != null) if (grs.radarID != null)
po = ReplyObj.toGetRadarStatusMessages( po = ReplyObj.toGetRadarStatusMessages(createROStatus(
createROStatus(grs.radarID, grs.radarID, serv.getRadarStatus(grs.radarID)));
serv.getRadarStatus(grs.radarID)));
else { else {
ArrayList<ROStatus> status = new ArrayList<ROStatus>(); ArrayList<ROStatus> status = new ArrayList<ROStatus>();
for (Map.Entry<String, ? extends RadarStatus> e : for (Map.Entry<String, ? extends RadarStatus> e : serv
serv.getAllRadarStatus().entrySet()) { .getAllRadarStatus().entrySet()) {
status.add(createROStatus(e.getKey(), status.add(createROStatus(e.getKey(), e.getValue()));
e.getValue()));
} }
po = ReplyObj.toGetRadarStatusMessages(status); po = ReplyObj.toGetRadarStatusMessages(status);
} }
} else if (ro instanceof SendOneTimeRequests) { } else if (ro instanceof SendOneTimeRequests) {
MsgServOtrHandler handler = null; MsgServOtrHandler handler = null;
/* Correlation ID should be null so as to not intefere /*
* with the handler list on the client side. * Correlation ID should be null so as to not intefere with the
* handler list on the client side.
*/ */
/* /*
String id = msg.getJMSCorrelationID(); * String id = msg.getJMSCorrelationID(); if (id == null) id =
if (id == null) * msg.getJMSMessageID();
id = msg.getJMSMessageID();
*/ */
String id = null; String id = null;
if (replyToDestination != null) if (replyToDestination != null)
@ -268,15 +275,15 @@ public class MsgServ implements RadarEventListener, MessageListener {
GetRpsList r = (GetRpsList) ro; GetRpsList r = (GetRpsList) ro;
if (r.radarID != null) { if (r.radarID != null) {
int vcp = r.vcp != null ? r.vcp : -1; int vcp = r.vcp != null ? r.vcp : -1;
int opMode = r.opMode != null ? r.opMode : GSM.OP_MODE_MAINTENANCE; int opMode = r.opMode != null ? r.opMode
: GSM.OP_MODE_MAINTENANCE;
RpsList rpsList = serv.getRpsList(r.radarID, opMode, vcp); RpsList rpsList = serv.getRpsList(r.radarID, opMode, vcp);
po = new ReplyObj.RpsListReply(rpsList); po = new ReplyObj.RpsListReply(rpsList);
/* /*
if (rpsList != null) * if (rpsList != null) po = ReplyObj.toGetRpsList(rpsList);
po = ReplyObj.toGetRpsList(rpsList); * else error =
else * String.format("Could not retrieve RPS list for radar %s%s",
error = String.format("Could not retrieve RPS list for radar %s%s", * r.radarID, vcp != -1 ? ", VCP " + vcp : "");
r.radarID, vcp != -1 ? ", VCP " + vcp : "");
*/ */
} else } else
error = "Must specify a radar name"; error = "Must specify a radar name";
@ -301,7 +308,8 @@ public class MsgServ implements RadarEventListener, MessageListener {
po = r; po = r;
} else if (ro instanceof SendAlertRequest) { } else if (ro instanceof SendAlertRequest) {
SendAlertRequest ro2 = (SendAlertRequest) ro; SendAlertRequest ro2 = (SendAlertRequest) ro;
error = serv.sendAlertRequest(ro2.radarID, ro2.areaIndex, ro2.alertRequest); error = serv.sendAlertRequest(ro2.radarID, ro2.areaIndex,
ro2.alertRequest);
} else if (ro instanceof SendMessageToRPG) { } else if (ro instanceof SendMessageToRPG) {
SendMessageToRPG ro2 = (SendMessageToRPG) ro; SendMessageToRPG ro2 = (SendMessageToRPG) ro;
error = serv.sendMessageToRPG(ro2.radarID, ro2.message); error = serv.sendMessageToRPG(ro2.radarID, ro2.message);
@ -359,8 +367,7 @@ public class MsgServ implements RadarEventListener, MessageListener {
return; return;
} }
try { try {
TextMessage tm = topicSession.createTextMessage( TextMessage tm = topicSession.createTextMessage(sw.toString());
sw.toString());
topicPublisher.publish(tm); topicPublisher.publish(tm);
} catch (JMSException e) { } catch (JMSException e) {
Log.errorf("Error sending message: %s", e); Log.errorf("Error sending message: %s", e);
@ -374,6 +381,7 @@ public class MsgServ implements RadarEventListener, MessageListener {
class MsgServOtrHandler implements OTRHandler { class MsgServOtrHandler implements OTRHandler {
Destination destination; Destination destination;
String correlationID; String correlationID;
public MsgServOtrHandler(Destination destination, String correlationID) { public MsgServOtrHandler(Destination destination, String correlationID) {
@ -384,11 +392,12 @@ public class MsgServ implements RadarEventListener, MessageListener {
@Override @Override
public void handleOtrEvent(OtrEvent event) { public void handleOtrEvent(OtrEvent event) {
OtrEvent eventToSend = event.clone(); OtrEvent eventToSend = event.clone();
/* This OTR notification capability is currently only used to /*
* display alerts in CAVE. Thus, there is no need to send the * This OTR notification capability is currently only used to
* actual product data. Given that some products can be larger * display alerts in CAVE. Thus, there is no need to send the actual
* than one megabyte and the notification is in XML format, * product data. Given that some products can be larger than one
* this is a useful optimization. * megabyte and the notification is in XML format, this is a useful
* optimization.
*/ */
if (event.product != null if (event.product != null
&& com.raytheon.rcm.message.Message && com.raytheon.rcm.message.Message
@ -406,8 +415,7 @@ public class MsgServ implements RadarEventListener, MessageListener {
return; return;
} }
try { try {
TextMessage rtm = queueSession.createTextMessage( TextMessage rtm = queueSession.createTextMessage(sw.toString());
sw.toString());
if (correlationID != null) if (correlationID != null)
rtm.setJMSCorrelationID(correlationID); rtm.setJMSCorrelationID(correlationID);
queueSender.send(destination, rtm); queueSender.send(destination, rtm);

0
cave/build/build.ecl Normal file
View file

View file

@ -18,9 +18,13 @@
See_the_AWIPS_II_Master_Rights_File_("Master_Rights_File.pdf")_for See_the_AWIPS_II_Master_Rights_File_("Master_Rights_File.pdf")_for
further_licensing_information. further_licensing_information.
--> -->
<!--
Date DR# Engineer Description
03/26/2012 12864 zhao Changed CigVisTrendTimeout from 300 to 1800
-->
<ClimateTimeouts> <ClimateTimeouts>
<ClimateMetarTimeout>20</ClimateMetarTimeout> <ClimateMetarTimeout>20</ClimateMetarTimeout>
<WindRoseTimeout>20</WindRoseTimeout> <WindRoseTimeout>20</WindRoseTimeout>
<CigVisDistTimeout>90</CigVisDistTimeout> <CigVisDistTimeout>90</CigVisDistTimeout>
<CigVisTrendTimeout>300</CigVisTrendTimeout> <CigVisTrendTimeout>1800</CigVisTrendTimeout>
</ClimateTimeouts> </ClimateTimeouts>

View file

@ -452,7 +452,8 @@ class Procedure (SmartScript.SmartScript):
" locked by another user." " locked by another user."
self.statusBarMsg(msg, "S") self.statusBarMsg(msg, "S")
continue continue
gustGrid[windTooHigh] = windGrid
gustGrid = where(windTooHigh, windGrid, gustGrid)
self.createGrid(MODEL, "WindGust", "SCALAR", gustGrid, tr) self.createGrid(MODEL, "WindGust", "SCALAR", gustGrid, tr)
gustDict[tr] = gustGrid # update the gustDict gustDict[tr] = gustGrid # update the gustDict

View file

@ -66,7 +66,7 @@ VariableList=[]
VariableList.append(("Value:",1,"numeric")) VariableList.append(("Value:",1,"numeric"))
VariableList.append(("Action:","Add","radio",["Add","Subtract","Multiply","Divide"])) VariableList.append(("Action:","Add","radio",["Add","Subtract","Multiply","Divide"]))
VariableList.append(("Elevation:","None","radio",["None","Mountain","Valley","Specific"])) VariableList.append(("Elevation:","None","radio",["None","Mountain","Valley","Specific"]))
VariableList.append(("Vectors:","Magnitude","radio",["Both","Magnitude","Direction"])) VariableList.append(("Vectors:","Magnitude","radio",["Magnitude","Direction"]))
VariableList.append(("Edge:","Flat","radio",["Flat","Edge","Taper"])) VariableList.append(("Edge:","Flat","radio",["Flat","Edge","Taper"]))
VariableList.append(("Edge Width:",5,"scale",[1,30],1)) VariableList.append(("Edge Width:",5,"scale",[1,30],1))
VariableList.append(("Specific Elevation:",5000,"numeric")) VariableList.append(("Specific Elevation:",5000,"numeric"))
@ -76,7 +76,7 @@ class Tool (SmartScript.SmartScript):
SmartScript.SmartScript.__init__(self, dbss) SmartScript.SmartScript.__init__(self, dbss)
def preProcessTool(self): def preProcessTool(self):
self.savemode=self.getVectorEditMode() self.savemode=self.getVectorEditMode()
self.setVectorEditMode("Both") self.setVectorEditMode("Magnitude")
def postProcessTool(self): def postProcessTool(self):
self.setVectorEditMode(self.savemode) self.setVectorEditMode(self.savemode)
def preProcessGrid(self,Topo,editArea,varDict): def preProcessGrid(self,Topo,editArea,varDict):
@ -167,7 +167,7 @@ class Tool (SmartScript.SmartScript):
else: else:
mag=variableElement[0] mag=variableElement[0]
dir=variableElement[1] dir=variableElement[1]
if ((vect=="Magnitude")or(vect=="Both")): if (vect=="Magnitude"):
if (action=="Add"): if (action=="Add"):
newmag=mag+(self.deltagrid*deltavalue) newmag=mag+(self.deltagrid*deltavalue)
elif (action=="Subtract"): elif (action=="Subtract"):

View file

@ -162,6 +162,7 @@ class DiscretePhrases(PhraseBuilder.PhraseBuilder):
timeDescriptor = self.headlinesTimeRange_descriptor( timeDescriptor = self.headlinesTimeRange_descriptor(
tree, node, key, tr, areaLabel, issuanceTime) tree, node, key, tr, areaLabel, issuanceTime)
from com.raytheon.uf.common.dataplugin.gfe.discrete import DiscreteKey
headlineWords = DiscreteKey.discreteDefinition(siteId).keyDesc( headlineWords = DiscreteKey.discreteDefinition(siteId).keyDesc(
"Hazards" + "_SFC", key) "Hazards" + "_SFC", key)
if headlineWords == "": # Don't process the "<None>" key if headlineWords == "": # Don't process the "<None>" key

View file

@ -407,6 +407,12 @@ public class CoopPrecipDataCubeAdapter implements IDataCubeAdapter {
return null; return null;
} }
@Override
public String recordKeyGenerator(PluginDataObject pdo) {
// TODO Auto-generated method stub
return null;
}
@Override @Override
public void initInventory() { public void initInventory() {
// TODO Auto-generated method stub // TODO Auto-generated method stub

View file

@ -87,7 +87,6 @@ public abstract class AbstractDbMapResource<T extends AbstractDbMapResourceData,
if (font != null) { if (font != null) {
font.dispose(); font.dispose();
font = null;
} }
} }

View file

@ -540,7 +540,7 @@ public class DbMapResource extends
if (shadedShape != null) { if (shadedShape != null) {
shadedShape.dispose(); shadedShape.dispose();
} }
lastExtent = null;
super.disposeInternal(); super.disposeInternal();
} }

View file

@ -133,4 +133,11 @@ public abstract class AbstractGraphicsFactoryAdapter {
public abstract Canvas constrcutCanvas(Composite canvasComp) public abstract Canvas constrcutCanvas(Composite canvasComp)
throws VizException; throws VizException;
/**
* Dispose of the canvas, it can be assumed the canvas is the same type
* created from constructCanvas
*
* @param canvas
*/
public abstract void disposeCanvas(Canvas canvas);
} }

View file

@ -45,16 +45,11 @@ public class DrawableImage {
private PixelCoverage coverage; private PixelCoverage coverage;
private RasterMode mode; private RasterMode mode = RasterMode.SYNCHRONOUS;
public DrawableImage(IImage image, PixelCoverage coverage) { public DrawableImage(IImage image, PixelCoverage coverage) {
this(image, coverage, RasterMode.SYNCHRONOUS);
}
public DrawableImage(IImage image, PixelCoverage coverage, RasterMode mode) {
this.image = image; this.image = image;
this.coverage = coverage; this.coverage = coverage;
this.mode = mode;
} }
public IImage getImage() { public IImage getImage() {

View file

@ -39,8 +39,6 @@ import com.raytheon.uf.viz.core.drawables.IRenderableDisplay;
import com.raytheon.uf.viz.core.drawables.IShadedShape; import com.raytheon.uf.viz.core.drawables.IShadedShape;
import com.raytheon.uf.viz.core.drawables.IWireframeShape; import com.raytheon.uf.viz.core.drawables.IWireframeShape;
import com.raytheon.uf.viz.core.drawables.PaintProperties; import com.raytheon.uf.viz.core.drawables.PaintProperties;
import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension.IGraphicsExtensionInterface;
import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension;
import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.geom.PixelCoordinate; import com.raytheon.uf.viz.core.geom.PixelCoordinate;
import com.vividsolutions.jts.geom.LinearRing; import com.vividsolutions.jts.geom.LinearRing;
@ -66,7 +64,7 @@ import com.vividsolutions.jts.geom.LinearRing;
* @author chammack * @author chammack
* @version 1 * @version 1
*/ */
public interface IGraphicsTarget extends IImagingExtension { public interface IGraphicsTarget {
/** Defines alignment characteristics */ /** Defines alignment characteristics */
public static enum HorizontalAlignment { public static enum HorizontalAlignment {
@ -191,6 +189,24 @@ public interface IGraphicsTarget extends IImagingExtension {
public abstract boolean drawRaster(IImage image, PixelCoverage extent, public abstract boolean drawRaster(IImage image, PixelCoverage extent,
PaintProperties paintProps) throws VizException; PaintProperties paintProps) throws VizException;
/**
* Draw a raster to a target, given an extent and an alpha (transparency)
* value. Assumes synchronous operation.
*
* This operation will block on unavailable data.
*
* @param image
* the image reference object to draw
* @param extent
* the extent of the drawable area
* @param paintProps
* the paint properties
* @return status whether the raster was able to be drawn
* @throws VizException
*/
public abstract boolean drawRasters(PaintProperties paintProps,
DrawableImage... images) throws VizException;
/** /**
* Draw a raster to a target, given an extent and an alpha (transparency) * Draw a raster to a target, given an extent and an alpha (transparency)
* value * value
@ -646,6 +662,15 @@ public interface IGraphicsTarget extends IImagingExtension {
*/ */
public abstract boolean isNeedsRefresh(); public abstract boolean isNeedsRefresh();
/**
* Stage an image
*
* @param image
* the image to stage
* @throws VizException
*/
public abstract void stage(final IImage image) throws VizException;
/** /**
* Sets the background color of the panes. * Sets the background color of the panes.
* *
@ -655,10 +680,6 @@ public interface IGraphicsTarget extends IImagingExtension {
public abstract void setBackgroundColor(RGB backgroundColor); public abstract void setBackgroundColor(RGB backgroundColor);
/** /**
* DEPRECATED: This method has no effect. IGraphicsTargets are not
* responsible to drawing a colorbar. Use method drawColorRamp to draw a
* color ramp
*
* Sets whether to display a builtin colorbar when displaying colormapped * Sets whether to display a builtin colorbar when displaying colormapped
* images (Defaults to true) * images (Defaults to true)
* *
@ -666,7 +687,6 @@ public interface IGraphicsTarget extends IImagingExtension {
* boolean flag indicating whether to display the built in * boolean flag indicating whether to display the built in
* colorbar * colorbar
*/ */
@Deprecated
public abstract void setUseBuiltinColorbar(boolean isColorbarDisplayed); public abstract void setUseBuiltinColorbar(boolean isColorbarDisplayed);
/** /**
@ -1024,7 +1044,6 @@ public interface IGraphicsTarget extends IImagingExtension {
* @param extensionClass * @param extensionClass
* @return * @return
*/ */
public abstract <T extends IGraphicsExtensionInterface> T getExtension( public abstract <T> T getExtension(Class<T> extensionClass)
Class<T> extensionClass) throws VizException; throws VizException;
} }

View file

@ -19,13 +19,14 @@
**/ **/
package com.raytheon.uf.viz.core; package com.raytheon.uf.viz.core;
import org.geotools.coverage.grid.GeneralGridGeometry; import org.geotools.coverage.grid.GridGeometry2D;
import org.opengis.referencing.operation.MathTransform;
import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.drawables.IRenderable;
import com.raytheon.uf.viz.core.rsc.hdf5.ImageTile;
/** /**
* Base for any mesh 2D/3D, Quad/Triangle -- etc. See {@link PixelCoverage} / * Base for any mesh 2D/3D, Quad/Triangle -- etc
* {@link DrawableImage}
* *
* <pre> * <pre>
* SOFTWARE HISTORY * SOFTWARE HISTORY
@ -39,7 +40,27 @@ import com.raytheon.uf.viz.core.exception.VizException;
* @version 1.0 * @version 1.0
*/ */
public interface IMesh { public interface IMesh extends IRenderable {
/**
* Calculate all the mesh vertices and texture coordinates
*
* @param pc
* @param tile
* @param toLatLon
* translate the tile coordinates to lat/lon coords if the tile
* envelope is not already
*/
public abstract void calculateMesh(PixelCoverage pc, ImageTile tile,
MathTransform toLatLon);
/**
* Calculate all the mesh vertices and texture coordinates
*
* @param pc
* @param gg
*/
public void calculateMesh(PixelCoverage pc, GridGeometry2D gg);
/** /**
* Dispose of the mesh data * Dispose of the mesh data
@ -52,12 +73,4 @@ public interface IMesh {
* @param extent * @param extent
*/ */
public boolean intersects(IExtent extent); public boolean intersects(IExtent extent);
/**
* Reprojects the mesh into the new target geometry
*
* @param targetGeometry
*/
public void reproject(GeneralGridGeometry targetGeometry)
throws VizException;
} }

View file

@ -77,6 +77,8 @@ public class Colormapper {
boolean log = parameters.isLogarithmic(); boolean log = parameters.isLogarithmic();
double logFactor = parameters.getLogFactor(); double logFactor = parameters.getLogFactor();
boolean mirror = parameters.isMirror(); boolean mirror = parameters.isMirror();
double naturalMin = parameters.getDataMin();
double naturalMax = parameters.getDataMax();
double cmapMin = parameters.getColorMapMin(); double cmapMin = parameters.getColorMapMin();
double cmapMax = parameters.getColorMapMax(); double cmapMax = parameters.getColorMapMax();
int colorMapSz = parameters.getColorMap().getSize(); int colorMapSz = parameters.getColorMap().getSize();

View file

@ -34,6 +34,7 @@ import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint; import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType; import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType;
import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest; import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest;
import com.raytheon.uf.common.dataquery.requests.TimeQueryRequestSet;
import com.raytheon.uf.common.datastorage.Request; import com.raytheon.uf.common.datastorage.Request;
import com.raytheon.uf.common.datastorage.StorageException; import com.raytheon.uf.common.datastorage.StorageException;
import com.raytheon.uf.common.datastorage.records.IDataRecord; import com.raytheon.uf.common.datastorage.records.IDataRecord;
@ -41,7 +42,10 @@ import com.raytheon.uf.common.pointdata.PointDataContainer;
import com.raytheon.uf.common.time.BinOffset; import com.raytheon.uf.common.time.BinOffset;
import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.viz.core.catalog.LayerProperty; import com.raytheon.uf.viz.core.catalog.LayerProperty;
import com.raytheon.uf.viz.core.catalog.ScriptCreator;
import com.raytheon.uf.viz.core.comm.Loader;
import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.requests.ThriftClient;
/** /**
* The DataCubeContainer is responsible for handling requests for data times, * The DataCubeContainer is responsible for handling requests for data times,
@ -97,7 +101,7 @@ public class DataCubeContainer {
if (container.adapter != null) { if (container.adapter != null) {
synchronized (container.adapter) { synchronized (container.adapter) {
Boolean initialized = initializedMap.get(container.adapter); Boolean initialized = initializedMap.get(container.adapter);
if (initialized == null || !initialized) { if (!initialized) {
container.adapter.initInventory(); container.adapter.initInventory();
initializedMap.put(container.adapter, true); initializedMap.put(container.adapter, true);
} }
@ -117,9 +121,21 @@ public class DataCubeContainer {
} }
} }
} }
if (adapter == null) { }
// Construct default adapter for plugin if none found
adapter = new DefaultDataCubeAdapter(plugin); private IDataRecord[] getDataRecordInternal(PluginDataObject obj)
throws VizDataCubeException {
if (adapter != null) {
return adapter.getRecord(obj);
} else {
IDataRecord record = null;
try {
record = CubeUtil.retrieveData(obj, pluginName);
} catch (VizException e) {
throw new VizDataCubeException(
"Error retrieving 2D grid record.", e);
}
return new IDataRecord[] { record };
} }
} }
@ -137,7 +153,23 @@ public class DataCubeContainer {
*/ */
public static IDataRecord[] getDataRecord(PluginDataObject obj) public static IDataRecord[] getDataRecord(PluginDataObject obj)
throws VizDataCubeException { throws VizDataCubeException {
return getInstance(obj.getPluginName()).adapter.getRecord(obj); return getInstance(obj.getPluginName()).getDataRecordInternal(obj);
}
private IDataRecord[] getDataRecordInternal(PluginDataObject obj,
Request req, String dataset) throws VizDataCubeException {
if (adapter != null) {
return adapter.getRecord(obj, req, dataset);
} else {
IDataRecord record = null;
try {
record = CubeUtil.retrieveData(obj, pluginName, req, dataset);
} catch (VizException e) {
throw new VizDataCubeException(
"Error retrieving 2D grid record.", e);
}
return new IDataRecord[] { record };
}
} }
/** /**
@ -156,10 +188,29 @@ public class DataCubeContainer {
*/ */
public static IDataRecord[] getDataRecord(PluginDataObject obj, public static IDataRecord[] getDataRecord(PluginDataObject obj,
Request req, String dataset) throws VizDataCubeException { Request req, String dataset) throws VizDataCubeException {
return getInstance(obj.getPluginName()).adapter.getRecord(obj, req, return getInstance(obj.getPluginName()).getDataRecordInternal(obj, req,
dataset); dataset);
} }
private void getDataRecordsInternal(List<PluginDataObject> objs,
Request req, String dataset) throws VizDataCubeException {
if (adapter != null) {
adapter.getRecords(objs, req, dataset);
} else {
for (PluginDataObject obj : objs) {
IDataRecord record = null;
try {
record = CubeUtil.retrieveData(obj, pluginName, req,
dataset);
} catch (VizException e) {
throw new VizDataCubeException(
"Error retrieving 2D grid record.", e);
}
obj.setMessageData(record);
}
}
}
/** /**
* For each PluginDataObject requests the DataRecords specified by Request * For each PluginDataObject requests the DataRecords specified by Request
* and dataSet and stores those DataRecords in the PluginDataObject message * and dataSet and stores those DataRecords in the PluginDataObject message
@ -187,25 +238,41 @@ public class DataCubeContainer {
"All PluginDataObjects must be for the same plugin"); "All PluginDataObjects must be for the same plugin");
} }
} }
getInstance(pluginName).adapter.getRecords(objs, req, dataset); getInstance(pluginName).getDataRecordsInternal(objs, req, dataset);
}
private PointDataContainer getPointDataInternal(String[] params,
Map<String, RequestConstraint> map) throws VizException {
if (adapter != null) {
return adapter.getPoints(pluginName, params, map);
} else {
return null;
}
} }
public static PointDataContainer getPointData(String plugin, public static PointDataContainer getPointData(String plugin,
String[] params, Map<String, RequestConstraint> map) String[] params, Map<String, RequestConstraint> map)
throws VizException { throws VizException {
DataCubeContainer container = getInstance(plugin); return getInstance(plugin).getPointDataInternal(params, map);
return container.adapter.getPoints(container.pluginName, params, map); }
private PointDataContainer getPointDataInternal(String[] params,
String levelKey, Map<String, RequestConstraint> map)
throws VizException {
if (levelKey == null) {
return getPointData(pluginName, params, map);
}
if (adapter != null) {
return adapter.getPoints(pluginName, params, levelKey, map);
} else {
return null;
}
} }
public static PointDataContainer getPointData(String plugin, public static PointDataContainer getPointData(String plugin,
String[] params, String levelKey, Map<String, RequestConstraint> map) String[] params, String levelKey, Map<String, RequestConstraint> map)
throws VizException { throws VizException {
DataCubeContainer container = getInstance(plugin); return getInstance(plugin).getPointDataInternal(params, levelKey, map);
if (levelKey == null) {
return getPointData(container.pluginName, params, map);
}
return container.adapter.getPoints(container.pluginName, params,
levelKey, map);
} }
public static DataTime[] performTimeQuery( public static DataTime[] performTimeQuery(
@ -241,6 +308,20 @@ public class DataCubeContainer {
new DataTime[0]); new DataTime[0]);
} }
public List<List<DataTime>> performTimeQueriesInternal(
List<TimeQueryRequest> requests) throws VizException {
if (adapter == null) {
TimeQueryRequestSet set = new TimeQueryRequestSet();
set.setRequests(requests.toArray(new TimeQueryRequest[0]));
@SuppressWarnings("unchecked")
List<List<DataTime>> result = (List<List<DataTime>>) ThriftClient
.sendRequest(set);
return result;
} else {
return adapter.timeQuery(requests);
}
}
/** /**
* Perform a bulk time query request when all requests have the same plugin * Perform a bulk time query request when all requests have the same plugin
* type. * type.
@ -253,7 +334,7 @@ public class DataCubeContainer {
if (requests.isEmpty()) { if (requests.isEmpty()) {
return Collections.emptyList(); return Collections.emptyList();
} }
return getInstance(pluginName).adapter.timeQuery(requests); return getInstance(pluginName).performTimeQueriesInternal(requests);
} }
/** /**
@ -265,8 +346,8 @@ public class DataCubeContainer {
*/ */
public static List<List<DataTime>> performTimeQueries(String pluginName, public static List<List<DataTime>> performTimeQueries(String pluginName,
TimeQueryRequest... requests) throws VizException { TimeQueryRequest... requests) throws VizException {
return getInstance(pluginName).adapter.timeQuery(Arrays return getInstance(pluginName).performTimeQueriesInternal(
.asList(requests)); Arrays.asList(requests));
} }
/** /**
@ -322,6 +403,17 @@ public class DataCubeContainer {
return result; return result;
} }
private synchronized List<Object> getDataInternal(LayerProperty property,
int timeOut) throws VizException {
if (adapter == null) {
String scriptToExecute = ScriptCreator.createScript(property);
return Loader
.loadScripts(new String[] { scriptToExecute }, timeOut);
} else {
return adapter.getData(property, timeOut);
}
}
/** /**
* Returns a list of responses for the requested layer property. If a * Returns a list of responses for the requested layer property. If a
* derived parameter, this will piece together the base parameteters. * derived parameter, this will piece together the base parameteters.
@ -340,11 +432,31 @@ public class DataCubeContainer {
.getEntryQueryParameters(false); .getEntryQueryParameters(false);
String pluginName = originalQuery.get("pluginName") String pluginName = originalQuery.get("pluginName")
.getConstraintValue(); .getConstraintValue();
return getInstance(pluginName).adapter.getData(property, timeOut); return getInstance(pluginName).getDataInternal(property, timeOut);
}
private Object getInventoryInternal() {
if (adapter != null) {
return adapter.getInventory();
} else {
return null;
}
} }
public static Object getInventory(String plugin) { public static Object getInventory(String plugin) {
return getInstance(plugin).adapter.getInventory(); return getInstance(plugin).getInventoryInternal();
}
private List<Map<String, RequestConstraint>> getBaseUpdateConstraintsInternal(
Map<String, RequestConstraint> constraints) {
if (adapter != null) {
return adapter.getBaseUpdateConstraints(constraints);
} else {
List<Map<String, RequestConstraint>> result = new ArrayList<Map<String, RequestConstraint>>(
1);
result.add(constraints);
return result;
}
} }
public static List<Map<String, RequestConstraint>> getBaseUpdateConstraints( public static List<Map<String, RequestConstraint>> getBaseUpdateConstraints(
@ -355,8 +467,8 @@ public class DataCubeContainer {
&& pluginRC.getConstraintType() == ConstraintType.EQUALS) { && pluginRC.getConstraintType() == ConstraintType.EQUALS) {
plugin = pluginRC.getConstraintValue(); plugin = pluginRC.getConstraintValue();
} }
return getInstance(plugin).adapter return getInstance(plugin)
.getBaseUpdateConstraints(constraints); .getBaseUpdateConstraintsInternal(constraints);
} }
} }

View file

@ -1,239 +0,0 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.core.datastructure;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest;
import com.raytheon.uf.common.dataquery.requests.TimeQueryRequestSet;
import com.raytheon.uf.common.datastorage.Request;
import com.raytheon.uf.common.datastorage.records.IDataRecord;
import com.raytheon.uf.common.pointdata.PointDataContainer;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.viz.core.catalog.LayerProperty;
import com.raytheon.uf.viz.core.catalog.ScriptCreator;
import com.raytheon.uf.viz.core.comm.Loader;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.requests.ThriftClient;
/**
* Default implementation of IDataCubeAdapter, function implementations were
* moved from DataCubeContainer into here
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Dec 7, 2011 mschenke Initial creation
*
* </pre>
*
* @author mschenke
* @version 1.0
*/
public class DefaultDataCubeAdapter implements IDataCubeAdapter {
private String pluginName;
public DefaultDataCubeAdapter(String pluginName) {
this.pluginName = pluginName;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getSupportedPlugins
* ()
*/
@Override
public String[] getSupportedPlugins() {
return new String[] { pluginName };
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#timeQuery(java
* .util.List)
*/
@Override
public List<List<DataTime>> timeQuery(List<TimeQueryRequest> requests)
throws VizException {
TimeQueryRequestSet set = new TimeQueryRequestSet();
set.setRequests(requests.toArray(new TimeQueryRequest[0]));
@SuppressWarnings("unchecked")
List<List<DataTime>> result = (List<List<DataTime>>) ThriftClient
.sendRequest(set);
return result;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getPoints(java
* .lang.String, java.lang.String[], java.util.Map)
*/
@Override
public PointDataContainer getPoints(String plugin, String[] parameters,
Map<String, RequestConstraint> queryParams) throws VizException {
return null;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getPoints(java
* .lang.String, java.lang.String[], java.lang.String, java.util.Map)
*/
@Override
public PointDataContainer getPoints(String plugin, String[] parameters,
String levelKey, Map<String, RequestConstraint> queryParams)
throws VizException {
return null;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getRecord(com
* .raytheon.uf.common.dataplugin.PluginDataObject)
*/
@Override
public IDataRecord[] getRecord(PluginDataObject obj)
throws VizDataCubeException {
IDataRecord record = null;
try {
record = CubeUtil.retrieveData(obj, pluginName);
} catch (VizException e) {
throw new VizDataCubeException("Error retrieving 2D data record.",
e);
}
return new IDataRecord[] { record };
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getRecord(com
* .raytheon.uf.common.dataplugin.PluginDataObject,
* com.raytheon.uf.common.datastorage.Request, java.lang.String)
*/
@Override
public IDataRecord[] getRecord(PluginDataObject obj, Request req,
String dataset) throws VizDataCubeException {
IDataRecord record = null;
try {
record = CubeUtil.retrieveData(obj, pluginName, req, dataset);
} catch (VizException e) {
throw new VizDataCubeException("Error retrieving 2D data record.",
e);
}
return new IDataRecord[] { record };
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getRecords(java
* .util.List, com.raytheon.uf.common.datastorage.Request, java.lang.String)
*/
@Override
public void getRecords(List<PluginDataObject> objs, Request req,
String dataset) throws VizDataCubeException {
for (PluginDataObject obj : objs) {
IDataRecord record = null;
try {
record = CubeUtil.retrieveData(obj, pluginName, req, dataset);
} catch (VizException e) {
throw new VizDataCubeException(
"Error retrieving 2D grid record.", e);
}
obj.setMessageData(record);
}
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getData(com.raytheon
* .uf.viz.core.catalog.LayerProperty, int)
*/
@Override
public List<Object> getData(LayerProperty property, int timeOut)
throws VizException {
String scriptToExecute = ScriptCreator.createScript(property);
return Loader.loadScripts(new String[] { scriptToExecute }, timeOut);
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#initInventory()
*/
@Override
public void initInventory() {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getInventory()
*/
@Override
public Object getInventory() {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#
* getBaseUpdateConstraints(java.util.Map)
*/
@Override
public List<Map<String, RequestConstraint>> getBaseUpdateConstraints(
Map<String, RequestConstraint> constraints) {
List<Map<String, RequestConstraint>> result = new ArrayList<Map<String, RequestConstraint>>(
1);
result.add(constraints);
return result;
}
}

View file

@ -145,6 +145,16 @@ public interface IDataCubeAdapter {
public List<Object> getData(LayerProperty property, int timeOut) public List<Object> getData(LayerProperty property, int timeOut)
throws VizException; throws VizException;
/**
* A simple method that will create a unique string based on the information
* in the PluginDataObject passed in.
*
* @param pdo
* The PDO to generate a unique name from
* @return A string unique to that PDO
*/
public String recordKeyGenerator(PluginDataObject pdo);
/** /**
* If the inventory for a particular data type is large (for example, Grib), * If the inventory for a particular data type is large (for example, Grib),
* a call to this method should get a copy of that data type's inventory * a call to this method should get a copy of that data type's inventory

View file

@ -31,22 +31,7 @@ import java.util.concurrent.ConcurrentHashMap;
import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.geotools.coverage.grid.GeneralGridEnvelope;
import org.geotools.coverage.grid.GeneralGridGeometry;
import org.geotools.coverage.grid.GridGeometry2D;
import org.geotools.geometry.GeneralEnvelope;
import org.geotools.referencing.CRS;
import org.geotools.referencing.operation.DefaultMathTransformFactory;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.crs.GeneralDerivedCRS;
import org.opengis.referencing.datum.PixelInCell;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;
import com.raytheon.uf.common.serialization.adapters.GridGeometryAdapter;
import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.common.status.UFStatus.Priority;
@ -54,7 +39,6 @@ import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.viz.core.AbstractTimeMatcher; import com.raytheon.uf.viz.core.AbstractTimeMatcher;
import com.raytheon.uf.viz.core.IDisplayPane; import com.raytheon.uf.viz.core.IDisplayPane;
import com.raytheon.uf.viz.core.IDisplayPaneContainer; import com.raytheon.uf.viz.core.IDisplayPaneContainer;
import com.raytheon.uf.viz.core.IExtent;
import com.raytheon.uf.viz.core.VizConstants; import com.raytheon.uf.viz.core.VizConstants;
import com.raytheon.uf.viz.core.datastructure.LoopProperties; import com.raytheon.uf.viz.core.datastructure.LoopProperties;
import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.exception.VizException;
@ -127,19 +111,6 @@ public abstract class AbstractDescriptor extends ResourceGroup implements
/** The frame coordination object */ /** The frame coordination object */
protected IFrameCoordinator frameCoordinator; protected IFrameCoordinator frameCoordinator;
private MathTransform worldToPixel;
private MathTransform pixelToWorld;
/** The spatial grid for the descriptor */
private GeneralGridGeometry gridGeometry;
public AbstractDescriptor(GeneralGridGeometry gridGeometry) {
this();
this.gridGeometry = gridGeometry;
init();
}
/** /**
* Constructor * Constructor
*/ */
@ -225,8 +196,7 @@ public abstract class AbstractDescriptor extends ResourceGroup implements
protected void preAddListener(ResourcePair rp) protected void preAddListener(ResourcePair rp)
throws WrongProjectionException { throws WrongProjectionException {
AbstractVizResource<?, AbstractDescriptor> resource = (AbstractVizResource<?, AbstractDescriptor>) rp AbstractVizResource resource = rp.getResource();
.getResource();
resource.setDescriptor(this); resource.setDescriptor(this);
@ -684,119 +654,6 @@ public abstract class AbstractDescriptor extends ResourceGroup implements
return frameCoordinator; return frameCoordinator;
} }
private void init() {
GeneralGridGeometry gridGeometry = getGridGeometry();
MathTransform worldToCRS = getWorldToCRSTransform(gridGeometry);
if (worldToCRS != null) {
try {
MathTransform crsToPixel = gridGeometry.getGridToCRS(
PixelInCell.CELL_CENTER).inverse();
worldToPixel = new DefaultMathTransformFactory()
.createConcatenatedTransform(worldToCRS, crsToPixel);
pixelToWorld = worldToPixel.inverse();
} catch (Exception e) {
statusHandler.handle(Priority.PROBLEM,
"Error setting up Math Transforms,"
+ " this descriptor may not work properly", e);
}
}
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.drawables.IDescriptor#getCRS()
*/
@Override
public final CoordinateReferenceSystem getCRS() {
if (gridGeometry != null && gridGeometry.getEnvelope() != null) {
return gridGeometry.getEnvelope().getCoordinateReferenceSystem();
} else {
return null;
}
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.drawables.IDescriptor#getGridGeometry()
*/
@Override
@XmlElement
@XmlJavaTypeAdapter(value = GridGeometryAdapter.class)
public final GeneralGridGeometry getGridGeometry() {
return gridGeometry;
}
/**
* Set the grid geometry
*
* @param gridGeometry
* the gridGeometry to set
* @throws VizException
*/
public void setGridGeometry(GeneralGridGeometry gridGeometry)
throws VizException {
this.gridGeometry = gridGeometry;
init();
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.drawables.IDescriptor#pixelToWorld(double[])
*/
@Override
public final double[] pixelToWorld(double[] pixel) {
double[] output = new double[3];
double[] wpixel = pixel;
if (pixel.length == 2) {
wpixel = new double[] { pixel[0], pixel[1], 0 };
}
if (pixelToWorld != null) {
try {
pixelToWorld.transform(wpixel, 0, output, 0, 1);
} catch (TransformException e) {
e.printStackTrace();
return null;
}
} else {
System.arraycopy(wpixel, 0, output, 0, wpixel.length);
}
return output;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.drawables.IDescriptor#worldToPixel(double[])
*/
@Override
public final double[] worldToPixel(double[] world) {
double[] output = new double[3];
double[] input = world;
if (world.length == 2) {
input = new double[] { world[0], world[1], 0 };
}
if (worldToPixel != null) {
try {
worldToPixel.transform(input, 0, output, 0, 1);
} catch (TransformException e) {
return null;
}
} else {
System.arraycopy(input, 0, output, 0, input.length);
}
return output;
}
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
@ -826,40 +683,4 @@ public abstract class AbstractDescriptor extends ResourceGroup implements
getFrameCoordinator().changeFrame(loopProperties); getFrameCoordinator().changeFrame(loopProperties);
} }
protected static GeneralGridGeometry createGridGeometry(IExtent extent,
CoordinateReferenceSystem crs) {
GeneralEnvelope envelope = new GeneralEnvelope(2);
envelope.setRange(0, extent.getMinX(), extent.getMaxX());
envelope.setRange(1, extent.getMinY(), extent.getMaxY());
envelope.setCoordinateReferenceSystem(crs);
return new GridGeometry2D(
new GeneralGridEnvelope(new int[] { 0, 0 }, new int[] {
(int) extent.getWidth(), (int) extent.getHeight() },
false), envelope);
}
/**
* Get the world to CRS transform used for {@link #worldToPixel(double[])}
* and {@link #pixelToWorld(double[])}
*
* @param gridGeometry
* @return The world to gridGeometry CRS transform or null if there is none
*/
public static MathTransform getWorldToCRSTransform(
GeneralGridGeometry gridGeometry) {
CoordinateReferenceSystem crs = gridGeometry.getEnvelope()
.getCoordinateReferenceSystem();
if (crs instanceof GeneralDerivedCRS) {
GeneralDerivedCRS projCRS = (GeneralDerivedCRS) crs;
CoordinateReferenceSystem worldCRS = projCRS.getBaseCRS();
try {
return CRS.findMathTransform(worldCRS, crs);
} catch (FactoryException e) {
statusHandler.handle(Priority.PROBLEM,
"Error setting up Math Transforms,"
+ " this descriptor may not work properly", e);
}
}
return null;
}
} }

View file

@ -206,8 +206,8 @@ public class ColorMapLoader {
ColorMap cm = (ColorMap) SerializationUtil ColorMap cm = (ColorMap) SerializationUtil
.jaxbUnmarshalFromXmlFile(colorMapFile.getFile() .jaxbUnmarshalFromXmlFile(colorMapFile.getFile()
.getAbsolutePath()); .getAbsolutePath());
cm.setName(name); cm.setName(name);
cm.setChanged(false);
return cm; return cm;
} else { } else {
return null; return null;

View file

@ -22,8 +22,6 @@ package com.raytheon.uf.viz.core.drawables;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import javax.measure.converter.UnitConverter; import javax.measure.converter.UnitConverter;
import javax.measure.unit.Unit; import javax.measure.unit.Unit;
@ -118,7 +116,7 @@ public class ColorMapParameters implements Cloneable, ISerializableObject {
} }
protected Set<IColorMapParametersListener> listeners = new HashSet<IColorMapParametersListener>(); protected IColorMapParametersListener listener;
/** Units of the colormap parameters (min/max) */ /** Units of the colormap parameters (min/max) */
protected Unit<?> displayUnit; protected Unit<?> displayUnit;
@ -716,19 +714,13 @@ public class ColorMapParameters implements Cloneable, ISerializableObject {
} }
private void notifyListener() { private void notifyListener() {
for (IColorMapParametersListener listener : listeners) { if (listener != null) {
listener.colorMapChanged(); listener.colorMapChanged();
} }
} }
public void addListener(IColorMapParametersListener listener) { public void setListener(IColorMapParametersListener listener) {
if (listener != null) { this.listener = listener;
listeners.add(listener);
}
}
public void removeListener(IColorMapParametersListener listener) {
listeners.remove(listener);
} }
public void setAlphaMask(byte[] alphaMask) { public void setAlphaMask(byte[] alphaMask) {
@ -749,8 +741,8 @@ public class ColorMapParameters implements Cloneable, ISerializableObject {
@Override @Override
public int hashCode() { public int hashCode() {
if (listeners.size() > 0) { if (listener != null) {
return listeners.hashCode(); return listener.hashCode();
} else if (colorMap != null) { } else if (colorMap != null) {
return colorMap.hashCode(); return colorMap.hashCode();
} else { } else {

View file

@ -20,9 +20,6 @@
package com.raytheon.uf.viz.core.drawables; package com.raytheon.uf.viz.core.drawables;
import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension;
import com.raytheon.uf.viz.core.exception.VizException;
/** /**
* Describes a generic Image resource. The IImage resource is an interface * Describes a generic Image resource. The IImage resource is an interface
* handle to an image. The image resource manages the lifecycle of the * handle to an image. The image resource manages the lifecycle of the
@ -66,11 +63,6 @@ public interface IImage {
UNLOADED, STAGED, LOADED, LOADING, FAILED, INVALID UNLOADED, STAGED, LOADED, LOADING, FAILED, INVALID
}; };
/**
* Stages any data required for the image to load/draw
*/
public abstract void stage() throws VizException;
/** /**
* @return the status * @return the status
*/ */
@ -114,10 +106,4 @@ public interface IImage {
*/ */
public abstract void setContrast(float contrast); public abstract void setContrast(float contrast);
/**
* Gets the extension class for this image
*
* @return
*/
public abstract Class<? extends IImagingExtension> getExtensionClass();
} }

View file

@ -1,143 +0,0 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.core.drawables;
import java.util.ArrayList;
import java.util.List;
import com.raytheon.uf.viz.core.DrawableImage;
import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.IGraphicsTarget.RasterMode;
import com.raytheon.uf.viz.core.drawables.IImage.Status;
import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension;
import com.raytheon.uf.viz.core.drawables.ext.TextureLoader;
import com.raytheon.uf.viz.core.exception.VizException;
/**
* Support class for rendering images to a target
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 13, 2012 mschenke Initial creation
*
* </pre>
*
* @author mschenke
* @version 1.0
*/
public class ImagingSupport {
protected static final TextureLoader textureLoader = TextureLoader
.getInstance();
/**
* Prepares images for painting by staging and/or targeting the image
*
* @param target
* @param images
* @throws VizException
*/
public static void prepareImages(IGraphicsTarget target,
DrawableImage... images) throws VizException {
for (DrawableImage di : images) {
IImage image = di.getImage();
RasterMode mode = di.getMode();
if (image.getStatus() != Status.LOADED
&& image.getStatus() != Status.STAGED) {
if (mode == RasterMode.ASYNCHRONOUS) {
textureLoader.requestLoad(image);
target.setNeedsRefresh(true);
} else if (mode == RasterMode.SYNCHRONOUS) {
image.stage();
}
}
}
}
/**
* Routes the images to be rendered by their proper extensions, expects
* images have already been "prepared" (Status=STAGED)
*
* @param target
* @param paintProps
* @param images
* @return
* @throws VizException
*/
public static boolean routeImages(IGraphicsTarget target,
PaintProperties paintProps, DrawableImage[] images)
throws VizException {
boolean rval = true;
boolean skipped = false;
List<DrawableImage> bulk = new ArrayList<DrawableImage>();
Class<? extends IImagingExtension> lastExt = null;
for (DrawableImage di : images) {
IImage image = di.getImage();
IImage.Status imageSts = image.getStatus();
if (imageSts == IImage.Status.LOADED
|| imageSts == IImage.Status.STAGED) {
Class<? extends IImagingExtension> imageExt = image
.getExtensionClass();
if (imageExt.equals(lastExt) == false && bulk.size() > 0) {
DrawableImage[] extImages = bulk
.toArray(new DrawableImage[bulk.size()]);
// Render what we have
IImagingExtension impl = target.getExtension(lastExt);
rval &= impl.drawRasters(paintProps, extImages);
bulk.clear();
}
bulk.add(di);
lastExt = imageExt;
} else {
skipped = true;
}
}
if (bulk.size() > 0) {
// Render what is left
IImagingExtension impl = target.getExtension(lastExt);
rval &= impl.drawRasters(paintProps,
bulk.toArray(new DrawableImage[bulk.size()]));
}
return rval & skipped;
}
/**
* Prepares the images, then routes them for rendering
*
* @param paintProps
* @param images
* @return
*/
public static boolean drawRasters(IGraphicsTarget target,
PaintProperties paintProps, DrawableImage[] images)
throws VizException {
prepareImages(target, images);
return routeImages(target, paintProps, images);
}
}

View file

@ -0,0 +1,66 @@
package com.raytheon.uf.viz.core.drawables;
import org.eclipse.swt.graphics.RGB;
public class SingleColorImage implements IImage {
private IImage image = null;
private RGB color = null;
public IImage getWrappedImage() {
return image;
}
public void setWrappedImage(IImage image) {
this.image = image;
}
public void setColor(RGB color) {
this.color = color;
}
public RGB getColor() {
return color;
}
public SingleColorImage(IImage image) {
this.image = image;
}
@Override
public Status getStatus() {
return image.getStatus();
}
@Override
public void setInterpolated(boolean isInterpolated) {
image.setInterpolated(isInterpolated);
}
@Override
public void dispose() {
image.dispose();
}
@Override
public int getWidth() {
return image.getWidth();
}
@Override
public int getHeight() {
return image.getHeight();
}
@Override
public void setBrightness(float brightness) {
image.setBrightness(brightness);
}
@Override
public void setContrast(float contrast) {
image.setContrast(contrast);
}
}

View file

@ -40,22 +40,15 @@ import com.raytheon.uf.viz.core.IGraphicsTarget;
*/ */
public abstract class GraphicsExtension<T extends IGraphicsTarget> { public abstract class GraphicsExtension<T extends IGraphicsTarget> {
/** public static enum Compatibilty {
* Interface that other interfaces should extend if they want to be used as INCOMPATIBLE(-1), GENERIC(0), TARGET_COMPATIBLE(1000), ENHANCED_TARGET_COMPATIBLE(
* a graphics extension 2000);
*/
public static interface IGraphicsExtensionInterface {
public int value;
private Compatibilty(int value) {
this.value = value;
} }
public static class Compatibilty {
public static final int INCOMPATIBLE = -1;
public static final int GENERIC = 0;
public static final int TARGET_COMPATIBLE = 1000;
public static final int ENHANCED_TARGET_COMPATIBLE = 2000;
} }
protected T target; protected T target;
@ -76,19 +69,12 @@ public abstract class GraphicsExtension<T extends IGraphicsTarget> {
public final int setTarget(IGraphicsTarget target) { public final int setTarget(IGraphicsTarget target) {
try { try {
this.target = (T) target; this.target = (T) target;
return getCompatibilityValue(this.target);
} catch (ClassCastException e) { } catch (ClassCastException e) {
this.target = null; return Compatibilty.INCOMPATIBLE.value;
return Compatibilty.INCOMPATIBLE;
} }
return getCompatibilityValue(this.target);
} }
/**
* Get the target compability value.
*
* @param target
* @return
*/
public abstract int getCompatibilityValue(T target); public abstract int getCompatibilityValue(T target);
/** /**

View file

@ -15,7 +15,6 @@ import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension.IGraphicsExtensionInterface;
import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.exception.VizException;
public class GraphicsExtensionManager { public class GraphicsExtensionManager {
@ -68,8 +67,8 @@ public class GraphicsExtensionManager {
* @return * @return
* @throws VizException * @throws VizException
*/ */
public synchronized <T extends IGraphicsExtensionInterface> T getExtension( public synchronized <T> T getExtension(Class<T> extensionClass)
Class<T> extensionClass) throws VizException { throws VizException {
if (cached.containsKey(extensionClass)) { if (cached.containsKey(extensionClass)) {
return extensionClass.cast(cached.get(extensionClass)); return extensionClass.cast(cached.get(extensionClass));
} }
@ -77,14 +76,10 @@ public class GraphicsExtensionManager {
int bestVal = -1; int bestVal = -1;
for (Class<?> eClass : extensions) { for (Class<?> eClass : extensions) {
if (extensionClass.isAssignableFrom(eClass)) { if (extensionClass.isAssignableFrom(eClass)) {
GraphicsExtension<?> graphicsExt;
try { try {
GraphicsExtension<?> graphicsExt = GraphicsExtension.class.cast(eClass graphicsExt = GraphicsExtension.class.cast(eClass
.newInstance()); .newInstance());
int val = graphicsExt.setTarget(target);
if (val > bestVal) {
bestVal = val;
bestExt = extensionClass.cast(graphicsExt);
}
} catch (InstantiationException e) { } catch (InstantiationException e) {
statusHandler.handle(Priority.PROBLEM, statusHandler.handle(Priority.PROBLEM,
e.getLocalizedMessage(), e); e.getLocalizedMessage(), e);
@ -94,6 +89,11 @@ public class GraphicsExtensionManager {
e.getLocalizedMessage(), e); e.getLocalizedMessage(), e);
continue; continue;
} }
int val = graphicsExt.setTarget(target);
if (val > bestVal) {
bestVal = val;
bestExt = extensionClass.cast(graphicsExt);
}
} }
} }
if (bestExt != null) { if (bestExt != null) {

View file

@ -4,11 +4,9 @@ import java.nio.Buffer;
import com.raytheon.uf.viz.core.drawables.ColorMapParameters; import com.raytheon.uf.viz.core.drawables.ColorMapParameters;
import com.raytheon.uf.viz.core.drawables.IImage; import com.raytheon.uf.viz.core.drawables.IImage;
import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension.IGraphicsExtensionInterface;
import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.exception.VizException;
public interface IOffscreenRenderingExtension extends public interface IOffscreenRenderingExtension {
IGraphicsExtensionInterface {
/** /**
* All drawing between a call to renderOffscreen and the next call to * All drawing between a call to renderOffscreen and the next call to
* renderOnscreen will be drawn to offscreenImage rather than to the screen. * renderOnscreen will be drawn to offscreenImage rather than to the screen.

View file

@ -1,129 +0,0 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.core.drawables.ext;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.ui.services.IDisposable;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.core.Activator;
import com.raytheon.uf.viz.core.drawables.IImage;
import com.raytheon.uf.viz.core.jobs.JobPool;
/**
* Class that loads data for AbstractGLImages asynchronously
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* 7/1/06 chammack Initial Creation.
*
* </pre>
*
* @author chammack
*
*/
public class TextureLoader {
private static final IUFStatusHandler statusHandler = UFStatus
.getHandler(TextureLoader.class);
/** The instance */
private static TextureLoader instance;
private JobPool loaderPool;
private List<IImage> texturesToLoad;
/**
* Get the currently running instance of the texture loader
*
* @return
*/
public static synchronized TextureLoader getInstance() {
if (instance == null) {
instance = new TextureLoader();
}
return instance;
}
/**
* Use getInstance() instead of constructor
*
*/
private TextureLoader() {
this.texturesToLoad = new ArrayList<IImage>();
this.loaderPool = new JobPool("Texture Loader", Runtime.getRuntime()
.availableProcessors(), true);
// Make sure we get shutdown properly
Activator.getDefault().registerDisposable(new IDisposable() {
@Override
public void dispose() {
shutdown();
}
});
}
/**
* Request an image to be loaded
*
* @param img
* the image
*/
public void requestLoad(final IImage img) {
if (!texturesToLoad.contains(img)) {
texturesToLoad.add(img);
loaderPool.schedule(new Runnable() {
@Override
public void run() {
try {
try {
img.stage();
} catch (Throwable t) {
statusHandler.handle(
Priority.PROBLEM,
"Error staging texture: "
+ t.getLocalizedMessage(), t);
}
} finally {
texturesToLoad.remove(img);
}
}
});
}
}
/**
* Request the job to be shut down
*
*/
public void shutdown() {
loaderPool.cancel();
}
}

View file

@ -1,240 +0,0 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.core.drawables.ext.colormap;
import java.awt.image.RenderedImage;
import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback;
import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback.ColorMapData;
import com.raytheon.uf.viz.core.data.IRenderedImageCallback;
import com.raytheon.uf.viz.core.data.prep.Colormapper;
import com.raytheon.uf.viz.core.drawables.ColorMapParameters;
import com.raytheon.uf.viz.core.drawables.IColorMapParametersListener;
import com.raytheon.uf.viz.core.drawables.IColormappedImage;
import com.raytheon.uf.viz.core.drawables.IImage;
import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension;
import com.raytheon.uf.viz.core.exception.VizException;
/**
* General colormapped image, regenerates image if parameters change
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Dec 16, 2011 mschenke Initial creation
*
* </pre>
*
* @author mschenke
* @version 1.0
*/
public class ColormappedImage implements IColormappedImage,
IRenderedImageCallback, IColorMapParametersListener {
private IImage image;
private IColorMapDataRetrievalCallback callback;
private ColorMapParameters parameters;
public ColormappedImage(IGraphicsTarget target,
IColorMapDataRetrievalCallback callback,
ColorMapParameters parameters) {
this.callback = callback;
setColorMapParameters(parameters);
image = target.initializeRaster(this);
}
/**
* Get the wrapped image for the colormapped image
*
* @return
*/
public IImage getWrappedImage() {
return image;
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.drawables.IImage#getStatus()
*/
@Override
public Status getStatus() {
return image.getStatus();
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.drawables.IImage#setInterpolated(boolean)
*/
@Override
public void setInterpolated(boolean isInterpolated) {
image.setInterpolated(isInterpolated);
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.drawables.IImage#dispose()
*/
@Override
public void dispose() {
if (image != null) {
image.dispose();
}
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.drawables.IImage#getWidth()
*/
@Override
public int getWidth() {
return image.getWidth();
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.drawables.IImage#getHeight()
*/
@Override
public int getHeight() {
return image.getHeight();
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.drawables.IImage#setBrightness(float)
*/
@Override
public void setBrightness(float brightness) {
image.setBrightness(brightness);
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.drawables.IImage#setContrast(float)
*/
@Override
public void setContrast(float contrast) {
image.setContrast(contrast);
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.drawables.IImage#getExtensionClass()
*/
@Override
public Class<? extends IImagingExtension> getExtensionClass() {
return GeneralColormappedImageExtension.class;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.drawables.IColormappedImage#getColorMapParameters
* ()
*/
@Override
public ColorMapParameters getColorMapParameters() {
return parameters;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.drawables.IColormappedImage#setColorMapParameters
* (com.raytheon.uf.viz.core.drawables.ColorMapParameters)
*/
@Override
public void setColorMapParameters(ColorMapParameters params) {
if (params != this.parameters) {
if (this.parameters != null) {
this.parameters.removeListener(this);
}
this.parameters = params;
if (this.parameters != null) {
this.parameters.addListener(this);
}
dispose();
}
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.drawables.IColormappedImage#getValue(int,
* int)
*/
@Override
public double getValue(int x, int y) {
return Double.NaN;
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.data.IRenderedImageCallback#getImage()
*/
@Override
public RenderedImage getImage() throws VizException {
if (parameters == null || parameters.getColorMap() == null) {
return null;
}
ColorMapData colorMapData = callback.getColorMapData();
return Colormapper.colorMap(colorMapData, parameters);
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.drawables.IColorMapParametersListener#
* colorMapChanged()
*/
@Override
public void colorMapChanged() {
dispose();
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.drawables.IImage#stage()
*/
@Override
public void stage() throws VizException {
image.stage();
}
}

View file

@ -0,0 +1,81 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.core.drawables.ext.colormap;
import java.awt.image.RenderedImage;
import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback;
import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback.ColorMapData;
import com.raytheon.uf.viz.core.data.IRenderedImageCallback;
import com.raytheon.uf.viz.core.data.prep.Colormapper;
import com.raytheon.uf.viz.core.drawables.ColorMapParameters;
import com.raytheon.uf.viz.core.exception.VizException;
/**
* General {@link IRenderedImageCallback} that takes a
* {@link IColorMapDataRetrievalCallback} and {@link ColorMapParameters} and
* will colormap the data returned from the callback into a
* {@link RenderedImage}
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Nov 22, 2011 mschenke Initial creation
*
* </pre>
*
* @author mschenke
* @version 1.0
*/
public class ColormappedRenderedImageCallback implements IRenderedImageCallback {
private IColorMapDataRetrievalCallback callback;
private ColorMapParameters parameters;
/**
* Construct a ColormappedRenderedImageCallback for the colormap data
* callback and parameters
*
* @param dataCallback
* @param parameters
*/
public ColormappedRenderedImageCallback(
IColorMapDataRetrievalCallback dataCallback,
ColorMapParameters parameters) {
this.callback = dataCallback;
this.parameters = parameters;
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.data.IRenderedImageCallback#getImage()
*/
@Override
public RenderedImage getImage() throws VizException {
ColorMapData colorMapData = callback.getColorMapData();
return Colormapper.colorMap(colorMapData, parameters);
}
}

View file

@ -19,17 +19,11 @@
**/ **/
package com.raytheon.uf.viz.core.drawables.ext.colormap; package com.raytheon.uf.viz.core.drawables.ext.colormap;
import java.util.ArrayList;
import java.util.List;
import com.raytheon.uf.viz.core.DrawableImage;
import com.raytheon.uf.viz.core.IGraphicsTarget; import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback; import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback;
import com.raytheon.uf.viz.core.drawables.ColorMapParameters; import com.raytheon.uf.viz.core.drawables.ColorMapParameters;
import com.raytheon.uf.viz.core.drawables.IColormappedImage; import com.raytheon.uf.viz.core.drawables.IImage;
import com.raytheon.uf.viz.core.drawables.PaintProperties;
import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension; import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension;
import com.raytheon.uf.viz.core.exception.VizException;
/** /**
* General colormapped image extension. Uses * General colormapped image extension. Uses
@ -62,10 +56,10 @@ public class GeneralColormappedImageExtension extends
* com.raytheon.uf.viz.core.drawables.ColorMapParameters) * com.raytheon.uf.viz.core.drawables.ColorMapParameters)
*/ */
@Override @Override
public IColormappedImage initializeRaster( public IImage initializeRaster(IColorMapDataRetrievalCallback dataCallback,
IColorMapDataRetrievalCallback dataCallback,
ColorMapParameters colorMapParameters) { ColorMapParameters colorMapParameters) {
return new ColormappedImage(target, dataCallback, colorMapParameters); return target.initializeRaster(new ColormappedRenderedImageCallback(
dataCallback, colorMapParameters));
} }
/* /*
@ -76,29 +70,7 @@ public class GeneralColormappedImageExtension extends
*/ */
@Override @Override
public int getCompatibilityValue(IGraphicsTarget target) { public int getCompatibilityValue(IGraphicsTarget target) {
return Compatibilty.GENERIC; return Compatibilty.GENERIC.value;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.drawables.ext.IImagingExtension#drawRasters(
* com.raytheon.uf.viz.core.drawables.PaintProperties,
* com.raytheon.uf.viz.core.DrawableImage[])
*/
@Override
public boolean drawRasters(PaintProperties paintProps,
DrawableImage... images) throws VizException {
List<DrawableImage> renderables = new ArrayList<DrawableImage>();
for (DrawableImage di : images) {
if (di.getImage() instanceof ColormappedImage) {
renderables.add(new DrawableImage(((ColormappedImage) di
.getImage()).getWrappedImage(), di.getCoverage()));
}
}
return target.drawRasters(paintProps,
renderables.toArray(new DrawableImage[renderables.size()]));
} }
} }

View file

@ -26,7 +26,6 @@ import org.eclipse.swt.graphics.RGB;
import com.raytheon.uf.viz.core.drawables.IDescriptor; import com.raytheon.uf.viz.core.drawables.IDescriptor;
import com.raytheon.uf.viz.core.drawables.IShadedShape; import com.raytheon.uf.viz.core.drawables.IShadedShape;
import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension.IGraphicsExtensionInterface;
import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.exception.VizException;
import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.LineString;
@ -54,8 +53,7 @@ import com.vividsolutions.jts.geom.LineString;
* @author bsteffen * @author bsteffen
* @version 1.0 * @version 1.0
*/ */
public interface IColormapShadedShapeExtension extends public interface IColormapShadedShapeExtension {
IGraphicsExtensionInterface {
public interface IColormapShadedShape { public interface IColormapShadedShape {

View file

@ -22,7 +22,7 @@ package com.raytheon.uf.viz.core.drawables.ext.colormap;
import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback; import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback;
import com.raytheon.uf.viz.core.drawables.ColorMapParameters; import com.raytheon.uf.viz.core.drawables.ColorMapParameters;
import com.raytheon.uf.viz.core.drawables.IColormappedImage; import com.raytheon.uf.viz.core.drawables.IColormappedImage;
import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension; import com.raytheon.uf.viz.core.drawables.IImage;
/** /**
* Extension for creating {@link IColormappedImage} objects * Extension for creating {@link IColormappedImage} objects
@ -41,7 +41,7 @@ import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension;
* @version 1.0 * @version 1.0
*/ */
public interface IColormappedImageExtension extends IImagingExtension { public interface IColormappedImageExtension {
/** /**
* Initializes an IColormappedImage given the dataCallback and colormap * Initializes an IColormappedImage given the dataCallback and colormap
@ -51,7 +51,6 @@ public interface IColormappedImageExtension extends IImagingExtension {
* @param colorMapParameters * @param colorMapParameters
* @return * @return
*/ */
public IColormappedImage initializeRaster( public IImage initializeRaster(IColorMapDataRetrievalCallback dataCallback,
IColorMapDataRetrievalCallback dataCallback,
ColorMapParameters colorMapParameters); ColorMapParameters colorMapParameters);
} }

View file

@ -19,12 +19,7 @@
**/ **/
package com.raytheon.uf.viz.core.map; package com.raytheon.uf.viz.core.map;
import org.geotools.coverage.grid.GeneralGridGeometry;
import org.geotools.coverage.grid.GridGeometry2D;
import com.raytheon.uf.viz.core.IMesh; import com.raytheon.uf.viz.core.IMesh;
import com.raytheon.uf.viz.core.drawables.IDescriptor;
import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension.IGraphicsExtensionInterface;
import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.exception.VizException;
/** /**
@ -44,31 +39,17 @@ import com.raytheon.uf.viz.core.exception.VizException;
* @version 1.0 * @version 1.0
*/ */
public interface IMapMeshExtension extends IGraphicsExtensionInterface { public interface IMapMeshExtension {
/** /**
* Constructs a mesh for mapping the imageGeometry onto the targetGeometry * Create a mesh
*
* @param descriptor
* *
* @param imageGeometry
* @param targetGeometry
* @return * @return
* @throws VizException * @throws VizException
*/ */
public abstract IMesh constructMesh(GridGeometry2D imageGeometry, public abstract IMesh constructMesh(IMapDescriptor descriptor)
GeneralGridGeometry targetGeometry) throws VizException; throws VizException;
/**
* Convenient method for constructing a mesh for mapping the imageGeometry
* onto the targetDescriptor. Same as calling
* {@link #constructMesh(GridGeometry2D, GeneralGridGeometry)} passing in
* target.getGridGeometry()
*
* @param imageGeometry
* @param targetDescriptor
* @return
* @throws VizException
*/
public abstract IMesh constructMesh(GridGeometry2D imageGeometry,
IDescriptor targetDescriptor) throws VizException;
} }

View file

@ -26,7 +26,9 @@ import java.util.ArrayList;
import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.RGB;
import org.geotools.coverage.grid.GeneralGridEnvelope; import org.geotools.coverage.grid.GeneralGridEnvelope;
@ -34,16 +36,23 @@ import org.geotools.coverage.grid.GeneralGridGeometry;
import org.geotools.coverage.grid.GridGeometry2D; import org.geotools.coverage.grid.GridGeometry2D;
import org.geotools.geometry.DirectPosition2D; import org.geotools.geometry.DirectPosition2D;
import org.geotools.geometry.GeneralEnvelope; import org.geotools.geometry.GeneralEnvelope;
import org.geotools.referencing.CRS;
import org.geotools.referencing.GeodeticCalculator; import org.geotools.referencing.GeodeticCalculator;
import org.geotools.referencing.crs.DefaultGeocentricCRS;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.geotools.referencing.operation.DefaultMathTransformFactory;
import org.opengis.geometry.DirectPosition; import org.opengis.geometry.DirectPosition;
import org.opengis.referencing.FactoryException; import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.datum.PixelInCell; import org.opengis.referencing.datum.PixelInCell;
import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.MathTransformFactory;
import org.opengis.referencing.operation.TransformException; import org.opengis.referencing.operation.TransformException;
import com.raytheon.uf.common.geospatial.CRSCache;
import com.raytheon.uf.common.geospatial.MapUtil; import com.raytheon.uf.common.geospatial.MapUtil;
import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.serialization.ISerializableObject;
import com.raytheon.uf.common.serialization.adapters.GridGeometryAdapter;
import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority; import com.raytheon.uf.common.status.UFStatus.Priority;
@ -187,12 +196,24 @@ public class MapDescriptor extends AbstractDescriptor implements
return gridGeom; return gridGeom;
} }
/** The transform from lat/lon to the current CRS */
protected MathTransform coordinateTransform;
/** The transform from the current CRS to lat/lon */
protected MathTransform inverseCoordinateTransform;
/** The mapping from grid to coordinate */ /** The mapping from grid to coordinate */
protected MathTransform mapToCoordinateTransform; protected MathTransform mapToCoordinateTransform;
/** The mapping from coordinate to grid */ /** The mapping from coordinate to grid */
protected MathTransform coordinateToMapTransform; protected MathTransform coordinateToMapTransform;
/** The mapping from wgs84 to grid */
protected MathTransform wgsToGridTransform;
/** The mapping from grid to wgs84 */
protected MathTransform gridToWGSTransform;
/** The time in ms that the last blink state was used */ /** The time in ms that the last blink state was used */
protected long timeLastBlink; protected long timeLastBlink;
@ -208,6 +229,9 @@ public class MapDescriptor extends AbstractDescriptor implements
*/ */
protected int mapWidth; protected int mapWidth;
/** The geospatial descriptor for the grid */
protected GeneralGridGeometry gridGeometry;
/** elevation exaggeration */ /** elevation exaggeration */
protected double elevationExageration = 0; protected double elevationExageration = 0;
@ -218,6 +242,8 @@ public class MapDescriptor extends AbstractDescriptor implements
LAT_LON_FORMATTER.setMaximumFractionDigits(2); LAT_LON_FORMATTER.setMaximumFractionDigits(2);
} }
private String cloudSourceName;
/** /**
* Constructor * Constructor
* *
@ -248,26 +274,49 @@ public class MapDescriptor extends AbstractDescriptor implements
* *
*/ */
public MapDescriptor(GeneralGridGeometry gridGeometry) throws VizException { public MapDescriptor(GeneralGridGeometry gridGeometry) throws VizException {
super(gridGeometry); super();
this.gridGeometry = gridGeometry;
init(); init();
} }
protected void init() throws VizException { protected void init() throws VizException {
MathTransformFactory mtf = new DefaultMathTransformFactory();
try { try {
GeneralGridGeometry gridGeometry = getGridGeometry();
mapToCoordinateTransform = gridGeometry mapToCoordinateTransform = this.gridGeometry
.getGridToCRS(PixelInCell.CELL_CENTER); .getGridToCRS(PixelInCell.CELL_CENTER);
coordinateToMapTransform = mapToCoordinateTransform.inverse(); coordinateToMapTransform = mapToCoordinateTransform.inverse();
CoordinateReferenceSystem descriptorCRS = this.gridGeometry
.getCoordinateReferenceSystem();
if (descriptorCRS.toWKT().equals(
DefaultGeocentricCRS.CARTESIAN.toWKT())) {
inverseCoordinateTransform = CRS.findMathTransform(
descriptorCRS, DefaultGeographicCRS.WGS84_3D);
CoordinateReferenceSystem crs = gridGeometry coordinateTransform = inverseCoordinateTransform.inverse();
} else {
inverseCoordinateTransform = CRSCache.getInstance()
.getTransformToLatLon(descriptorCRS);
coordinateTransform = inverseCoordinateTransform.inverse();
}
wgsToGridTransform = mtf.createConcatenatedTransform(
coordinateTransform, coordinateToMapTransform);
gridToWGSTransform = mtf.createConcatenatedTransform(
mapToCoordinateTransform, inverseCoordinateTransform);
CoordinateReferenceSystem crs = this.gridGeometry
.getCoordinateReferenceSystem(); .getCoordinateReferenceSystem();
DirectPosition s1, d1, s2, d2; DirectPosition s1, d1, s2, d2;
if (crs.getCoordinateSystem().getDimension() == 2) { if (crs.getCoordinateSystem().getDimension() == 2) {
double centerX = (gridGeometry.getGridRange().getLow(0) + gridGeometry double centerX = (this.gridGeometry.getGridRange().getLow(0) + this.gridGeometry
.getGridRange().getHigh(0)) / 2; .getGridRange().getHigh(0)) / 2;
double centerY = (gridGeometry.getGridRange().getLow(1) + gridGeometry double centerY = (this.gridGeometry.getGridRange().getLow(1) + this.gridGeometry
.getGridRange().getHigh(1)) / 2; .getGridRange().getHigh(1)) / 2;
s1 = new DirectPosition2D(centerX, centerY); s1 = new DirectPosition2D(centerX, centerY);
@ -318,6 +367,43 @@ public class MapDescriptor extends AbstractDescriptor implements
} }
} }
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.drawables.IDescriptor#pixelToWorld(double[])
*/
@Override
public double[] pixelToWorld(final double[] pixel) {
// if (pixel[0] < 1.0)
// pixel[0] = 1;
//
// if (pixel[0] > theWorldWidth - 1.0)
// pixel[0] = theWorldWidth - 1.0;
//
// if (pixel[1] < 1.0)
// pixel[1] = 1;
//
// if (pixel[1] > theWorldHeight - 1.0)
// pixel[1] = theWorldHeight;
double[] output = new double[3];
double[] wpixel = pixel;
if (pixel.length == 2) {
wpixel = new double[] { pixel[0], pixel[1], 0 };
}
try {
gridToWGSTransform.transform(wpixel, 0, output, 0, 1);
} catch (TransformException e) {
e.printStackTrace();
return null;
}
return output;
}
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
@ -331,7 +417,7 @@ public class MapDescriptor extends AbstractDescriptor implements
if (crs == MapUtil.LATLON_PROJECTION) { if (crs == MapUtil.LATLON_PROJECTION) {
return pixelToWorld(pixel); return pixelToWorld(pixel);
} else if (!crs.getName().equals( } else if (!crs.getName().equals(
getGridGeometry().getCoordinateReferenceSystem().getName())) { this.gridGeometry.getCoordinateReferenceSystem().getName())) {
return null; return null;
} }
@ -345,6 +431,33 @@ public class MapDescriptor extends AbstractDescriptor implements
return output2; return output2;
} }
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.drawables.IDescriptor#worldToPixel(double[])
*/
@Override
public double[] worldToPixel(double[] world) {
double[] output = new double[3];
double[] input = null;
if (world.length == 2) {
input = new double[] { world[0], world[1], 0 };
} else {
input = world;
}
try {
wgsToGridTransform.transform(input, 0, output, 0, 1);
} catch (TransformException e) {
return null;
}
return output;
}
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
@ -353,10 +466,11 @@ public class MapDescriptor extends AbstractDescriptor implements
*/ */
@Override @Override
public double[] worldToPixel(double[] pixel, CoordinateReferenceSystem crs) { public double[] worldToPixel(double[] pixel, CoordinateReferenceSystem crs) {
if (crs == MapUtil.LATLON_PROJECTION) { if (crs == MapUtil.LATLON_PROJECTION) {
return worldToPixel(pixel); return worldToPixel(pixel);
} else if (!crs.getName().equals( } else if (!crs.getName().equals(
getGridGeometry().getCoordinateReferenceSystem().getName())) { this.gridGeometry.getCoordinateReferenceSystem().getName())) {
return null; return null;
} }
@ -504,6 +618,18 @@ public class MapDescriptor extends AbstractDescriptor implements
return pc; return pc;
} }
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.map.IMapDescriptor#getMapData()
*/
@Override
@XmlElement
@XmlJavaTypeAdapter(value = GridGeometryAdapter.class)
public GeneralGridGeometry getGridGeometry() {
return this.gridGeometry;
}
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
@ -530,10 +656,29 @@ public class MapDescriptor extends AbstractDescriptor implements
@Override @Override
public void setGridGeometry(GeneralGridGeometry gridGeometry) public void setGridGeometry(GeneralGridGeometry gridGeometry)
throws VizException { throws VizException {
super.setGridGeometry(gridGeometry); this.gridGeometry = gridGeometry;
init(); init();
} }
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.map.IMapDescriptor#getCRS()
*/
@Override
public CoordinateReferenceSystem getCRS() {
if (this.gridGeometry != null) {
return this.gridGeometry.getCoordinateReferenceSystem();
} else {
return null;
}
}
public MathTransform getToGridTransform() {
return this.wgsToGridTransform;
}
/** /**
* Get the current display width * Get the current display width
* *

View file

@ -17,19 +17,12 @@
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for * See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information. * further licensing information.
**/ **/
package com.raytheon.uf.common.geospatial.util; package com.raytheon.uf.viz.core.map;
import org.geotools.coverage.grid.GeneralGridGeometry;
import org.geotools.referencing.CRS; import org.geotools.referencing.CRS;
import org.geotools.referencing.operation.DefaultMathTransformFactory;
import org.geotools.referencing.operation.projection.MapProjection; import org.geotools.referencing.operation.projection.MapProjection;
import org.geotools.referencing.operation.projection.MapProjection.AbstractProvider; import org.geotools.referencing.operation.projection.MapProjection.AbstractProvider;
import org.opengis.parameter.ParameterValueGroup; import org.opengis.parameter.ParameterValueGroup;
import org.opengis.referencing.operation.MathTransform;
import com.raytheon.uf.common.geospatial.MapUtil;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
/** /**
* Given a descriptor of a map, this class will check line segments for wrapping * Given a descriptor of a map, this class will check line segments for wrapping
@ -57,9 +50,9 @@ public class WorldWrapChecker {
private boolean checkForWrapping = false; private boolean checkForWrapping = false;
public WorldWrapChecker(GeneralGridGeometry worldGeometry) { public WorldWrapChecker(IMapDescriptor descriptor) {
MapProjection worldProjection = CRS.getMapProjection(worldGeometry MapProjection worldProjection = CRS.getMapProjection(descriptor
.getCoordinateReferenceSystem()); .getCRS());
double centralMeridian = 0.0; double centralMeridian = 0.0;
if (worldProjection != null) { if (worldProjection != null) {
ParameterValueGroup group = worldProjection.getParameterValues(); ParameterValueGroup group = worldProjection.getParameterValues();
@ -78,27 +71,12 @@ public class WorldWrapChecker {
double r1 = inverseCentralMeridian - 359.9; double r1 = inverseCentralMeridian - 359.9;
double r2 = inverseCentralMeridian - 359.8; double r2 = inverseCentralMeridian - 359.8;
try { double xl1 = descriptor.worldToPixel(new double[] { l1, 0.0 })[0];
MathTransform latLonToGrid = new DefaultMathTransformFactory() double xl2 = descriptor.worldToPixel(new double[] { l2, 0.0 })[0];
.createConcatenatedTransform(MapUtil double xr1 = descriptor.worldToPixel(new double[] { r1, 0.0 })[0];
.getTransformFromLatLon(worldGeometry double xr2 = descriptor.worldToPixel(new double[] { r2, 0.0 })[0];
.getCoordinateReferenceSystem()),
worldGeometry.getGridToCRS().inverse());
double[] in = new double[] { l1, 0.0, l2, 0.0, r1, 0.0, r2, 0.0 };
double[] out = new double[in.length];
latLonToGrid.transform(in, 0, out, 0, 4);
double xl1 = out[0];
double xl2 = out[2];
double xr1 = out[4];
double xr2 = out[6];
checkForWrapping = Math.abs(xl1 - xr1) > Math.abs(xl2 - xr2); checkForWrapping = Math.abs(xl1 - xr1) > Math.abs(xl2 - xr2);
} catch (Throwable t) {
UFStatus.getHandler().handle(Priority.PROBLEM,
"Error determing world wrap checking", t);
}
} }
/** /**

View file

@ -17,14 +17,12 @@
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for * See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information. * further licensing information.
**/ **/
package com.raytheon.uf.common.geospatial.util; package com.raytheon.uf.viz.core.map;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import org.geotools.coverage.grid.GeneralGridGeometry;
import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryCollection; import com.vividsolutions.jts.geom.GeometryCollection;
@ -55,12 +53,12 @@ public class WorldWrapCorrector {
private WorldWrapChecker checker; private WorldWrapChecker checker;
/** /**
* Constructs of world wrap corrector for the specified world * Constructs of world wrap corrector for the specified descriptor
* *
* @param descriptor * @param descriptor
*/ */
public WorldWrapCorrector(GeneralGridGeometry worldGeometry) { public WorldWrapCorrector(IMapDescriptor descriptor) {
checker = new WorldWrapChecker(worldGeometry); checker = new WorldWrapChecker(descriptor);
} }
/** /**

View file

@ -0,0 +1,148 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.core.preferences;
import java.util.UUID;
import org.eclipse.jface.preference.IPreferenceStore;
import com.raytheon.uf.viz.core.Activator;
/**
* Serialized class for the JMS policy type
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jan 30, 2012 mnash Initial creation
*
* </pre>
*
* @author mnash
* @version 1.0
*/
public class JMSPreferences {
// these are the policy types as supported by QPID
//
// reject - reject the message if the topic is full
//
// ring - start overwriting messages in a ring based on sizing. If head
// meets tail, advance head.
//
// flow to disk - flow the messages to disk to preserve memory
//
// ring strict - start overwriting messages in a ring based on sizing. If
// head meets tail, AND the consumer has the tail message acquired it will
// reject
//
public enum PolicyType {
REJECT("reject"), RING("ring"), FLOW_TO_DISK("flow_to_disk"), RING_STRICT(
"ring_strict");
private String type;
/**
* @return the type
*/
public String getType() {
return type;
}
private PolicyType(String name) {
type = name;
}
}
// declare topic as ADDR, not BURL
private static final String addressArgs = "ADDR:'amq.topic'/";
private static final String declareArgs = "; { node: { type: 'topic', x-declare: {arguments: {";
private static final String linkArgs = "}}}, link: { name: '";
private static final String linkDeclareArgs = "', x-declare: {arguments: {";
private static final String QPID_MAX_COUNT = "qpid.max_count";
private static final String QPID_POLICY_TYPE = "qpid.policy_type";
private static String policyType = "";
private static int maxVal = 0;
// putting together the arguments for the qpid queue
public static String getPolicyString(String val) {
// for qpid.policy_type, there is a corresponding constant in
// QpidQueueOptions, but did not want to add a dependency
return addressArgs + val + declareArgs + "'" + QPID_MAX_COUNT + "':"
+ getMaxCount() + ",'" + QPID_POLICY_TYPE + "':"
+ getPolicyType() + linkArgs + val + UUID.randomUUID()
+ linkDeclareArgs + "'" + QPID_MAX_COUNT + "':" + getMaxCount()
+ ",'" + QPID_POLICY_TYPE + "':" + getPolicyType() + "}}}}";
}
/**
* @return the policyTypeOption
*/
public static String getPolicyType() {
if (policyType != null && !policyType.isEmpty()) {
return policyType;
}
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
String value = store.getString(QPID_POLICY_TYPE);
// validation
for (PolicyType type : PolicyType.values()) {
if (!type.getType().equals(value)) {
policyType = value;
}
}
// fail safe for bad configurations
if (policyType == null || policyType.isEmpty()) {
policyType = PolicyType.RING.getType();
}
return "'" + policyType + "'";
}
/**
* Get the max count as given in the config.xml in the preference store
*
* @return
*/
public static int getMaxCount() {
if (maxVal != 0) {
return maxVal;
}
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
maxVal = store.getInt(QPID_MAX_COUNT);
// fail safe
if (maxVal == 0) {
maxVal = 1000;
}
return maxVal;
}
}

View file

@ -1,340 +0,0 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.core.rsc;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.viz.core.IGraphicsTarget;
import com.raytheon.uf.viz.core.VizApp;
import com.raytheon.uf.viz.core.drawables.IDescriptor;
import com.raytheon.uf.viz.core.drawables.IRenderable;
import com.raytheon.uf.viz.core.drawables.PaintProperties;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.rsc.capabilities.AbstractCapability;
/**
* Abstract resource class that manages frames with renderable objects
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Dec 21, 2011 mschenke Initial creation
*
* </pre>
*
* @author mschenke
* @version 1.0
*/
public abstract class AbstractPluginDataObjectResource<T extends AbstractResourceData, D extends IDescriptor>
extends AbstractVizResource<T, D> {
private static class Frame {
List<PluginDataObject> records = new ArrayList<PluginDataObject>();
IRenderable renderable;
}
private Map<DataTime, Frame> frames = new HashMap<DataTime, Frame>();
private Object lock = new Object();
/**
* @param resourceData
* @param loadProperties
*/
protected AbstractPluginDataObjectResource(T resourceData,
LoadProperties loadProperties) {
super(resourceData, loadProperties);
dataTimes = new ArrayList<DataTime>();
resourceData.addChangeListener(new IResourceDataChanged() {
@Override
public void resourceChanged(ChangeType type, Object object) {
if (type == ChangeType.DATA_UPDATE) {
if (object instanceof PluginDataObject) {
addDataObject((PluginDataObject) object);
} else if (object instanceof PluginDataObject[]) {
for (PluginDataObject pdo : (PluginDataObject[]) object) {
addDataObject((PluginDataObject) pdo);
}
} else if (object instanceof Object[]) {
for (Object obj : (Object[]) object) {
if (obj instanceof PluginDataObject) {
addDataObject((PluginDataObject) obj);
}
}
}
} else if (type == ChangeType.CAPABILITY) {
if (object instanceof AbstractCapability) {
AbstractCapability capability = (AbstractCapability) object;
for (Frame frame : frames.values()) {
if (frame.renderable != null) {
capabilityChanged(frame.renderable, capability);
}
}
}
}
}
});
}
/**
* Adds the pdo to the appropriate time and removes any renderable or data
* cached for that time.
*
* @param pdo
*/
protected final void addDataObject(PluginDataObject pdo) {
synchronized (lock) {
if (frames == null) {
// Check for null in case we were waiting for lock from
// disposeInternal in which case we shouldn't process add
return;
}
DataTime time = getDataObjectTime(pdo);
Frame frame = frames.get(time);
if (frame == null) {
frame = new Frame();
frames.put(time, frame);
}
if (frame.records.contains(pdo)) {
frame.records.remove(pdo);
}
frame.records.add(pdo);
if (frame.renderable != null) {
if (updateRenderable(frame.renderable, pdo) == false) {
dispose(frame.renderable);
}
}
if (!dataTimes.contains(dataTimes)) {
dataTimes.add(time);
}
}
}
/**
* Return the DataTime to be associated with this record. Default returns
* PluginDataObject.getDataTime()
*
* @param pdo
* @return
*/
protected DataTime getDataObjectTime(PluginDataObject pdo) {
return pdo.getDataTime();
}
/**
* Get the records for the given time. Empty list will be returned if no
* frame for time
*
* @param time
* @return
*/
protected List<PluginDataObject> getPluginDataObjects(DataTime time) {
Frame frame = frames.get(time);
if (frame != null) {
return frame.records;
}
return new ArrayList<PluginDataObject>();
}
/**
* Get the current time for the resource, default calls
* descriptor.getTimeForResoruce(this)
*
* @return the current time
*/
protected DataTime getTimeForResource() {
return descriptor.getTimeForResource(this);
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.rsc.AbstractVizResource#remove(com.raytheon.
* uf.common.time.DataTime)
*/
@Override
public final void remove(DataTime dataTime) {
synchronized (lock) {
super.remove(dataTime);
Frame frame = frames.remove(dataTime);
if (frame != null && frame.renderable != null) {
IRenderable dispose = frame.renderable;
frame.renderable = null;
dispose(dispose);
}
}
}
/**
* Dispose of a renderable.
*
* @param renderable
*/
private void dispose(final IRenderable renderable) {
VizApp.runAsync(new Runnable() {
@Override
public void run() {
disposeRenderable(renderable);
}
});
}
@Override
public final void project(CoordinateReferenceSystem crs)
throws VizException {
Iterator<Frame> iter = frames.values().iterator();
while (iter.hasNext()) {
Frame frame = iter.next();
IRenderable renderable = frame.renderable;
if (renderable != null) {
if (!projectRenderable(renderable, crs)) {
frame.renderable = null;
dispose(renderable);
}
}
}
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.rsc.AbstractVizResource#paintInternal(com.raytheon
* .uf.viz.core.IGraphicsTarget,
* com.raytheon.uf.viz.core.drawables.PaintProperties)
*/
@Override
protected final void paintInternal(IGraphicsTarget target,
PaintProperties paintProps) throws VizException {
DataTime time = paintProps.getDataTime();
if (time == null) {
time = getTimeForResource();
}
Frame currFrame = frames.get(time);
if (currFrame != null) {
IRenderable renderable = currFrame.renderable;
if (renderable == null) {
currFrame.renderable = renderable = constructRenderable(currFrame.records);
}
if (renderable != null) {
renderable.paint(target, paintProps);
}
}
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.rsc.AbstractVizResource#disposeInternal()
*/
@Override
protected final void disposeInternal() {
synchronized (lock) {
for (Frame frame : frames.values()) {
if (frame.renderable != null) {
disposeRenderable(frame.renderable);
}
}
frames.clear();
frames = null;
}
disposeResource();
}
/**
* Dispose method for the resource to dispose any data not tied to a
* renderable. Called after all renderables have been disposed. Default impl
* does nothing
*/
protected void disposeResource() {
}
/**
* Notification that a capability has changed and the renderable should be
* updated
*
* @param renderable
* @param capability
*/
protected abstract void capabilityChanged(IRenderable renderable,
AbstractCapability capability);
/**
* Dispose the renderable object
*
* @param renderable
*/
protected abstract void disposeRenderable(IRenderable renderable);
/**
* Attempt to reproject the renderable object into this specified
* projection. If unable to reproject, return false and renderable will be
* recreated next paint
*
* @param renderable
* @param crs
* @return
*/
protected abstract boolean projectRenderable(IRenderable renderable,
CoordinateReferenceSystem crs) throws VizException;
/**
* Construct a renderable object for the given records. This method is
* called from paintInternal. Null can be returned and this method will be
* called next paintInternal. That can be used if requesting data that is
* required for the renderable asynchronously.
*
* NOTE: The size of the pdo list will only grow so it can be used to
* determine if new data has arrived since last call
*
* @param records
* @return
*/
protected abstract IRenderable constructRenderable(
List<PluginDataObject> records) throws VizException;
/**
* Update the renderable with the new pdo, if the renderable is updatable,
* return true. If the renderable needs to be recreated from scratch, return
* false
*
* @param renderable
* @param pdo
* @return
*/
protected abstract boolean updateRenderable(IRenderable renderable,
PluginDataObject pdo);
}

View file

@ -21,7 +21,6 @@ package com.raytheon.uf.viz.core.rsc;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
@ -386,6 +385,11 @@ public abstract class AbstractRequestableResourceData extends
Set<DataTime> currentSet = new HashSet<DataTime>(Arrays.asList(current)); Set<DataTime> currentSet = new HashSet<DataTime>(Arrays.asList(current));
boolean initialLoad = false;
if (currentSet.size() == 0) {
initialLoad = true;
}
Set<DataTime> loadSet = new HashSet<DataTime>(); Set<DataTime> loadSet = new HashSet<DataTime>();
for (DataTime t : desiredSet) { for (DataTime t : desiredSet) {
boolean found = false; boolean found = false;
@ -405,21 +409,6 @@ public abstract class AbstractRequestableResourceData extends
return new PluginDataObject[0]; return new PluginDataObject[0];
} }
return requestPluginDataObjects(loadSet);
}
/**
* Request plugin data objects for the passed in times. This method is
* called from getLatestPluginDataObjects(DataTime[],DataTime[]) after time
* filter from desired and current has been done. The times passed in is a
* collection of new times needed
*
* @param loadSet
* @return
* @throws VizException
*/
protected PluginDataObject[] requestPluginDataObjects(
Collection<DataTime> loadSet) throws VizException {
LayerProperty property = new LayerProperty(); LayerProperty property = new LayerProperty();
// TODO fix? // TODO fix?
property.setDesiredProduct(ResourceType.PLAN_VIEW); property.setDesiredProduct(ResourceType.PLAN_VIEW);
@ -487,7 +476,7 @@ public abstract class AbstractRequestableResourceData extends
/** /**
* Comparator for response array. * Comparator for response array.
*/ */
protected static Comparator<PluginDataObject> layerComparator = new Comparator<PluginDataObject>() { private static Comparator<PluginDataObject> layerComparator = new Comparator<PluginDataObject>() {
@Override @Override
public int compare(PluginDataObject arg0, PluginDataObject arg1) { public int compare(PluginDataObject arg0, PluginDataObject arg1) {

View file

@ -20,10 +20,10 @@
package com.raytheon.uf.viz.core.rsc; package com.raytheon.uf.viz.core.rsc;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.IStatus;
@ -152,11 +152,11 @@ public abstract class AbstractVizResource<T extends AbstractResourceData, D exte
protected AbstractVizResource(T resourceData, LoadProperties loadProperties) { protected AbstractVizResource(T resourceData, LoadProperties loadProperties) {
this.resourceData = resourceData; this.resourceData = resourceData;
this.loadProperties = loadProperties; this.loadProperties = loadProperties;
refreshListeners = new CopyOnWriteArraySet<IRefreshListener>(); refreshListeners = new HashSet<IRefreshListener>();
initListeners = new CopyOnWriteArraySet<IInitListener>(); initListeners = new HashSet<IInitListener>();
paintListeners = new CopyOnWriteArraySet<IPaintListener>(); paintListeners = new HashSet<IPaintListener>();
paintStatusListeners = new CopyOnWriteArraySet<IPaintStatusChangedListener>(); paintStatusListeners = new HashSet<IPaintStatusChangedListener>();
disposeListeners = new CopyOnWriteArraySet<IDisposeListener>(); disposeListeners = new HashSet<IDisposeListener>();
if (resourceData != null) { if (resourceData != null) {
resourceData.addChangeListener(new IResourceDataChanged() { resourceData.addChangeListener(new IResourceDataChanged() {
@ -717,7 +717,7 @@ public abstract class AbstractVizResource<T extends AbstractResourceData, D exte
*/ */
public final void recycle() { public final void recycle() {
if (status == ResourceStatus.INITIALIZED) { if (status == ResourceStatus.INITIALIZED) {
disposeInternal(); dispose();
} }
status = ResourceStatus.NEW; status = ResourceStatus.NEW;
initJob = null; initJob = null;

View file

@ -73,9 +73,6 @@ public class ColorMapCapability extends AbstractCapability implements
public void setColorMapParameters(ColorMapParameters colorMapParameters, public void setColorMapParameters(ColorMapParameters colorMapParameters,
boolean notify) { boolean notify) {
if (this.colorMapParameters != colorMapParameters) { if (this.colorMapParameters != colorMapParameters) {
if (this.colorMapParameters != null) {
this.colorMapParameters.removeListener(this);
}
this.colorMapParameters = colorMapParameters; this.colorMapParameters = colorMapParameters;
if (notify) { if (notify) {
capabilityChanged(); capabilityChanged();
@ -83,7 +80,7 @@ public class ColorMapCapability extends AbstractCapability implements
} }
if (this.colorMapParameters != null) { if (this.colorMapParameters != null) {
this.colorMapParameters.addListener(this); this.colorMapParameters.setListener(this);
} }
} }

View file

@ -21,115 +21,23 @@ package com.raytheon.uf.viz.core.rsc.hdf5;
import java.awt.Rectangle; import java.awt.Rectangle;
import org.geotools.coverage.grid.GeneralGridEnvelope;
import org.geotools.coverage.grid.GridGeometry2D;
import org.geotools.geometry.GeneralEnvelope;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.opengis.coverage.grid.GridEnvelope;
import org.opengis.geometry.Envelope;
import com.raytheon.uf.viz.core.PixelCoverage; import com.raytheon.uf.viz.core.PixelCoverage;
import com.vividsolutions.jts.geom.Coordinate;
/**
* ImageTile is an object that represents an image (or part of an image)
* geospatially, it contains a grid geometry that represents the projection and
* size of the image and a PixelCoverage which contains the screen projected
* data for the image. Because a single ImageTile can represent multiple images,
* this class does not contain the actual image it represents so the tile can be
* shared between images
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 13, 2012 mschenke Initial creation
*
* </pre>
*
* @author mschenke
* @version 1.0
*/
public class ImageTile { public class ImageTile {
public GridGeometry2D imageGeometry; public com.vividsolutions.jts.geom.Envelope envelope;
public double elevation;
public PixelCoverage coverage; public PixelCoverage coverage;
/** public Rectangle rect;
* Checks to see if the x/y coordinate is contained by the ImageTile's CRS
* Envelope
*
* @param x
* @param y
* @return
*/
public boolean contains(double x, double y) {
Envelope env = imageGeometry.getEnvelope();
return env.getMinimum(0) <= x && env.getMaximum(0) >= x
&& env.getMinimum(1) <= y && env.getMaximum(1) >= y;
}
/** // TODO clean up occlusionQueries move to GLImage?
* Checks to see if the Coordinate is contained by the ImageTile's CRS public int query = -1;
* Envelope
*
* @param c
* @return
*/
public boolean contains(Coordinate c) {
return contains(c.x, c.y);
}
/** public boolean occlude = false;
* Set the grid geometry of the tile given the image rectangle and the
* referenced envelope
*
* @param rect
* @param env
*/
public void setGridGeometry(Rectangle rect, ReferencedEnvelope env) {
GeneralGridEnvelope gge = new GeneralGridEnvelope(rect);
GeneralEnvelope ge = new GeneralEnvelope(env);
imageGeometry = new GridGeometry2D(gge, ge);
}
/**
* Set the image geometry
*
* @param imageGeometry
*/
public void setGridGeometry(GridGeometry2D imageGeometry) {
this.imageGeometry = imageGeometry;
}
/**
* Get the image rectangle. This could be a subsection of a larger image so
* x and y may not be 0,0
*
* @return
*/
public Rectangle getRectangle() {
GridEnvelope env = imageGeometry.getGridRange();
return new Rectangle(env.getLow(0), env.getLow(1), env.getSpan(0),
env.getSpan(1));
}
/**
* Get the spatially referenced envelope of the image tile
*
* @return
*/
public ReferencedEnvelope getEnvelope() {
return new ReferencedEnvelope(imageGeometry.getEnvelope());
}
/**
* Dispose the image tile, disposes of the coverage object associated with
* it
*/
public void dispose() { public void dispose() {
if (coverage != null) { if (coverage != null) {
coverage.dispose(); coverage.dispose();

View file

@ -0,0 +1,163 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.core.rsc.hdf5;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.opengis.referencing.operation.MathTransform;
import com.raytheon.uf.common.status.IUFStatusHandler;
import com.raytheon.uf.common.status.UFStatus;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.core.IMesh;
import com.raytheon.uf.viz.core.IMeshCallback;
import com.raytheon.uf.viz.core.PixelCoverage;
import com.raytheon.uf.viz.core.rsc.RenderingOrderFactory;
/**
* Persistent job used to calculate mesh tiles outside of the rendering thread
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 1, 2007 chammack Initial Creation.
*
* </pre>
*
* @author cnh
* @version 1
*/
public class MeshCalculatorJob extends Job {
private static final transient IUFStatusHandler statusHandler = UFStatus.getHandler(MeshCalculatorJob.class);
private static MeshCalculatorJob instance;
private ConcurrentLinkedQueue<PixelCoverage> requests;
private ConcurrentHashMap<PixelCoverage, MeshParameters> map;
private MeshCalculatorJob() {
super("Mesh Calculator");
requests = new ConcurrentLinkedQueue<PixelCoverage>();
map = new ConcurrentHashMap<PixelCoverage, MeshParameters>();
}
/**
* Request to have the mesh be calculated in the mesh thread
*
* @param mesh
* @param tile
* @param preTransform
*/
public synchronized void requestLoad(IMesh mesh, ImageTile tile,
MathTransform preTransform) {
if (!requests.contains(tile.coverage)) {
MeshParameters params = new MeshParameters();
params.tile = tile;
params.mesh = mesh;
params.preTransform = preTransform;
map.put(tile.coverage, params);
requests.add(tile.coverage);
}
instance.schedule();
}
/**
* Request to have the mesh be calculated in the mesh thread, with the
* callback being notified after the mesh has been calculated
*
* @param callback
* @param mesh
* @param tile
* @param preTransform
*/
public synchronized void requestLoad(IMeshCallback callback, IMesh mesh,
ImageTile tile, MathTransform preTransform) {
if (!requests.contains(tile.coverage)) {
MeshParameters params = new MeshParameters();
params.tile = tile;
params.mesh = mesh;
params.preTransform = preTransform;
params.callback = callback;
map.put(tile.coverage, params);
requests.add(tile.coverage);
}
instance.schedule();
}
public static synchronized MeshCalculatorJob getInstance() {
if (instance == null) {
instance = new MeshCalculatorJob();
instance.setSystem(true);
}
return instance;
}
/*
* (non-Javadoc)
*
* @seeorg.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.
* IProgressMonitor)
*/
@Override
protected IStatus run(IProgressMonitor monitor) {
while (requests.size() > 0) {
PixelCoverage coverage = requests.peek();
try {
MeshParameters p = map.get(coverage);
coverage.setMesh(null);
p.mesh.calculateMesh(coverage, p.tile, p.preTransform);
coverage.setMesh(p.mesh);
if (p.callback != null) {
p.callback.meshCalculated(p.tile);
}
} catch (Throwable t) {
statusHandler.handle(Priority.PROBLEM, "An error occured during mesh calculations, some images may not be properly reprojected.", t);
}
map.remove(coverage);
requests.remove();
}
return Status.OK_STATUS;
}
private class MeshParameters {
// public MapDescriptor mapDescriptor;
public IMesh mesh;
public ImageTile tile;
public MathTransform preTransform;
public IMeshCallback callback;
}
}

View file

@ -32,6 +32,7 @@ import com.raytheon.uf.common.message.IMessage;
import com.raytheon.uf.common.serialization.SerializationException; import com.raytheon.uf.common.serialization.SerializationException;
import com.raytheon.uf.common.serialization.SerializationUtil; import com.raytheon.uf.common.serialization.SerializationUtil;
import com.raytheon.uf.viz.core.comm.JMSConnection; import com.raytheon.uf.viz.core.comm.JMSConnection;
import com.raytheon.uf.viz.core.preferences.JMSPreferences;
/** /**
* Sends messages to jms endpoints programmatically. * Sends messages to jms endpoints programmatically.
@ -88,7 +89,8 @@ public class MessageSender {
dest = session.createQueue(endpoint); dest = session.createQueue(endpoint);
} }
if (DestinationType.TOPIC.equals(type)) { if (DestinationType.TOPIC.equals(type)) {
dest = session.createTopic(endpoint); dest = session
.createTopic(JMSPreferences.getPolicyString(endpoint));
} }
return dest; return dest;

View file

@ -37,6 +37,28 @@
</contourLabeling> </contourLabeling>
</contourStyle> </contourStyle>
</styleRule> </styleRule>
<!--
* GH, GHxSM, zAGL
dam | 0.1 | 0.0 | 4 | i4 | |..|8000F0FF| | 0 | 50
-->
<!-- geopotential height (GH) rules for HRRR-East -->
<styleRule>
<paramLevelMatches>
<parameter>GH</parameter>
<parameter>GHxSM</parameter>
<parameter>zAGL</parameter>
<creatingEntity>HRRR-East</creatingEntity>
<creatingEntity>HRRR-West</creatingEntity>
</paramLevelMatches>
<contourStyle>
<displayUnits>ft</displayUnits>
<contourLabeling labelSpacing="4" labelFormat="#">
<increment>5000</increment>
</contourLabeling>
</contourStyle>
</styleRule>
<!-- <!--
* GH, GHxSM, Topo, Surface * GH, GHxSM, Topo, Surface
m | 1.0 | 0.0 | 4 | i4 | |..|8000F0FF| | 12 | 1 100 200 300 500 700 1000 1500 2000 2500 3000 3500 m | 1.0 | 0.0 | 4 | i4 | |..|8000F0FF| | 12 | 1 100 200 300 500 700 1000 1500 2000 2500 3000 3500
@ -345,7 +367,7 @@ F | 1.8 |-459.67| 4 | | |..|8000F0FF| | 0 | 5
<contourStyle> <contourStyle>
<displayUnits>F</displayUnits> <displayUnits>F</displayUnits>
<range scale="LINEAR"> <range scale="LINEAR">
<minValue>-40</minValue> <minValue>-100</minValue>
<maxValue>115</maxValue> <maxValue>115</maxValue>
</range> </range>
<contourLabeling> <contourLabeling>
@ -962,7 +984,7 @@ PVU |1e5| 0.0 | 4 | | |..|8000F0FF| |16| \
<parameter>MpV</parameter> <parameter>MpV</parameter>
</paramLevelMatches> </paramLevelMatches>
<contourStyle> <contourStyle>
<displayUnits label="PVU">K/hPa/s*1.0E-5</displayUnits> <displayUnits label="PVU">K/hPa/s</displayUnits>
<contourLabeling labelSpacing="4"> <contourLabeling labelSpacing="4">
<values>-1 -.5 -.1 0 1 1.5 2 3 4 5 6 8 10 12 15 20</values> <values>-1 -.5 -.1 0 1 1.5 2 3 4 5 6 8 10 12 15 20</values>
</contourLabeling> </contourLabeling>

View file

@ -7,10 +7,7 @@ Bundle-Activator: com.raytheon.uf.viz.derivparam.Activator
Bundle-Vendor: RAYTHEON Bundle-Vendor: RAYTHEON
Require-Bundle: org.eclipse.core.runtime, Require-Bundle: org.eclipse.core.runtime,
javax.measure, javax.measure,
com.raytheon.uf.common.dataquery, com.raytheon.uf.common.dataquery
com.raytheon.uf.viz.core;bundle-version="1.12.1174",
com.raytheon.uf.common.datastorage;bundle-version="1.12.1174",
com.raytheon.uf.common.pointdata;bundle-version="1.12.1174"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy Bundle-ActivationPolicy: lazy
Eclipse-RegisterBuddy: com.raytheon.uf.common.serialization Eclipse-RegisterBuddy: com.raytheon.uf.common.serialization
@ -20,13 +17,21 @@ Import-Package: com.raytheon.edex.meteoLib,
com.raytheon.uf.common.dataplugin, com.raytheon.uf.common.dataplugin,
com.raytheon.uf.common.dataplugin.level, com.raytheon.uf.common.dataplugin.level,
com.raytheon.uf.common.dataplugin.persist, com.raytheon.uf.common.dataplugin.persist,
com.raytheon.uf.common.datastorage.records,
com.raytheon.uf.common.derivparam.tree, com.raytheon.uf.common.derivparam.tree,
com.raytheon.uf.common.localization, com.raytheon.uf.common.localization,
com.raytheon.uf.common.message.response, com.raytheon.uf.common.message.response,
com.raytheon.uf.common.serialization, com.raytheon.uf.common.serialization,
com.raytheon.uf.common.serialization.adapters, com.raytheon.uf.common.serialization.adapters,
com.raytheon.uf.common.status, com.raytheon.uf.common.status,
com.raytheon.uf.common.time com.raytheon.uf.common.time,
com.raytheon.uf.viz.core,
com.raytheon.uf.viz.core.catalog,
com.raytheon.uf.viz.core.comm,
com.raytheon.uf.viz.core.exception,
com.raytheon.uf.viz.core.level,
com.raytheon.uf.viz.core.localization,
com.raytheon.uf.viz.core.status
Export-Package: com.raytheon.uf.viz.derivparam, Export-Package: com.raytheon.uf.viz.derivparam,
com.raytheon.uf.viz.derivparam.data, com.raytheon.uf.viz.derivparam.data,
com.raytheon.uf.viz.derivparam.inv, com.raytheon.uf.viz.derivparam.inv,

View file

@ -1,394 +0,0 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.viz.derivparam.data;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import com.raytheon.uf.common.dataplugin.PluginDataObject;
import com.raytheon.uf.common.dataquery.requests.DbQueryRequest;
import com.raytheon.uf.common.dataquery.requests.DbQueryRequestSet;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint.ConstraintType;
import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest;
import com.raytheon.uf.common.dataquery.requests.TimeQueryRequestSet;
import com.raytheon.uf.common.dataquery.responses.DbQueryResponse;
import com.raytheon.uf.common.dataquery.responses.DbQueryResponseSet;
import com.raytheon.uf.common.datastorage.Request;
import com.raytheon.uf.common.datastorage.records.IDataRecord;
import com.raytheon.uf.common.pointdata.PointDataContainer;
import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.viz.core.catalog.LayerProperty;
import com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter;
import com.raytheon.uf.viz.core.datastructure.VizDataCubeException;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.requests.ThriftClient;
import com.raytheon.uf.viz.derivparam.tree.AbstractRequestableLevelNode;
import com.raytheon.uf.viz.derivparam.tree.AbstractRequestableLevelNode.Dependency;
/**
* Abstract data cube adapter for standard data type that uses derived
* parameters
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jan 30, 2012 mschenke Initial creation
*
* </pre>
*
* @author mschenke
* @version 1.0
*/
public abstract class AbstractDataCubeAdapter implements IDataCubeAdapter {
private String[] supportedPlugins;
protected AbstractDataCubeAdapter(String[] supportedPlugins) {
this.supportedPlugins = supportedPlugins;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getSupportedPlugins
* ()
*/
@Override
public String[] getSupportedPlugins() {
return supportedPlugins;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#timeQuery(java
* .util.List)
*/
@Override
public List<List<DataTime>> timeQuery(List<TimeQueryRequest> requests)
throws VizException {
int mapSize = (int) (requests.size() * 1) + 1;
Map<AbstractRequestableLevelNode, Set<DataTime>> cache = new HashMap<AbstractRequestableLevelNode, Set<DataTime>>(
mapSize);
LinkedHashMap<AbstractRequestableLevelNode, TimeQueryRequest> queries = new LinkedHashMap<AbstractRequestableLevelNode, TimeQueryRequest>(
mapSize);
for (TimeQueryRequest request : requests) {
List<AbstractRequestableLevelNode> requestNodes = evaluateRequestConstraints(request
.getQueryTerms());
// pull out time queries and bulk submit
for (AbstractRequestableLevelNode requestNode : requestNodes) {
getTimeQuery(request, requestNode, false, queries, cache, null);
}
}
// set the results back into the cache's
TimeQueryRequestSet reqSet = new TimeQueryRequestSet();
reqSet.setRequests(queries.values().toArray(
new TimeQueryRequest[queries.size()]));
@SuppressWarnings("unchecked")
List<List<DataTime>> qResponses = (List<List<DataTime>>) ThriftClient
.sendRequest(reqSet);
int index = 0;
for (AbstractRequestableLevelNode node : queries.keySet()) {
// put results into cache
node.setTimeQueryResults(false, qResponses.get(index++), cache,
null);
}
List<List<DataTime>> finalResponse = new ArrayList<List<DataTime>>(
requests.size());
for (TimeQueryRequest request : requests) {
List<AbstractRequestableLevelNode> requestNodes = evaluateRequestConstraints(request
.getQueryTerms());
// pull the actual results from the cache
Set<DataTime> results = new HashSet<DataTime>(64);
for (AbstractRequestableLevelNode requestNode : requestNodes) {
Set<DataTime> times = requestNode.timeQuery(request, false,
cache, null);
if (times == AbstractRequestableLevelNode.TIME_AGNOSTIC) {
// TODO: include time agnostic query in main bulk query as
// each pressure level will cause a separate query
List<DataTime> temp = timeAgnosticQuery(request
.getQueryTerms());
if (temp != null) {
results.addAll(temp);
}
break;
} else {
results.addAll(times);
}
}
if (!request.isMaxQuery() || results.isEmpty()) {
finalResponse.add(new ArrayList<DataTime>(results));
} else {
ArrayList<DataTime> response = new ArrayList<DataTime>(results);
Collections.sort(response);
finalResponse
.add(Arrays.asList(response.get(response.size() - 1)));
}
}
return finalResponse;
}
protected void getTimeQuery(
TimeQueryRequest originalRequest,
AbstractRequestableLevelNode req,
boolean latestOnly,
LinkedHashMap<AbstractRequestableLevelNode, TimeQueryRequest> queries,
Map<AbstractRequestableLevelNode, Set<DataTime>> cache,
Map<AbstractRequestableLevelNode, Set<DataTime>> latestOnlyCache)
throws VizException {
List<Dependency> depends = req.getDependencies();
if (depends.isEmpty()) {
// is source node
TimeQueryRequest myQ = req.getTimeQuery(originalRequest,
latestOnly, cache, latestOnlyCache);
if (myQ != null) {
// no need to merge timeQueries
queries.put(req, myQ);
}
} else {
for (Dependency dep : depends) {
// TODO: Optimize dTime/fTime to use bulk query mechanism,
// small case that is a not easy to get right with a bulk
// query
if (dep.timeOffset == 0 || !latestOnly) {
getTimeQuery(originalRequest, dep.node, latestOnly,
queries, cache, latestOnlyCache);
}
}
}
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getPoints(java
* .lang.String, java.lang.String[], java.util.Map)
*/
@Override
public PointDataContainer getPoints(String plugin, String[] parameters,
Map<String, RequestConstraint> queryParams) throws VizException {
// TODO Someday we should put objective analysis code
// into this area
return null;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getPoints(java
* .lang.String, java.lang.String[], java.lang.String, java.util.Map)
*/
@Override
public PointDataContainer getPoints(String plugin, String[] parameters,
String levelKey, Map<String, RequestConstraint> queryParams)
throws VizException {
// TODO Someday we should put objective analysis code
// into this area
return null;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getData(com.raytheon
* .uf.viz.core.catalog.LayerProperty, int)
*/
@Override
public List<Object> getData(LayerProperty property, int timeOut)
throws VizException {
List<AbstractRequestableLevelNode> requests = evaluateRequestConstraints(property
.getEntryQueryParameters(false));
int mapSize = (int) (requests.size() * 1.25) + 1;
Map<AbstractRequestableLevelNode, List<AbstractRequestableData>> cache = new HashMap<AbstractRequestableLevelNode, List<AbstractRequestableData>>(
mapSize);
LinkedHashMap<AbstractRequestableLevelNode, DbQueryRequest> queries = new LinkedHashMap<AbstractRequestableLevelNode, DbQueryRequest>(
mapSize);
for (AbstractRequestableLevelNode req : requests) {
getDataQuery(req, property, timeOut, queries, cache);
}
DbQueryRequestSet reqSet = new DbQueryRequestSet();
reqSet.setQueries(queries.values().toArray(
new DbQueryRequest[queries.size()]));
DbQueryResponseSet qSetResponse = (DbQueryResponseSet) ThriftClient
.sendRequest(reqSet);
DbQueryResponse[] qResponses = qSetResponse.getResults();
int index = 0;
for (AbstractRequestableLevelNode node : queries.keySet()) {
// put results into cache
node.setDataQueryResults(qResponses[index++], cache);
}
// pull the actual results from the cache
List<AbstractRequestableData> requesters = new ArrayList<AbstractRequestableData>(
requests.size());
for (AbstractRequestableLevelNode request : requests) {
requesters.addAll(request.getData(property, timeOut, cache));
}
return getData(property, requesters);
}
protected void getDataQuery(
AbstractRequestableLevelNode req,
LayerProperty property,
int timeOut,
LinkedHashMap<AbstractRequestableLevelNode, DbQueryRequest> queries,
Map<AbstractRequestableLevelNode, List<AbstractRequestableData>> cache)
throws VizException {
List<Dependency> depends = req.getDependencies();
if (depends.isEmpty()) {
// is source node
DbQueryRequest myQ = req.getDataQuery(property, timeOut, cache);
if (myQ != null) {
addDataQuery(req, myQ, queries);
}
} else {
for (Dependency dep : depends) {
// TODO: Optimize dTime/fTime to use bulk query mechanism,
// small case that is a not easy to get right with a bulk
// query
if (dep.timeOffset == 0) {
getDataQuery(dep.node, property, timeOut, queries, cache);
}
}
}
}
private void addDataQuery(AbstractRequestableLevelNode req,
DbQueryRequest query,
LinkedHashMap<AbstractRequestableLevelNode, DbQueryRequest> queries) {
DbQueryRequest curQuery = queries.get(req);
if (curQuery == null) {
queries.put(req, query);
} else {
// merge
// assume same DB, fields, etc, should only be different
// time constraints since its the same node
RequestConstraint curDTs = curQuery.getConstraints()
.get("dataTime");
RequestConstraint myDTs = query.getConstraints().get("dataTime");
if (curDTs != null && myDTs != null) {
// only merge if both require dataTimes, otherwise one
// would be constrained when it needs everything, also
// assuming both to be in lists and needing to be merged
curDTs.setConstraintType(ConstraintType.IN);
Pattern split = Pattern.compile(",");
String[] curVals = split.split(curDTs.getConstraintValue());
String[] myVals = split.split(myDTs.getConstraintValue());
HashSet<String> dups = new HashSet<String>(curVals.length
+ myVals.length);
dups.addAll(Arrays.asList(curVals));
dups.addAll(Arrays.asList(myVals));
curDTs.setConstraintValueList(dups.toArray(new String[dups
.size()]));
}
}
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#
* getBaseUpdateConstraints(java.util.Map)
*/
@Override
public List<Map<String, RequestConstraint>> getBaseUpdateConstraints(
Map<String, RequestConstraint> constraints) {
List<Map<String, RequestConstraint>> result = new ArrayList<Map<String, RequestConstraint>>(
1);
result.add(constraints);
return result;
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getRecord(com
* .raytheon.uf.common.dataplugin.PluginDataObject)
*/
@Override
public IDataRecord[] getRecord(PluginDataObject obj)
throws VizDataCubeException {
return getRecord(obj, Request.ALL, null);
}
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.core.datastructure.IDataCubeAdapter#getRecord(com
* .raytheon.uf.common.dataplugin.PluginDataObject,
* com.raytheon.uf.common.datastorage.Request, java.lang.String)
*/
@Override
public IDataRecord[] getRecord(PluginDataObject obj, Request req,
String dataset) throws VizDataCubeException {
getRecords(Arrays.asList(obj), req, dataset);
IDataRecord[] result = (IDataRecord[]) obj.getMessageData();
obj.setMessageData(null);
return result;
}
/**
* Scan the inventory for AbstractRequestableLevelNodes that match the
* request constraints
*
* @param constraints
* @return
*/
protected abstract List<AbstractRequestableLevelNode> evaluateRequestConstraints(
Map<String, RequestConstraint> constraints);
/**
* @param queryTerms
* @return
*/
protected abstract List<DataTime> timeAgnosticQuery(
Map<String, RequestConstraint> queryTerms) throws VizException;
/**
* @param requesters
* @return
*/
protected abstract List<Object> getData(LayerProperty property,
List<AbstractRequestableData> requesters) throws VizException;
}

View file

@ -579,7 +579,7 @@ public abstract class AbstractInventory implements DerivParamUpdateListener {
|| levelsToProcess == null || sourcesToProcess.isEmpty() || levelsToProcess == null || sourcesToProcess.isEmpty()
|| paramsToProcess.isEmpty() || levelsToProcess.isEmpty() || paramsToProcess.isEmpty() || levelsToProcess.isEmpty()
|| derParLibrary == null) { || derParLibrary == null) {
return Collections.emptyList(); return null;
} }
if (clazz != null) { if (clazz != null) {
// when clazz == null we need to link the aliases to the source // when clazz == null we need to link the aliases to the source

View file

@ -26,7 +26,6 @@ import java.util.Set;
import com.raytheon.uf.common.dataplugin.level.Level; import com.raytheon.uf.common.dataplugin.level.Level;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint; import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest;
import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.derivparam.library.DerivParamDesc; import com.raytheon.uf.viz.derivparam.library.DerivParamDesc;
@ -68,13 +67,11 @@ public abstract class AbstractAliasLevelNode extends AbstractDerivedLevelNode {
} }
@Override @Override
public Set<DataTime> timeQueryInternal(TimeQueryRequest originalRequest, public Set<DataTime> timeQueryInternal(boolean latestOnly,
boolean latestOnly,
Map<AbstractRequestableLevelNode, Set<DataTime>> cache, Map<AbstractRequestableLevelNode, Set<DataTime>> cache,
Map<AbstractRequestableLevelNode, Set<DataTime>> latestOnlyCache) Map<AbstractRequestableLevelNode, Set<DataTime>> latestOnlyCache)
throws VizException { throws VizException {
return sourceNode.timeQuery(originalRequest, latestOnly, cache, return sourceNode.timeQuery(latestOnly, cache, latestOnlyCache);
latestOnlyCache);
} }
@Override @Override

View file

@ -31,7 +31,6 @@ import java.util.Set;
import com.raytheon.uf.common.dataplugin.level.Level; import com.raytheon.uf.common.dataplugin.level.Level;
import com.raytheon.uf.common.dataquery.requests.RequestConstraint; import com.raytheon.uf.common.dataquery.requests.RequestConstraint;
import com.raytheon.uf.common.dataquery.requests.TimeQueryRequest;
import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.common.time.DataTime;
import com.raytheon.uf.viz.core.catalog.CatalogQuery; import com.raytheon.uf.viz.core.catalog.CatalogQuery;
import com.raytheon.uf.viz.core.catalog.LayerProperty; import com.raytheon.uf.viz.core.catalog.LayerProperty;
@ -271,8 +270,7 @@ public abstract class AbstractCubeLevelNode extends AbstractDerivedLevelNode {
Map<String, RequestConstraint> requestContraintsToFilter); Map<String, RequestConstraint> requestContraintsToFilter);
@Override @Override
public Set<DataTime> timeQueryInternal(TimeQueryRequest originalRequest, public Set<DataTime> timeQueryInternal(boolean latestOnly,
boolean latestOnly,
Map<AbstractRequestableLevelNode, Set<DataTime>> cache, Map<AbstractRequestableLevelNode, Set<DataTime>> cache,
Map<AbstractRequestableLevelNode, Set<DataTime>> latestOnlyCache) Map<AbstractRequestableLevelNode, Set<DataTime>> latestOnlyCache)
throws VizException { throws VizException {
@ -301,8 +299,8 @@ public abstract class AbstractCubeLevelNode extends AbstractDerivedLevelNode {
results.addAll(mergedTimeQuery(merge(requests), latestOnly)); results.addAll(mergedTimeQuery(merge(requests), latestOnly));
for (AbstractRequestableLevelNode request : requests) { for (AbstractRequestableLevelNode request : requests) {
results.addAll(request.timeQuery(originalRequest, latestOnly, results.addAll(request
cache, latestOnlyCache)); .timeQuery(latestOnly, cache, latestOnlyCache));
} }
return results; return results;
} }

View file

@ -243,8 +243,7 @@ public abstract class AbstractDerivedLevelNode extends
} }
@Override @Override
protected TimeQueryRequest getTimeQueryInternal( protected TimeQueryRequest getTimeQueryInternal(boolean latestOnly,
TimeQueryRequest originalRequest, boolean latestOnly,
Map<AbstractRequestableLevelNode, Set<DataTime>> cache) Map<AbstractRequestableLevelNode, Set<DataTime>> cache)
throws VizException { throws VizException {
throw new UnsupportedOperationException( throw new UnsupportedOperationException(

View file

@ -205,8 +205,7 @@ public abstract class AbstractRequestableLevelNode extends LevelNode {
protected abstract List<AbstractRequestableData> processDataQueryResults( protected abstract List<AbstractRequestableData> processDataQueryResults(
DbQueryResponse queryResponse) throws VizException; DbQueryResponse queryResponse) throws VizException;
public Set<DataTime> timeQuery(TimeQueryRequest originalRequest, public Set<DataTime> timeQuery(boolean latestOnly,
boolean latestOnly,
Map<AbstractRequestableLevelNode, Set<DataTime>> cache, Map<AbstractRequestableLevelNode, Set<DataTime>> cache,
Map<AbstractRequestableLevelNode, Set<DataTime>> latestOnlyCache) Map<AbstractRequestableLevelNode, Set<DataTime>> latestOnlyCache)
throws VizException { throws VizException {
@ -216,16 +215,15 @@ public abstract class AbstractRequestableLevelNode extends LevelNode {
return latestOnlyCache.get(this); return latestOnlyCache.get(this);
} }
Set<DataTime> results = timeQueryInternal(originalRequest, latestOnly, Set<DataTime> results = timeQueryInternal(latestOnly, cache,
cache, latestOnlyCache); latestOnlyCache);
if (cache != null && !latestOnly) { if (cache != null && !latestOnly) {
cache.put(this, results); cache.put(this, results);
} }
return results; return results;
} }
public TimeQueryRequest getTimeQuery(TimeQueryRequest originalRequest, public TimeQueryRequest getTimeQuery(boolean latestOnly,
boolean latestOnly,
Map<AbstractRequestableLevelNode, Set<DataTime>> cache, Map<AbstractRequestableLevelNode, Set<DataTime>> cache,
Map<AbstractRequestableLevelNode, Set<DataTime>> latestOnlyCache) Map<AbstractRequestableLevelNode, Set<DataTime>> latestOnlyCache)
throws VizException { throws VizException {
@ -235,7 +233,7 @@ public abstract class AbstractRequestableLevelNode extends LevelNode {
return null; return null;
} }
return getTimeQueryInternal(originalRequest, latestOnly, cache); return getTimeQueryInternal(latestOnly, cache);
} }
public void setTimeQueryResults(boolean latestOnly, public void setTimeQueryResults(boolean latestOnly,
@ -388,14 +386,13 @@ public abstract class AbstractRequestableLevelNode extends LevelNode {
return rval; return rval;
} }
protected abstract Set<DataTime> timeQueryInternal( protected abstract Set<DataTime> timeQueryInternal(boolean latestOnly,
TimeQueryRequest originalRequest, boolean latestOnly,
Map<AbstractRequestableLevelNode, Set<DataTime>> cache, Map<AbstractRequestableLevelNode, Set<DataTime>> cache,
Map<AbstractRequestableLevelNode, Set<DataTime>> latestOnlyCache) Map<AbstractRequestableLevelNode, Set<DataTime>> latestOnlyCache)
throws VizException; throws VizException;
protected abstract TimeQueryRequest getTimeQueryInternal( protected abstract TimeQueryRequest getTimeQueryInternal(
TimeQueryRequest originalRequest, boolean latestOnly, boolean latestOnly,
Map<AbstractRequestableLevelNode, Set<DataTime>> cache) Map<AbstractRequestableLevelNode, Set<DataTime>> cache)
throws VizException; throws VizException;
@ -411,9 +408,8 @@ public abstract class AbstractRequestableLevelNode extends LevelNode {
Map<AbstractRequestableLevelNode, List<AbstractRequestableData>> cache) Map<AbstractRequestableLevelNode, List<AbstractRequestableData>> cache)
throws VizException; throws VizException;
protected Set<DataTime> timeQuery(TimeQueryRequest originalRequest, protected Set<DataTime> timeQuery(boolean latestOnly) throws VizException {
boolean latestOnly) throws VizException { return timeQuery(latestOnly,
return timeQuery(originalRequest, latestOnly,
new HashMap<AbstractRequestableLevelNode, Set<DataTime>>(), new HashMap<AbstractRequestableLevelNode, Set<DataTime>>(),
new HashMap<AbstractRequestableLevelNode, Set<DataTime>>()); new HashMap<AbstractRequestableLevelNode, Set<DataTime>>());
} }

Some files were not shown because too many files have changed in this diff Show more