12.4.1-4 baseline
Former-commit-id:4767b0e069
[formerly750b7543dd
] [formerly67a5a68300
] [formerly2a216f333c
[formerly67a5a68300
[formerly ad648deaf4d3edaabdda15184289b3a927308bd7]]] Former-commit-id:2a216f333c
Former-commit-id: e8514db31c64b82122112f0e87cbbf3cda2d8c2b [formerlya4e519f3cd
] Former-commit-id:a2a6a18fae
This commit is contained in:
parent
ea7fcde242
commit
98d8b3f188
1286 changed files with 117107 additions and 116024 deletions
0
MHSEmulator/MHSEmulator.ecl
Normal file
0
MHSEmulator/MHSEmulator.ecl
Normal file
0
RadarServer/build.rcm/build.rcm.ecl
Normal file
0
RadarServer/build.rcm/build.rcm.ecl
Normal 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
0
cave/build/build.ecl
Normal 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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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"):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -87,7 +87,6 @@ public abstract class AbstractDbMapResource<T extends AbstractDbMapResourceData,
|
||||||
|
|
||||||
if (font != null) {
|
if (font != null) {
|
||||||
font.dispose();
|
font.dispose();
|
||||||
font = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -540,7 +540,7 @@ public class DbMapResource extends
|
||||||
if (shadedShape != null) {
|
if (shadedShape != null) {
|
||||||
shadedShape.dispose();
|
shadedShape.dispose();
|
||||||
}
|
}
|
||||||
lastExtent = null;
|
|
||||||
super.disposeInternal();
|
super.disposeInternal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
}
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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()]));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
*
|
*
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
|
||||||
}
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
||||||
|
|
0
cave/com.raytheon.uf.viz.cwa/com.raytheon.uf.viz.cwa.ecl
Normal file
0
cave/com.raytheon.uf.viz.cwa/com.raytheon.uf.viz.cwa.ecl
Normal 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>
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
Loading…
Add table
Reference in a new issue