Got efficient sending of events working where it only sends if events changed

Change-Id: I499a38c1b9cbbd3ede5b04356d2f7788153f836b

Former-commit-id: 84b8ffa490 [formerly 84b8ffa490 [formerly 2f1f6dd97555c46547a7440c97a5314f7a26dc8d]]
Former-commit-id: 28693e6991
Former-commit-id: e608125f9d
This commit is contained in:
Max Schenkelberg 2012-04-25 16:18:41 -05:00
parent 9d0fd819ff
commit 0ba535a60b
28 changed files with 616 additions and 371 deletions

View file

@ -23,6 +23,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
import com.raytheon.uf.viz.remote.graphics.events.AbstractDispatchingObjectEvent; import com.raytheon.uf.viz.remote.graphics.events.AbstractDispatchingObjectEvent;
import com.raytheon.uf.viz.remote.graphics.events.ICreationEvent; import com.raytheon.uf.viz.remote.graphics.events.ICreationEvent;
import com.raytheon.uf.viz.remote.graphics.events.colormap.UpdateColorMapEvent;
import com.raytheon.uf.viz.remote.graphics.events.colormap.UpdateColorMapParametersEvent; import com.raytheon.uf.viz.remote.graphics.events.colormap.UpdateColorMapParametersEvent;
/** /**
@ -54,6 +55,9 @@ public class CreateMosaicImageEvent extends AbstractDispatchingObjectEvent
@DynamicSerializeElement @DynamicSerializeElement
private UpdateColorMapParametersEvent colorMapParameters; private UpdateColorMapParametersEvent colorMapParameters;
@DynamicSerializeElement
private UpdateColorMapEvent colorMap;
/** /**
* @return the bounds * @return the bounds
*/ */
@ -100,4 +104,19 @@ public class CreateMosaicImageEvent extends AbstractDispatchingObjectEvent
this.colorMapParameters = colorMapParameters; this.colorMapParameters = colorMapParameters;
} }
/**
* @return the colorMap
*/
public UpdateColorMapEvent getColorMap() {
return colorMap;
}
/**
* @param colorMap
* the colorMap to set
*/
public void setColorMap(UpdateColorMapEvent colorMap) {
this.colorMap = colorMap;
}
} }

View file

@ -55,6 +55,8 @@ public class DispatchingMosaicImage extends
private PaintImageEvent[] imagesToMosaic; private PaintImageEvent[] imagesToMosaic;
private IExtent imageExtent;
/** /**
* @param targetObject * @param targetObject
* @param extensionClass * @param extensionClass
@ -62,8 +64,10 @@ public class DispatchingMosaicImage extends
*/ */
public DispatchingMosaicImage(IMosaicImage targetObject, public DispatchingMosaicImage(IMosaicImage targetObject,
Class<? extends IImagingExtension> extensionClass, Class<? extends IImagingExtension> extensionClass,
Dispatcher dispatcher, ColorMapParameters parameters) { Dispatcher dispatcher, ColorMapParameters parameters,
IExtent imageExtent) {
super(targetObject, extensionClass, dispatcher, parameters); super(targetObject, extensionClass, dispatcher, parameters);
this.imageExtent = imageExtent;
} }
/* /*
@ -75,6 +79,8 @@ public class DispatchingMosaicImage extends
*/ */
@Override @Override
public void setImagesToMosaic(DrawableImage... images) { public void setImagesToMosaic(DrawableImage... images) {
wrappedObject.setImagesToMosaic(PaintImagesEvent
.extractTargetImages(images));
PaintImageEvent[] imagesToMosaic = PaintImagesEvent PaintImageEvent[] imagesToMosaic = PaintImagesEvent
.toPaintEvents(images); .toPaintEvents(images);
if (Arrays.equals(imagesToMosaic, this.imagesToMosaic) == false) { if (Arrays.equals(imagesToMosaic, this.imagesToMosaic) == false) {
@ -82,8 +88,6 @@ public class DispatchingMosaicImage extends
UpdateImagesToMosaic event = RemoteGraphicsEventFactory UpdateImagesToMosaic event = RemoteGraphicsEventFactory
.createEvent(UpdateImagesToMosaic.class, this); .createEvent(UpdateImagesToMosaic.class, this);
event.setImagesToMosaic(imagesToMosaic); event.setImagesToMosaic(imagesToMosaic);
wrappedObject.setImagesToMosaic(PaintImagesEvent
.extractTargetImages(images));
dispatch(event); dispatch(event);
} }
} }
@ -98,10 +102,13 @@ public class DispatchingMosaicImage extends
@Override @Override
public void setImageExtent(IExtent imageExtent) { public void setImageExtent(IExtent imageExtent) {
wrappedObject.setImageExtent(imageExtent); wrappedObject.setImageExtent(imageExtent);
UpdateMosaicExtent extentUpdate = RemoteGraphicsEventFactory if (imageExtent.equals(this.imageExtent) == false) {
.createEvent(UpdateMosaicExtent.class, this); this.imageExtent = imageExtent;
extentUpdate.setIExtent(imageExtent); UpdateMosaicExtent extentUpdate = RemoteGraphicsEventFactory
dispatch(extentUpdate); .createEvent(UpdateMosaicExtent.class, this);
extentUpdate.setIExtent(imageExtent);
dispatch(extentUpdate);
}
} }
} }

View file

@ -23,6 +23,8 @@ import com.raytheon.uf.viz.core.IExtent;
import com.raytheon.uf.viz.core.drawables.ColorMapParameters; import com.raytheon.uf.viz.core.drawables.ColorMapParameters;
import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.remote.graphics.events.RemoteGraphicsEventFactory; import com.raytheon.uf.viz.remote.graphics.events.RemoteGraphicsEventFactory;
import com.raytheon.uf.viz.remote.graphics.events.colormap.UpdateColorMapEvent;
import com.raytheon.uf.viz.remote.graphics.events.colormap.UpdateColorMapParametersEvent;
import com.raytheon.uf.viz.remote.graphics.extensions.AbstractDispatchingImageExtension; import com.raytheon.uf.viz.remote.graphics.extensions.AbstractDispatchingImageExtension;
import com.raytheon.viz.radar.rsc.mosaic.ext.IRadarMosaicImageExtension; import com.raytheon.viz.radar.rsc.mosaic.ext.IRadarMosaicImageExtension;
@ -62,14 +64,16 @@ public class DispatchingRadarMosaicExtension extends
.getExtension(IRadarMosaicImageExtension.class) .getExtension(IRadarMosaicImageExtension.class)
.initializeRaster(imageBounds, imageExtent, params), .initializeRaster(imageBounds, imageExtent, params),
DispatchingRadarMosaicExtension.class, target.getDispatcher(), DispatchingRadarMosaicExtension.class, target.getDispatcher(),
params); params, imageExtent);
// Send creation event // Send creation event
CreateMosaicImageEvent creation = RemoteGraphicsEventFactory CreateMosaicImageEvent creation = RemoteGraphicsEventFactory
.createEvent(CreateMosaicImageEvent.class, image); .createEvent(CreateMosaicImageEvent.class, image);
creation.setBounds(imageBounds); creation.setBounds(imageBounds);
if (params != null) { if (params != null) {
creation.setColorMapParameters(DispatchingMosaicImage creation.setColorMapParameters(UpdateColorMapParametersEvent
.createColorMapParametersUpdateEvent(image)); .createEvent(image, params));
creation.setColorMap(UpdateColorMapEvent.createEvent(image,
params.getColorMap()));
} }
if (imageExtent != null) { if (imageExtent != null) {
UpdateMosaicExtent extentUpdate = RemoteGraphicsEventFactory UpdateMosaicExtent extentUpdate = RemoteGraphicsEventFactory

View file

@ -76,7 +76,10 @@ public class RadarGraphicsExtRenderingHandler extends
imageExtent = event.getExtent().getIExtent(); imageExtent = event.getExtent().getIExtent();
} }
if (event.getColorMapParameters() != null) { if (event.getColorMapParameters() != null) {
parameters = event.getColorMapParameters().asColorMapParameters(); parameters = event.getColorMapParameters().getColorMapParameters();
if (event.getColorMap() != null && parameters != null) {
parameters.setColorMap(event.getColorMap().getColorMap());
}
} }
dataManager.putRenderableObject( dataManager.putRenderableObject(
imageId, imageId,

View file

@ -19,7 +19,8 @@ Require-Bundle: com.raytheon.viz.ui,
com.raytheon.viz.core;bundle-version="1.12.1174", com.raytheon.viz.core;bundle-version="1.12.1174",
com.raytheon.uf.viz.drawing;bundle-version="1.0.0", com.raytheon.uf.viz.drawing;bundle-version="1.0.0",
com.raytheon.uf.viz.remote.graphics;bundle-version="1.0.0", com.raytheon.uf.viz.remote.graphics;bundle-version="1.0.0",
com.raytheon.uf.common.comm;bundle-version="1.12.1174" com.raytheon.uf.common.comm;bundle-version="1.12.1174",
com.raytheon.uf.common.colormap;bundle-version="1.12.1174"
Import-Package: com.raytheon.uf.common.status, Import-Package: com.raytheon.uf.common.status,
com.raytheon.uf.viz.core.maps.display, com.raytheon.uf.viz.core.maps.display,
com.raytheon.uf.viz.core.maps.rsc, com.raytheon.uf.viz.core.maps.rsc,

View file

@ -103,18 +103,7 @@ public class CollaborationDispatcher extends Dispatcher {
byte[] data = Tools.compress(SerializationUtil byte[] data = Tools.compress(SerializationUtil
.transformToThrift(eventObject)); .transformToThrift(eventObject));
if (data.length > IMMEDIATE_SEND_SIZE) { if (data.length > IMMEDIATE_SEND_SIZE) {
System.err.println("Object: "
+ eventObject.getClass().getSimpleName()
+ " is too large to send immediately, size is "
+ data.length + " bytes");
immediateSend = false; immediateSend = false;
} else {
System.out
.println("Object: "
+ eventObject.getClass()
.getSimpleName()
+ " is small enough to send immediately, size is "
+ data.length + " bytes");
} }
} catch (Exception e) { } catch (Exception e) {
Activator.statusHandler.handle(Priority.PROBLEM, Activator.statusHandler.handle(Priority.PROBLEM,

View file

@ -68,8 +68,6 @@ public class CollaborationObjectEventStorage implements
private static final int SESSION_DATA_PORT = 80; private static final int SESSION_DATA_PORT = 80;
private volatile long EVENT_ID_COUNTER = 0;
public static IObjectEventPersistance createPersistanceObject( public static IObjectEventPersistance createPersistanceObject(
ISharedDisplaySession session) throws CollaborationException { ISharedDisplaySession session) throws CollaborationException {
CollaborationObjectEventStorage persistance = new CollaborationObjectEventStorage( CollaborationObjectEventStorage persistance = new CollaborationObjectEventStorage(
@ -133,13 +131,13 @@ public class CollaborationObjectEventStorage implements
try { try {
CollaborationHttpPersistedEvent wrapped = new CollaborationHttpPersistedEvent(); CollaborationHttpPersistedEvent wrapped = new CollaborationHttpPersistedEvent();
String eventObjectURL = sessionDataURL + event.getObjectId() + "/" String eventObjectURL = sessionDataURL + event.getObjectId() + "/"
+ (++EVENT_ID_COUNTER) + ".obj"; + event.getClass().getName() + ".obj";
HttpPut put = new HttpPut(eventObjectURL); HttpPut put = new HttpPut(eventObjectURL);
put.setEntity(new ByteArrayEntity(Tools.compress(SerializationUtil put.setEntity(new ByteArrayEntity(Tools.compress(SerializationUtil
.transformToThrift(event)))); .transformToThrift(event))));
HttpClientResponse response = executeRequest(put); HttpClientResponse response = executeRequest(put);
if (response.code != 201) { if (isSuccess(response.code) == false) {
throw new CollaborationException( throw new CollaborationException(
"Error uploading event object to server @ " "Error uploading event object to server @ "
+ eventObjectURL + " : " + eventObjectURL + " : "
@ -182,7 +180,7 @@ public class CollaborationObjectEventStorage implements
.getResourceURL(); .getResourceURL();
HttpGet get = new HttpGet(objectURL); HttpGet get = new HttpGet(objectURL);
HttpClientResponse response = executeRequest(get); HttpClientResponse response = executeRequest(get);
if (response.code == 200) { if (isSuccess(response.code)) {
try { try {
return (AbstractDispatchingObjectEvent) SerializationUtil return (AbstractDispatchingObjectEvent) SerializationUtil
.transformFromThrift(Tools .transformFromThrift(Tools
@ -227,7 +225,7 @@ public class CollaborationObjectEventStorage implements
}; };
mkcol.setURI(URI.create(sessionDataURL + folderPath)); mkcol.setURI(URI.create(sessionDataURL + folderPath));
HttpClientResponse rsp = executeRequest(mkcol); HttpClientResponse rsp = executeRequest(mkcol);
if (rsp.code != 201) { if (isSuccess(rsp.code) == false) {
throw new CollaborationException("Folder creation failed for " throw new CollaborationException("Folder creation failed for "
+ folderPath + ": " + new String(rsp.data)); + folderPath + ": " + new String(rsp.data));
} }
@ -235,10 +233,8 @@ public class CollaborationObjectEventStorage implements
private void deleteResource(URI uri) throws CollaborationException { private void deleteResource(URI uri) throws CollaborationException {
HttpClientResponse rsp = executeRequest(new HttpDelete(uri)); HttpClientResponse rsp = executeRequest(new HttpDelete(uri));
// Valid DELETE return codes are 200, 202, and 204, 404 means resource // If request was success or resource doesn't exist, we are good
// has already been deleted if (isSuccess(rsp.code) == false && isNotExists(rsp.code) == false) {
if (rsp.code != 200 && rsp.code != 202 && rsp.code != 204
&& rsp.code != 404) {
throw new CollaborationException("Folder creation failed for " throw new CollaborationException("Folder creation failed for "
+ uri + ": " + new String(rsp.data)); + uri + ": " + new String(rsp.data));
} }
@ -253,6 +249,14 @@ public class CollaborationObjectEventStorage implements
} }
} }
private boolean isSuccess(int code) {
return code >= 200 && code < 300;
}
private boolean isNotExists(int code) {
return code == 404 || code == 410;
}
@DynamicSerialize @DynamicSerialize
public static class CollaborationHttpPersistedEvent implements public static class CollaborationHttpPersistedEvent implements
IPersistedEvent { IPersistedEvent {

View file

@ -77,6 +77,8 @@ public class RenderFrameEvent extends AbstractDispatchingObjectEvent {
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) if (this == obj)
return true; return true;
if (!super.equals(obj))
return false;
if (obj == null) if (obj == null)
return false; return false;
if (getClass() != obj.getClass()) if (getClass() != obj.getClass())

View file

@ -24,6 +24,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import com.raytheon.uf.common.colormap.IColorMap;
import com.raytheon.uf.viz.core.DrawableImage; 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.IMesh; import com.raytheon.uf.viz.core.IMesh;
@ -41,6 +42,7 @@ import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.map.IMapMeshExtension; import com.raytheon.uf.viz.core.map.IMapMeshExtension;
import com.raytheon.uf.viz.remote.graphics.events.colormap.ColorMapDataEvent; import com.raytheon.uf.viz.remote.graphics.events.colormap.ColorMapDataEvent;
import com.raytheon.uf.viz.remote.graphics.events.colormap.CreateColormappedImageEvent; import com.raytheon.uf.viz.remote.graphics.events.colormap.CreateColormappedImageEvent;
import com.raytheon.uf.viz.remote.graphics.events.colormap.UpdateColorMapEvent;
import com.raytheon.uf.viz.remote.graphics.events.colormap.UpdateColorMapParametersEvent; import com.raytheon.uf.viz.remote.graphics.events.colormap.UpdateColorMapParametersEvent;
import com.raytheon.uf.viz.remote.graphics.events.imagery.CreateIImageEvent; import com.raytheon.uf.viz.remote.graphics.events.imagery.CreateIImageEvent;
import com.raytheon.uf.viz.remote.graphics.events.imagery.CreateSingleColorImage; import com.raytheon.uf.viz.remote.graphics.events.imagery.CreateSingleColorImage;
@ -71,6 +73,8 @@ import com.raytheon.uf.viz.remote.graphics.events.mesh.ReprojectMeshEvent;
public class ImagingRenderingHandler extends CollaborationRenderingHandler { public class ImagingRenderingHandler extends CollaborationRenderingHandler {
private Object colorMapLock = new Object();
@Subscribe @Subscribe
public void renderImages(PaintImagesEvent event) throws VizException { public void renderImages(PaintImagesEvent event) throws VizException {
PaintProperties paintProps = getPaintProperties(); PaintProperties paintProps = getPaintProperties();
@ -188,10 +192,14 @@ public class ImagingRenderingHandler extends CollaborationRenderingHandler {
IGraphicsTarget target = getTarget(); IGraphicsTarget target = getTarget();
int imageId = event.getObjectId(); int imageId = event.getObjectId();
IColorMapDataRetrievalCallback callback = new ColorMapDataCallback(); IColorMapDataRetrievalCallback callback = new ColorMapDataCallback();
UpdateColorMapParametersEvent cmapEvent = event.getColorMapParameters(); UpdateColorMapParametersEvent cmapParamEvent = event
.getColorMapParameters();
ColorMapParameters params = null; ColorMapParameters params = null;
if (cmapEvent != null) { if (cmapParamEvent != null) {
params = cmapEvent.asColorMapParameters(); params = cmapParamEvent.getColorMapParameters();
if (event.getColorMap() != null && params != null) {
params.setColorMap(event.getColorMap().getColorMap());
}
} }
IColormappedImage image = target.getExtension( IColormappedImage image = target.getExtension(
IColormappedImageExtension.class).initializeRaster(callback, IColormappedImageExtension.class).initializeRaster(callback,
@ -200,6 +208,41 @@ public class ImagingRenderingHandler extends CollaborationRenderingHandler {
new Object[] { image, callback }); new Object[] { image, callback });
} }
@Subscribe
public void updateColorMapParameters(UpdateColorMapParametersEvent event) {
IColormappedImage image = dataManager.getRenderableObject(
event.getObjectId(), IColormappedImage.class);
if (image != null) {
ColorMapParameters newParams = event.getColorMapParameters();
synchronized (colorMapLock) {
ColorMapParameters params = image.getColorMapParameters();
if (params != null && newParams != null) {
newParams.setColorMap(params.getColorMap());
}
image.setColorMapParameters(newParams);
}
}
}
@Subscribe
public void updateColorMap(UpdateColorMapEvent event) {
IColormappedImage image = dataManager.getRenderableObject(
event.getObjectId(), IColormappedImage.class);
if (image != null) {
IColorMap colorMap = event.getColorMap();
synchronized (colorMapLock) {
ColorMapParameters params = image.getColorMapParameters();
if (params == null && colorMap != null) {
params = new ColorMapParameters();
params.setColorMap(colorMap);
image.setColorMapParameters(params);
} else if (params != null) {
params.setColorMap(colorMap);
}
}
}
}
@Subscribe @Subscribe
public void dataArrived(ColorMapDataEvent event) { public void dataArrived(ColorMapDataEvent event) {
ColorMapDataCallback callback = dataManager.getRenderableObject( ColorMapDataCallback callback = dataManager.getRenderableObject(

View file

@ -64,7 +64,7 @@ public class OffscreenRenderingHandler extends CollaborationRenderingHandler {
if (event.getColorMapParamters() != null) { if (event.getColorMapParamters() != null) {
offscreenImage = ext.constructOffscreenImage(bufferType, offscreenImage = ext.constructOffscreenImage(bufferType,
dims, event.getColorMapParamters() dims, event.getColorMapParamters()
.asColorMapParameters()); .getColorMapParameters());
} else { } else {
offscreenImage = ext.constructOffscreenImage(bufferType, offscreenImage = ext.constructOffscreenImage(bufferType,
dims); dims);

View file

@ -28,9 +28,8 @@ import com.raytheon.uf.viz.remote.graphics.events.wireframe.AllocatePointsEvent;
import com.raytheon.uf.viz.remote.graphics.events.wireframe.CreateWireframeShapeEvent; import com.raytheon.uf.viz.remote.graphics.events.wireframe.CreateWireframeShapeEvent;
import com.raytheon.uf.viz.remote.graphics.events.wireframe.RenderWireframeShapeEvent; import com.raytheon.uf.viz.remote.graphics.events.wireframe.RenderWireframeShapeEvent;
import com.raytheon.uf.viz.remote.graphics.events.wireframe.SimpleWireframeShapeEvent; import com.raytheon.uf.viz.remote.graphics.events.wireframe.SimpleWireframeShapeEvent;
import com.raytheon.uf.viz.remote.graphics.events.wireframe.UpdateWireframeShapeEvent; import com.raytheon.uf.viz.remote.graphics.events.wireframe.WireframeShapeDataEvent;
import com.raytheon.uf.viz.remote.graphics.events.wireframe.WireframeShapeData; import com.raytheon.uf.viz.remote.graphics.events.wireframe.WireframeShapeDataEvent.Label;
import com.raytheon.uf.viz.remote.graphics.events.wireframe.WireframeShapeData.Label;
/** /**
* Handles render events for wireframe shapes * Handles render events for wireframe shapes
@ -86,15 +85,15 @@ public class WireframeShapeRenderingHandler extends
} }
@Subscribe @Subscribe
public void updateWireframeShapeData(UpdateWireframeShapeEvent event) { public void wireframeShapeDataArrived(WireframeShapeDataEvent event) {
IWireframeShape shape = dataManager.getRenderableObject( IWireframeShape shape = dataManager.getRenderableObject(
event.getObjectId(), IWireframeShape.class); event.getObjectId(), IWireframeShape.class);
if (shape != null) { if (shape != null) {
WireframeShapeData data = event.getWireframeData(); shape.reset();
for (Label label : data.getLabels()) { for (Label label : event.getLabels()) {
shape.addLabel(label.getText(), label.getPoint()); shape.addLabel(label.getText(), label.getPoint());
} }
for (double[][] coords : data.getCoordinates()) { for (double[][] coords : event.getCoordinates()) {
shape.addLineSegment(coords); shape.addLineSegment(coords);
} }
} }

View file

@ -121,6 +121,7 @@ public class GLMosaicImage extends GLDelegateImage<GLColormappedImage>
@Override @Override
public void setImageExtent(IExtent imageExtent) { public void setImageExtent(IExtent imageExtent) {
this.extent = imageExtent; this.extent = imageExtent;
repaint = true;
} }
public IExtent getImageExtent() { public IExtent getImageExtent() {

View file

@ -489,7 +489,7 @@ public class DispatchGraphicsTarget extends DispatchingObject<IGraphicsTarget>
private void sendDrawWireframeShapeEvent(DispatchingWireframeShape shape, private void sendDrawWireframeShapeEvent(DispatchingWireframeShape shape,
RGB color, float lineWidth, LineStyle lineStyle, IFont font, RGB color, float lineWidth, LineStyle lineStyle, IFont font,
Float alpha) { Float alpha) {
shape.updateState(); shape.flushState();
RenderWireframeShapeEvent event = RemoteGraphicsEventFactory RenderWireframeShapeEvent event = RemoteGraphicsEventFactory
.createEvent(RenderWireframeShapeEvent.class, shape); .createEvent(RenderWireframeShapeEvent.class, shape);
event.setColor(color); event.setColor(color);

View file

@ -19,6 +19,7 @@
**/ **/
package com.raytheon.uf.viz.remote.graphics; package com.raytheon.uf.viz.remote.graphics;
/** /**
* TODO Add Description * TODO Add Description
* *

View file

@ -69,4 +69,23 @@ public abstract class AbstractDispatchingObjectEvent extends
this.objectId = objectId; this.objectId = objectId;
} }
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
AbstractDispatchingObjectEvent other = (AbstractDispatchingObjectEvent) obj;
if (objectId != other.objectId)
return false;
return true;
}
} }

View file

@ -19,25 +19,18 @@
**/ **/
package com.raytheon.uf.viz.remote.graphics.events.colormap; package com.raytheon.uf.viz.remote.graphics.events.colormap;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.nio.ShortBuffer;
import com.raytheon.uf.common.serialization.IDeserializationContext;
import com.raytheon.uf.common.serialization.ISerializationContext;
import com.raytheon.uf.common.serialization.ISerializationTypeAdapter;
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.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeTypeAdapter; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback.ColorMapData; import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback.ColorMapData;
import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback.ColorMapDataType; import com.raytheon.uf.viz.remote.graphics.Activator;
import com.raytheon.uf.viz.remote.graphics.events.AbstractDispatchingObjectEvent; import com.raytheon.uf.viz.remote.graphics.events.AbstractDispatchingObjectEvent;
import com.raytheon.uf.viz.remote.graphics.events.colormap.ColorMapDataEvent.ColorMapDataEventAdapter;
/** /**
* TODO Add Description * Event for sending ColorMapData, serializes object immediately to avoid
* concurrency issues with other threads using the buffer async
* *
* <pre> * <pre>
* *
@ -53,117 +46,41 @@ import com.raytheon.uf.viz.remote.graphics.events.colormap.ColorMapDataEvent.Col
* @version 1.0 * @version 1.0
*/ */
@DynamicSerialize @DynamicSerialize
@DynamicSerializeTypeAdapter(factory = ColorMapDataEventAdapter.class)
public class ColorMapDataEvent extends AbstractDispatchingObjectEvent { public class ColorMapDataEvent extends AbstractDispatchingObjectEvent {
public static class ColorMapDataEventAdapter implements @DynamicSerializeElement
ISerializationTypeAdapter<ColorMapDataEvent> { private byte[] serializedColorMapData;
/* /**
* (non-Javadoc) * @return the serializedColorMapData
* */
* @see public byte[] getSerializedColorMapData() {
* com.raytheon.uf.common.serialization.ISerializationTypeAdapter#serialize return serializedColorMapData;
* (com.raytheon.uf.common.serialization.ISerializationContext,
* java.lang.Object)
*/
@Override
public void serialize(ISerializationContext serializer,
ColorMapDataEvent object) throws SerializationException {
serializer.writeI32(object.getDisplayId());
serializer.writeI32(object.getObjectId());
ColorMapData colorMapData = object.getColorMapData();
serializer.writeString(colorMapData.getDataType().name());
int[] dimensions = colorMapData.getDimensions();
serializer.writeI32(dimensions[0]);
serializer.writeI32(dimensions[1]);
Buffer buffer = colorMapData.getBuffer();
serializer.writeBool(buffer.isDirect());
buffer.position(0);
ByteBuffer bb = null;
byte[] bytes = null;
switch (colorMapData.getDataType()) {
case BYTE:
case SIGNED_BYTE:
bytes = new byte[buffer.capacity()];
bb = ByteBuffer.wrap(bytes);
bb.put((ByteBuffer) buffer);
break;
case SHORT:
case UNSIGNED_SHORT:
bytes = new byte[2 * buffer.capacity()];
bb = ByteBuffer.wrap(bytes);
bb.asShortBuffer().put((ShortBuffer) buffer);
break;
case FLOAT:
bytes = new byte[4 * buffer.capacity()];
bb = ByteBuffer.wrap(bytes);
bb.asFloatBuffer().put((FloatBuffer) buffer);
break;
case INT:
bytes = new byte[4 * buffer.capacity()];
bb = ByteBuffer.wrap(bytes);
bb.asIntBuffer().put((IntBuffer) buffer);
break;
}
serializer.writeBinary(bb.array());
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.common.serialization.ISerializationTypeAdapter#
* deserialize
* (com.raytheon.uf.common.serialization.IDeserializationContext)
*/
@Override
public ColorMapDataEvent deserialize(
IDeserializationContext deserializer)
throws SerializationException {
ColorMapDataEvent event = new ColorMapDataEvent();
event.setDisplayId(deserializer.readI32());
event.setObjectId(deserializer.readI32());
ColorMapDataType dataType = ColorMapDataType.valueOf(deserializer
.readString());
int[] dimensions = new int[] { deserializer.readI32(),
deserializer.readI32() };
boolean direct = deserializer.readBool();
byte[] bytes = deserializer.readBinary();
ByteBuffer buffer = direct ? ByteBuffer
.allocateDirect(bytes.length) : ByteBuffer
.allocate(bytes.length);
buffer.put(bytes);
buffer.rewind();
Buffer dataBuffer = null;
switch (dataType) {
case BYTE:
case SIGNED_BYTE:
dataBuffer = buffer;
break;
case SHORT:
case UNSIGNED_SHORT:
dataBuffer = buffer.asShortBuffer();
break;
case INT:
dataBuffer = buffer.asIntBuffer();
break;
case FLOAT:
dataBuffer = buffer.asFloatBuffer();
break;
}
event.setColorMapData(new ColorMapData(dataBuffer, dimensions,
dataType));
return event;
}
} }
private ColorMapData colorMapData; /**
* @param serializedColorMapData
* the serializedColorMapData to set
*/
public void setSerializedColorMapData(byte[] serializedColorMapData) {
this.serializedColorMapData = serializedColorMapData;
}
/** /**
* @return the colorMapData * @return the colorMapData
*/ */
public ColorMapData getColorMapData() { public ColorMapData getColorMapData() {
return colorMapData; if (serializedColorMapData != null) {
try {
ColorMapDataWrapper wrapper = (ColorMapDataWrapper) SerializationUtil
.transformFromThrift(serializedColorMapData);
return wrapper.getColorMapData();
} catch (SerializationException e) {
Activator.statusHandler.handle(Priority.PROBLEM,
e.getLocalizedMessage(), e);
}
}
return null;
} }
/** /**
@ -171,7 +88,15 @@ public class ColorMapDataEvent extends AbstractDispatchingObjectEvent {
* the colorMapData to set * the colorMapData to set
*/ */
public void setColorMapData(ColorMapData colorMapData) { public void setColorMapData(ColorMapData colorMapData) {
this.colorMapData = colorMapData; ColorMapDataWrapper wrapper = new ColorMapDataWrapper();
wrapper.setColorMapData(colorMapData);
try {
serializedColorMapData = SerializationUtil
.transformToThrift(wrapper);
} catch (SerializationException e) {
Activator.statusHandler.handle(Priority.PROBLEM,
e.getLocalizedMessage(), e);
}
} }
} }

View file

@ -0,0 +1,172 @@
/**
* 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.remote.graphics.events.colormap;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.nio.ShortBuffer;
import com.raytheon.uf.common.serialization.IDeserializationContext;
import com.raytheon.uf.common.serialization.ISerializationContext;
import com.raytheon.uf.common.serialization.ISerializationTypeAdapter;
import com.raytheon.uf.common.serialization.SerializationException;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeTypeAdapter;
import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback.ColorMapData;
import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback.ColorMapDataType;
import com.raytheon.uf.viz.remote.graphics.events.colormap.ColorMapDataWrapper.ColorMapDataWrapperAdapter;
/**
* Object that wraps ColorMapData
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 25, 2012 mschenke Initial creation
*
* </pre>
*
* @author mschenke
* @version 1.0
*/
@DynamicSerialize
@DynamicSerializeTypeAdapter(factory = ColorMapDataWrapperAdapter.class)
public class ColorMapDataWrapper {
public static class ColorMapDataWrapperAdapter implements
ISerializationTypeAdapter<ColorMapDataWrapper> {
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.common.serialization.ISerializationTypeAdapter#serialize
* (com.raytheon.uf.common.serialization.ISerializationContext,
* java.lang.Object)
*/
@Override
public void serialize(ISerializationContext serializer,
ColorMapDataWrapper object) throws SerializationException {
ColorMapData colorMapData = object.getColorMapData();
serializer.writeString(colorMapData.getDataType().name());
int[] dimensions = colorMapData.getDimensions();
serializer.writeI32(dimensions[0]);
serializer.writeI32(dimensions[1]);
Buffer buffer = colorMapData.getBuffer();
serializer.writeBool(buffer.isDirect());
buffer.position(0);
ByteBuffer bb = null;
byte[] bytes = null;
switch (colorMapData.getDataType()) {
case BYTE:
case SIGNED_BYTE:
bytes = new byte[buffer.capacity()];
bb = ByteBuffer.wrap(bytes);
bb.put((ByteBuffer) buffer);
break;
case SHORT:
case UNSIGNED_SHORT:
bytes = new byte[2 * buffer.capacity()];
bb = ByteBuffer.wrap(bytes);
bb.asShortBuffer().put((ShortBuffer) buffer);
break;
case FLOAT:
bytes = new byte[4 * buffer.capacity()];
bb = ByteBuffer.wrap(bytes);
bb.asFloatBuffer().put((FloatBuffer) buffer);
break;
case INT:
bytes = new byte[4 * buffer.capacity()];
bb = ByteBuffer.wrap(bytes);
bb.asIntBuffer().put((IntBuffer) buffer);
break;
}
serializer.writeBinary(bb.array());
}
/*
* (non-Javadoc)
*
* @see com.raytheon.uf.common.serialization.ISerializationTypeAdapter#
* deserialize
* (com.raytheon.uf.common.serialization.IDeserializationContext)
*/
@Override
public ColorMapDataWrapper deserialize(
IDeserializationContext deserializer)
throws SerializationException {
ColorMapDataWrapper wrapper = new ColorMapDataWrapper();
ColorMapDataType dataType = ColorMapDataType.valueOf(deserializer
.readString());
int[] dimensions = new int[] { deserializer.readI32(),
deserializer.readI32() };
boolean direct = deserializer.readBool();
byte[] bytes = deserializer.readBinary();
ByteBuffer buffer = direct ? ByteBuffer
.allocateDirect(bytes.length) : ByteBuffer
.allocate(bytes.length);
buffer.put(bytes);
buffer.rewind();
Buffer dataBuffer = null;
switch (dataType) {
case BYTE:
case SIGNED_BYTE:
dataBuffer = buffer;
break;
case SHORT:
case UNSIGNED_SHORT:
dataBuffer = buffer.asShortBuffer();
break;
case INT:
dataBuffer = buffer.asIntBuffer();
break;
case FLOAT:
dataBuffer = buffer.asFloatBuffer();
break;
}
wrapper.setColorMapData(new ColorMapData(dataBuffer, dimensions,
dataType));
return wrapper;
}
}
private ColorMapData colorMapData;
/**
* @return the colorMapData
*/
public ColorMapData getColorMapData() {
return colorMapData;
}
/**
* @param colorMapData
* the colorMapData to set
*/
public void setColorMapData(ColorMapData colorMapData) {
this.colorMapData = colorMapData;
}
}

View file

@ -47,6 +47,9 @@ public class CreateColormappedImageEvent extends AbstractDispatchingObjectEvent
@DynamicSerializeElement @DynamicSerializeElement
private UpdateColorMapParametersEvent colorMapParameters; private UpdateColorMapParametersEvent colorMapParameters;
@DynamicSerializeElement
private UpdateColorMapEvent colorMap;
/** /**
* @return the colorMapParameters * @return the colorMapParameters
*/ */
@ -63,4 +66,19 @@ public class CreateColormappedImageEvent extends AbstractDispatchingObjectEvent
this.colorMapParameters = colorMapParameters; this.colorMapParameters = colorMapParameters;
} }
/**
* @return the colorMap
*/
public UpdateColorMapEvent getColorMap() {
return colorMap;
}
/**
* @param colorMap
* the colorMap to set
*/
public void setColorMap(UpdateColorMapEvent colorMap) {
this.colorMap = colorMap;
}
} }

View file

@ -0,0 +1,149 @@
/**
* 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.remote.graphics.events.colormap;
import com.raytheon.uf.common.colormap.ColorMap;
import com.raytheon.uf.common.colormap.IColorMap;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
import com.raytheon.uf.viz.remote.graphics.events.AbstractDispatchingObjectEvent;
import com.raytheon.uf.viz.remote.graphics.events.RemoteGraphicsEventFactory;
import com.raytheon.uf.viz.remote.graphics.objects.AbstractDispatchingImage;
/**
* Event for updating the IColorMap on an IColormappedImage
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Apr 25, 2012 mschenke Initial creation
*
* </pre>
*
* @author mschenke
* @version 1.0
*/
@DynamicSerialize
public class UpdateColorMapEvent extends AbstractDispatchingObjectEvent {
@DynamicSerializeElement
private float[] red;
@DynamicSerializeElement
private float[] blue;
@DynamicSerializeElement
private float[] green;
@DynamicSerializeElement
private float[] alpha;
/**
* @return the red
*/
public float[] getRed() {
return red;
}
/**
* @param red
* the red to set
*/
public void setRed(float[] red) {
this.red = red;
}
/**
* @return the blue
*/
public float[] getBlue() {
return blue;
}
/**
* @param blue
* the blue to set
*/
public void setBlue(float[] blue) {
this.blue = blue;
}
/**
* @return the green
*/
public float[] getGreen() {
return green;
}
/**
* @param green
* the green to set
*/
public void setGreen(float[] green) {
this.green = green;
}
/**
* @return the alpha
*/
public float[] getAlpha() {
return alpha;
}
/**
* @param alpha
* the alpha to set
*/
public void setAlpha(float[] alpha) {
this.alpha = alpha;
}
public IColorMap getColorMap() {
if (red != null && green != null && blue != null && alpha != null) {
return new ColorMap("" + getObjectId(), red, green, blue, alpha);
}
return null;
}
public void setColorMap(IColorMap colorMap) {
if (colorMap != null) {
red = colorMap.getRed();
green = colorMap.getGreen();
blue = colorMap.getBlue();
alpha = colorMap.getAlpha();
}
}
/**
* @param wrapper
* @param parameters
* @return
*/
public static UpdateColorMapEvent createEvent(
AbstractDispatchingImage<?> wrapper, IColorMap colorMap) {
UpdateColorMapEvent event = RemoteGraphicsEventFactory.createEvent(
UpdateColorMapEvent.class, wrapper);
event.setColorMap(colorMap);
return event;
}
}

View file

@ -19,17 +19,15 @@
**/ **/
package com.raytheon.uf.viz.remote.graphics.events.colormap; package com.raytheon.uf.viz.remote.graphics.events.colormap;
import com.raytheon.uf.common.colormap.ColorMap;
import com.raytheon.uf.common.colormap.IColorMap;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
import com.raytheon.uf.viz.core.drawables.ColorMapParameters; import com.raytheon.uf.viz.core.drawables.ColorMapParameters;
import com.raytheon.uf.viz.remote.graphics.DispatchingObject;
import com.raytheon.uf.viz.remote.graphics.events.AbstractDispatchingObjectEvent; import com.raytheon.uf.viz.remote.graphics.events.AbstractDispatchingObjectEvent;
import com.raytheon.uf.viz.remote.graphics.events.RemoteGraphicsEventFactory; import com.raytheon.uf.viz.remote.graphics.events.RemoteGraphicsEventFactory;
import com.raytheon.uf.viz.remote.graphics.objects.AbstractDispatchingImage;
/** /**
* TODO Add Description * Event for updating the ColorMapParameters on an IColormappedImage
* *
* <pre> * <pre>
* *
@ -51,18 +49,6 @@ public class UpdateColorMapParametersEvent extends
@DynamicSerializeElement @DynamicSerializeElement
private byte[] alphaMask; private byte[] alphaMask;
@DynamicSerializeElement
private float[] red;
@DynamicSerializeElement
private float[] blue;
@DynamicSerializeElement
private float[] green;
@DynamicSerializeElement
private float[] alpha;
@DynamicSerializeElement @DynamicSerializeElement
private float colorMapMax; private float colorMapMax;
@ -102,66 +88,6 @@ public class UpdateColorMapParametersEvent extends
this.alphaMask = alphaMask; this.alphaMask = alphaMask;
} }
/**
* @return the red
*/
public float[] getRed() {
return red;
}
/**
* @param red
* the red to set
*/
public void setRed(float[] red) {
this.red = red;
}
/**
* @return the blue
*/
public float[] getBlue() {
return blue;
}
/**
* @param blue
* the blue to set
*/
public void setBlue(float[] blue) {
this.blue = blue;
}
/**
* @return the green
*/
public float[] getGreen() {
return green;
}
/**
* @param green
* the green to set
*/
public void setGreen(float[] green) {
this.green = green;
}
/**
* @return the alpha
*/
public float[] getAlpha() {
return alpha;
}
/**
* @param alpha
* the alpha to set
*/
public void setAlpha(float[] alpha) {
this.alpha = alpha;
}
/** /**
* @return the colorMapMax * @return the colorMapMax
*/ */
@ -282,12 +208,31 @@ public class UpdateColorMapParametersEvent extends
this.useMask = useMask; this.useMask = useMask;
} }
/**
* Set the ColorMapParameters for the event
*
* @param parameters
*/
public void setColorMapParameters(ColorMapParameters parameters) {
if (parameters != null) {
setAlphaMask(parameters.getAlphaMask());
setColorMapMin(parameters.getColorMapMin());
setColorMapMax(parameters.getColorMapMax());
setDataMin(parameters.getDataMin());
setDataMax(parameters.getDataMax());
setLogarithmic(parameters.isLogarithmic());
setLogFactor(parameters.getLogFactor());
setMirror(parameters.isMirror());
setUseMask(parameters.isUseMask());
}
}
/** /**
* Get the update colormap parameters event as ColorMapParameters object * Get the update colormap parameters event as ColorMapParameters object
* *
* @return * @return
*/ */
public ColorMapParameters asColorMapParameters() { public ColorMapParameters getColorMapParameters() {
ColorMapParameters params = new ColorMapParameters(); ColorMapParameters params = new ColorMapParameters();
params.setAlphaMask(getAlphaMask()); params.setAlphaMask(getAlphaMask());
params.setColorMapMin(getColorMapMin()); params.setColorMapMin(getColorMapMin());
@ -298,33 +243,19 @@ public class UpdateColorMapParametersEvent extends
params.setLogFactor(getLogFactor()); params.setLogFactor(getLogFactor());
params.setMirror(isMirror()); params.setMirror(isMirror());
params.setUseMask(isUseMask()); params.setUseMask(isUseMask());
if (red != null && green != null && blue != null && alpha != null) {
params.setColorMap(new ColorMap("" + getObjectId(), red, green,
blue, alpha));
}
return params; return params;
} }
/**
* @param wrapper
* @param parameters
* @return
*/
public static UpdateColorMapParametersEvent createEvent( public static UpdateColorMapParametersEvent createEvent(
DispatchingObject<?> creator, ColorMapParameters parameters) { AbstractDispatchingImage<?> wrapper, ColorMapParameters parameters) {
UpdateColorMapParametersEvent event = RemoteGraphicsEventFactory UpdateColorMapParametersEvent event = RemoteGraphicsEventFactory
.createEvent(UpdateColorMapParametersEvent.class, creator); .createEvent(UpdateColorMapParametersEvent.class, wrapper);
event.setAlphaMask(parameters.getAlphaMask()); event.setColorMapParameters(parameters);
IColorMap cmap = parameters.getColorMap();
if (cmap != null) {
event.setRed(cmap.getRed());
event.setBlue(cmap.getBlue());
event.setGreen(cmap.getGreen());
event.setAlpha(cmap.getAlpha());
}
event.setColorMapMin(parameters.getColorMapMin());
event.setColorMapMax(parameters.getColorMapMax());
event.setDataMin(parameters.getDataMin());
event.setDataMax(parameters.getDataMax());
event.setLogarithmic(parameters.isLogarithmic());
event.setLogFactor(parameters.getLogFactor());
event.setMirror(parameters.isMirror());
event.setUseMask(parameters.isUseMask());
return event; return event;
} }

View file

@ -152,6 +152,8 @@ public class PaintImageEvent extends AbstractDispatchingObjectEvent implements
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) if (this == obj)
return true; return true;
if (!super.equals(obj))
return false;
if (obj == null) if (obj == null)
return false; return false;
if (getClass() != obj.getClass()) if (getClass() != obj.getClass())

View file

@ -97,7 +97,7 @@ public class RenderOffscreenEvent extends AbstractDispatchingObjectEvent
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) if (this == obj)
return true; return true;
if (obj == null) if (!super.equals(obj))
return false; return false;
if (getClass() != obj.getClass()) if (getClass() != obj.getClass())
return false; return false;

View file

@ -198,6 +198,8 @@ public class RenderWireframeShapeEvent extends AbstractDispatchingObjectEvent
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) if (this == obj)
return true; return true;
if (!super.equals(obj))
return false;
if (obj == null) if (obj == null)
return false; return false;
if (getClass() != obj.getClass()) if (getClass() != obj.getClass())

View file

@ -1,63 +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.remote.graphics.events.wireframe;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
import com.raytheon.uf.viz.remote.graphics.events.AbstractDispatchingObjectEvent;
/**
* TODO Add Description
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Mar 29, 2012 mschenke Initial creation
*
* </pre>
*
* @author mschenke
* @version 1.0
*/
@DynamicSerialize
public class UpdateWireframeShapeEvent extends AbstractDispatchingObjectEvent {
@DynamicSerializeElement
private WireframeShapeData wireframeData;
/**
* @return the wireframeData
*/
public WireframeShapeData getWireframeData() {
return wireframeData;
}
/**
* @param wireframeData
* the wireframeData to set
*/
public void setWireframeData(WireframeShapeData wireframeData) {
this.wireframeData = wireframeData;
}
}

View file

@ -29,7 +29,8 @@ import com.raytheon.uf.common.serialization.SerializationException;
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeTypeAdapter; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeTypeAdapter;
import com.raytheon.uf.viz.remote.graphics.events.wireframe.WireframeShapeData.WireframeShapeDataAdapter; import com.raytheon.uf.viz.remote.graphics.events.AbstractDispatchingObjectEvent;
import com.raytheon.uf.viz.remote.graphics.events.wireframe.WireframeShapeDataEvent.WireframeShapeDataAdapter;
/** /**
* Wireframe shape data event which contains coordinates and labels to add to * Wireframe shape data event which contains coordinates and labels to add to
@ -50,10 +51,10 @@ import com.raytheon.uf.viz.remote.graphics.events.wireframe.WireframeShapeData.W
*/ */
@DynamicSerialize @DynamicSerialize
@DynamicSerializeTypeAdapter(factory = WireframeShapeDataAdapter.class) @DynamicSerializeTypeAdapter(factory = WireframeShapeDataAdapter.class)
public class WireframeShapeData { public class WireframeShapeDataEvent extends AbstractDispatchingObjectEvent {
public static class WireframeShapeDataAdapter implements public static class WireframeShapeDataAdapter implements
ISerializationTypeAdapter<WireframeShapeData> { ISerializationTypeAdapter<WireframeShapeDataEvent> {
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
@ -64,7 +65,9 @@ public class WireframeShapeData {
*/ */
@Override @Override
public void serialize(ISerializationContext serializer, public void serialize(ISerializationContext serializer,
WireframeShapeData object) throws SerializationException { WireframeShapeDataEvent object) throws SerializationException {
serializer.writeI32(object.getDisplayId());
serializer.writeI32(object.getObjectId());
serializer.writeI32(object.labels.size()); serializer.writeI32(object.labels.size());
for (Label l : object.labels) { for (Label l : object.labels) {
serializer.writeString(l.getText()); serializer.writeString(l.getText());
@ -87,10 +90,12 @@ public class WireframeShapeData {
* (com.raytheon.uf.common.serialization.IDeserializationContext) * (com.raytheon.uf.common.serialization.IDeserializationContext)
*/ */
@Override @Override
public WireframeShapeData deserialize( public WireframeShapeDataEvent deserialize(
IDeserializationContext deserializer) IDeserializationContext deserializer)
throws SerializationException { throws SerializationException {
WireframeShapeData data = new WireframeShapeData(); WireframeShapeDataEvent data = new WireframeShapeDataEvent();
data.setDisplayId(deserializer.readI32());
data.setObjectId(deserializer.readI32());
int size = deserializer.readI32(); int size = deserializer.readI32();
for (int i = 0; i < size; ++i) { for (int i = 0; i < size; ++i) {
data.addLabel(deserializer.readString(), data.addLabel(deserializer.readString(),

View file

@ -27,10 +27,13 @@ import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.remote.graphics.events.RemoteGraphicsEventFactory; import com.raytheon.uf.viz.remote.graphics.events.RemoteGraphicsEventFactory;
import com.raytheon.uf.viz.remote.graphics.events.colormap.ColorMapDataEvent; import com.raytheon.uf.viz.remote.graphics.events.colormap.ColorMapDataEvent;
import com.raytheon.uf.viz.remote.graphics.events.colormap.CreateColormappedImageEvent; import com.raytheon.uf.viz.remote.graphics.events.colormap.CreateColormappedImageEvent;
import com.raytheon.uf.viz.remote.graphics.events.colormap.UpdateColorMapEvent;
import com.raytheon.uf.viz.remote.graphics.events.colormap.UpdateColorMapParametersEvent;
import com.raytheon.uf.viz.remote.graphics.objects.DispatchingColormappedImage; import com.raytheon.uf.viz.remote.graphics.objects.DispatchingColormappedImage;
/** /**
* TODO Add Description * IColormappedImageExtension that is responsible for creating and dispatching
* events for IColormappedImages
* *
* <pre> * <pre>
* *
@ -113,13 +116,14 @@ public class DispatchColormappedImageExtension extends
CreateColormappedImageEvent creation = RemoteGraphicsEventFactory CreateColormappedImageEvent creation = RemoteGraphicsEventFactory
.createEvent(CreateColormappedImageEvent.class, image); .createEvent(CreateColormappedImageEvent.class, image);
if (colorMapParameters != null) { if (colorMapParameters != null) {
creation.setColorMapParameters(DispatchingColormappedImage creation.setColorMapParameters(UpdateColorMapParametersEvent
.createColorMapParametersUpdateEvent(image)); .createEvent(image, colorMapParameters));
creation.setColorMap(UpdateColorMapEvent.createEvent(image,
colorMapParameters.getColorMap()));
} }
target.dispatch(creation); target.dispatch(creation);
// Return image // Return image
return image; return image;
} }
} }

View file

@ -25,6 +25,7 @@ import com.raytheon.uf.viz.core.drawables.IColorMapParametersListener;
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.ext.IImagingExtension;
import com.raytheon.uf.viz.remote.graphics.Dispatcher; import com.raytheon.uf.viz.remote.graphics.Dispatcher;
import com.raytheon.uf.viz.remote.graphics.events.colormap.UpdateColorMapEvent;
import com.raytheon.uf.viz.remote.graphics.events.colormap.UpdateColorMapParametersEvent; import com.raytheon.uf.viz.remote.graphics.events.colormap.UpdateColorMapParametersEvent;
/** /**
@ -94,7 +95,7 @@ public class DispatchingColormappedImage<T extends IColormappedImage> extends
wrappedObject.setColorMapParameters(params); wrappedObject.setColorMapParameters(params);
if (params != null) { if (params != null) {
params.addListener(this); params.addListener(this);
dispatch(createColorMapParametersUpdateEvent(this)); updateColorMapParameters();
} }
} }
} }
@ -120,26 +121,17 @@ public class DispatchingColormappedImage<T extends IColormappedImage> extends
public void colorMapChanged() { public void colorMapChanged() {
ColorMapParameters parameters = getColorMapParameters(); ColorMapParameters parameters = getColorMapParameters();
if (parameters != null) { if (parameters != null) {
dispatch(createColorMapParametersUpdateEvent(this)); updateColorMapParameters();
} }
} }
public static UpdateColorMapParametersEvent createColorMapParametersUpdateEvent( public void updateColorMapParameters() {
DispatchingColormappedImage<?> image) { ColorMapParameters parameters = getColorMapParameters();
ColorMapParameters parameters = image.getColorMapParameters(); dispatch(UpdateColorMapParametersEvent.createEvent(this, parameters));
UpdateColorMapParametersEvent event = UpdateColorMapParametersEvent if (parameters.getColorMap() != colorMap) {
.createEvent(image, parameters); colorMap = parameters.getColorMap();
if (parameters.getColorMap() == image.colorMap dispatch(UpdateColorMapEvent.createEvent(this, colorMap));
&& image.colorMap != null) {
// Same colormap, discard cm data
event.setRed(null);
event.setBlue(null);
event.setGreen(null);
event.setAlpha(null);
} else {
image.colorMap = parameters.getColorMap();
} }
return event;
} }
/* /*

View file

@ -19,6 +19,8 @@
**/ **/
package com.raytheon.uf.viz.remote.graphics.objects; package com.raytheon.uf.viz.remote.graphics.objects;
import java.util.ArrayList;
import org.geotools.coverage.grid.GeneralGridGeometry; import org.geotools.coverage.grid.GeneralGridGeometry;
import org.geotools.referencing.operation.DefaultMathTransformFactory; import org.geotools.referencing.operation.DefaultMathTransformFactory;
import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.MathTransform;
@ -35,8 +37,8 @@ import com.raytheon.uf.viz.remote.graphics.events.RemoteGraphicsEventFactory;
import com.raytheon.uf.viz.remote.graphics.events.wireframe.AllocatePointsEvent; import com.raytheon.uf.viz.remote.graphics.events.wireframe.AllocatePointsEvent;
import com.raytheon.uf.viz.remote.graphics.events.wireframe.SimpleWireframeShapeEvent; import com.raytheon.uf.viz.remote.graphics.events.wireframe.SimpleWireframeShapeEvent;
import com.raytheon.uf.viz.remote.graphics.events.wireframe.SimpleWireframeShapeEvent.EventAction; import com.raytheon.uf.viz.remote.graphics.events.wireframe.SimpleWireframeShapeEvent.EventAction;
import com.raytheon.uf.viz.remote.graphics.events.wireframe.UpdateWireframeShapeEvent; import com.raytheon.uf.viz.remote.graphics.events.wireframe.WireframeShapeDataEvent;
import com.raytheon.uf.viz.remote.graphics.events.wireframe.WireframeShapeData; import com.raytheon.uf.viz.remote.graphics.events.wireframe.WireframeShapeDataEvent.Label;
import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Coordinate;
/** /**
@ -62,7 +64,7 @@ public class DispatchingWireframeShape extends
private MathTransform worldToTargetGrid; private MathTransform worldToTargetGrid;
private WireframeShapeData shapeData; private WireframeShapeDataEvent updateEvent;
private boolean dirty = true; private boolean dirty = true;
@ -73,7 +75,7 @@ public class DispatchingWireframeShape extends
public DispatchingWireframeShape(IWireframeShape targetObject, public DispatchingWireframeShape(IWireframeShape targetObject,
Dispatcher dispatcher, GeneralGridGeometry targetGeometry) { Dispatcher dispatcher, GeneralGridGeometry targetGeometry) {
super(targetObject, dispatcher); super(targetObject, dispatcher);
this.shapeData = new WireframeShapeData(); this.updateEvent = createNewUpdateEvent();
MathTransform worldToCRS = AbstractDescriptor MathTransform worldToCRS = AbstractDescriptor
.getWorldToCRSTransform(targetGeometry); .getWorldToCRSTransform(targetGeometry);
if (worldToCRS != null) { if (worldToCRS != null) {
@ -97,22 +99,31 @@ public class DispatchingWireframeShape extends
public void compile() { public void compile() {
wrappedObject.compile(); wrappedObject.compile();
// flush data // flush data
updateState(); flushState();
// Event if original shape was mutable, once compiled we should not
// accept more data
updateEvent = null;
// Send compile event // Send compile event
sendSimpleEvent(EventAction.COMPILE); sendSimpleEvent(EventAction.COMPILE);
} }
/** /**
* * Flush the new data for the wireframe shape
*/ */
public void updateState() { public void flushState() {
if (dirty) { if (dirty) {
if (shapeData != null) { if (updateEvent != null) {
UpdateWireframeShapeEvent event = RemoteGraphicsEventFactory WireframeShapeDataEvent toSend = updateEvent;
.createEvent(UpdateWireframeShapeEvent.class, this); if (wrappedObject.isMutable()) {
event.setWireframeData(shapeData); toSend = createNewUpdateEvent();
shapeData = new WireframeShapeData(); toSend.setCoordinates(new ArrayList<double[][]>(updateEvent
dispatch(event); .getCoordinates()));
toSend.setLabels(new ArrayList<Label>(updateEvent
.getLabels()));
} else {
updateEvent = null;
}
dispatch(toSend);
} }
dirty = false; dirty = false;
} }
@ -163,8 +174,8 @@ public class DispatchingWireframeShape extends
*/ */
public void addLineSegment(double[][] screenCoordinates) { public void addLineSegment(double[][] screenCoordinates) {
wrappedObject.addLineSegment(screenCoordinates); wrappedObject.addLineSegment(screenCoordinates);
if (shapeData != null) { if (updateEvent != null) {
shapeData.addCoordinates(screenCoordinates); updateEvent.addCoordinates(screenCoordinates);
dirty = true; dirty = true;
} }
} }
@ -185,8 +196,8 @@ public class DispatchingWireframeShape extends
*/ */
public void addLabel(String label, double[] screenCoordinate) { public void addLabel(String label, double[] screenCoordinate) {
wrappedObject.addLabel(label, screenCoordinate); wrappedObject.addLabel(label, screenCoordinate);
if (shapeData != null) { if (updateEvent != null) {
shapeData.addLabel(label, screenCoordinate); updateEvent.addLabel(label, screenCoordinate);
dirty = true; dirty = true;
} }
} }
@ -200,7 +211,7 @@ public class DispatchingWireframeShape extends
// Send dispose event // Send dispose event
dispatch(RemoteGraphicsEventFactory.createEvent( dispatch(RemoteGraphicsEventFactory.createEvent(
DisposeObjectEvent.class, this)); DisposeObjectEvent.class, this));
shapeData = null; updateEvent = null;
} }
/** /**
@ -211,8 +222,8 @@ public class DispatchingWireframeShape extends
wrappedObject.clearLabels(); wrappedObject.clearLabels();
// Send clear labels event // Send clear labels event
sendSimpleEvent(EventAction.CLEAR_LABELS); sendSimpleEvent(EventAction.CLEAR_LABELS);
if (shapeData != null) { if (updateEvent != null) {
shapeData.getLabels().clear(); updateEvent.getLabels().clear();
} }
} }
@ -234,10 +245,15 @@ public class DispatchingWireframeShape extends
* @see com.raytheon.uf.viz.core.drawables.IShape#reset() * @see com.raytheon.uf.viz.core.drawables.IShape#reset()
*/ */
public void reset() { public void reset() {
// TODO: Reset will not currently work if shape was disposed
wrappedObject.reset(); wrappedObject.reset();
// Send reset event // Send reset event
sendSimpleEvent(EventAction.RESET); sendSimpleEvent(EventAction.RESET);
shapeData = new WireframeShapeData(); updateEvent = createNewUpdateEvent();
} }
private WireframeShapeDataEvent createNewUpdateEvent() {
return RemoteGraphicsEventFactory.createEvent(
WireframeShapeDataEvent.class, this);
}
} }