From d19010b1291224263d758a6fae4b32f557ecd0a7 Mon Sep 17 00:00:00 2001 From: Max Schenkelberg Date: Thu, 17 Oct 2013 12:59:23 -0500 Subject: [PATCH 01/12] Issue #2333 Merging gl refactor from GOES-R work. Preparing GL for data units in image. Change-Id: I6ec7c0808516cc1ce87e3325b54041366392d191 Former-commit-id: 676493c6e2b0580a6a9b63c7d987a6430a7a1c69 [formerly 676493c6e2b0580a6a9b63c7d987a6430a7a1c69 [formerly b4249acf8655c2c31e491cf945f2bb4fc00f7fad]] Former-commit-id: 004720f7a98207fe07ac440ea552c2e60823be8a Former-commit-id: 872652cab9985bff3e67a4562d06ffc1963b5912 --- .../core/tile/RecordTileSetRenderable.java | 74 ++++- .../uf/viz/core/tile/TileSetRenderable.java | 38 ++- .../GLTrueColorImagingExtension.java | 7 +- .../AbstractGLColorMapDataFormat.java | 20 +- .../gl/dataformat/GLBufferColorMapData.java | 102 ++++++ .../core/gl/dataformat/GLByteDataFormat.java | 3 +- .../core/gl/dataformat/GLColorMapData.java | 52 +--- .../core/gl/dataformat/GLFloatDataFormat.java | 8 +- .../gl/dataformat/GLHalfFloatDataFormat.java | 8 +- .../core/gl/dataformat/GLIntDataFormat.java | 8 +- .../core/gl/dataformat/GLShortDataFormat.java | 8 +- .../gl/dataformat/GLSignedByteDataFormat.java | 9 +- .../dataformat/GLUnsignedShortDataFormat.java | 9 +- .../IGLColorMapDataFormatProvider.java | 2 +- .../gl/ext/GLOffscreenRenderingExtension.java | 193 ++++++------ .../imaging/GLColormappedImageExtension.java | 33 +- .../gl/images/AbstractGLColormappedImage.java | 280 +++++++++++++++++ .../viz/core/gl/images/AbstractGLImage.java | 97 +++--- .../viz/core/gl/images/GLCMTextureData.java | 293 +++++++++--------- .../core/gl/images/GLColormappedImage.java | 212 +------------ .../raytheon/viz/core/gl/images/GLImage.java | 2 +- .../images/GLOffscreenColormappedImage.java | 69 +++++ .../gl/images/GLRetrievableCMTextureData.java | 291 +++++++++++++++++ .../gl/internal/cache/IImageCacheable.java | 4 +- .../core/gl/internal/cache/ImageCache.java | 2 +- .../gl/internal/ext/mosaic/GLMosaicImage.java | 8 +- .../ext/mosaic/GLMosaicImageExtension.java | 85 +++-- .../viz/satellite/rsc/SatResource.java | 4 +- .../common/colormap/image/ColorMapData.java | 36 ++- .../viz/cloudHeight/CloudHeightProcesser.java | 14 +- 30 files changed, 1335 insertions(+), 636 deletions(-) create mode 100644 cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLBufferColorMapData.java create mode 100644 cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/AbstractGLColormappedImage.java create mode 100644 cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLOffscreenColormappedImage.java create mode 100644 cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLRetrievableCMTextureData.java diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/tile/RecordTileSetRenderable.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/tile/RecordTileSetRenderable.java index ef3af6b4e2..498d757e7b 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/tile/RecordTileSetRenderable.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/tile/RecordTileSetRenderable.java @@ -27,12 +27,16 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.measure.unit.Unit; +import javax.measure.unit.UnitFormat; + import org.geotools.coverage.grid.GridEnvelope2D; import org.geotools.coverage.grid.GridGeometry2D; import org.geotools.geometry.Envelope2D; import org.opengis.coverage.grid.GridEnvelope; import com.raytheon.uf.common.colormap.image.ColorMapData; +import com.raytheon.uf.common.colormap.prefs.ColorMapParameters; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.datastorage.DataStoreFactory; import com.raytheon.uf.common.geospatial.ISpatialObject; @@ -55,6 +59,7 @@ import com.raytheon.uf.viz.core.map.IMapMeshExtension; import com.raytheon.uf.viz.core.rsc.AbstractVizResource; import com.raytheon.uf.viz.core.rsc.capabilities.ColorMapCapability; import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; +import com.vividsolutions.jts.geom.Coordinate; /** * {@link TileSetRenderable} for 2D {@link PluginDataObject}s. Groups adjacent @@ -68,7 +73,9 @@ import com.raytheon.uf.viz.core.rsc.capabilities.ImagingCapability; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Jun 19, 2013 2122 mschenke Initial creation. + * Jun 19, 2013 2122 mschenke Initial creation. + * Oct 16, 2013 2333 mschenke Added method for auto-unit conversion + * interrogating * * * @@ -199,7 +206,7 @@ public class RecordTileSetRenderable extends TileSetRenderable { BufferSlicer.slice(data.getBuffer(), tileRect, bigTileRect), new int[] { tileRect.width, tileRect.height }, - data.getDataType()); + data.getDataType(), data.getDataUnit()); callbacks.get(i).setRetrievedData(subData); try { @@ -353,6 +360,69 @@ public class RecordTileSetRenderable extends TileSetRenderable { tile.getRectangle()).getColorMapData(); } + @Override + public double interrogate(Coordinate coordinate) throws VizException { + ColorMapParameters parameters = colormapping.getColorMapParameters(); + return interrogate(coordinate, parameters.getNoDataValue()); + } + + /** + * Returns the raw image value from tile image that contains the lat/lon + * coordinate in units of desiredUnit + * + * @param coordinate + * in lat/lon space + * @param desiredUnit + * unit to convert data value to if not nanValue + * @return + * @throws VizException + */ + public double interrogate(Coordinate coordinate, Unit desiredUnit) + throws VizException { + ColorMapParameters parameters = colormapping.getColorMapParameters(); + return interrogate(coordinate, parameters.getNoDataValue(), desiredUnit); + } + + /** + * Returns the raw image value from tile image that contains the lat/lon + * coordinate in units of desiredUnit + * + * @param coordinate + * in lat/lon space + * @param nanValue + * if interrogated value is equal to nanValue, {@link Double#NaN} + * will be returned + * @param desiredUnit + * unit to convert data value to if not nanValue + * @return + * @throws VizException + */ + public double interrogate(Coordinate coordinate, double nanValue, + Unit desiredUnit) throws VizException { + double dataValue = super.interrogate(coordinate, nanValue); + if (Double.isNaN(dataValue) == false) { + ColorMapParameters params = colormapping.getColorMapParameters(); + Unit dataUnit = params.getDataUnit(); + if (dataUnit != null && desiredUnit != null + && dataUnit != desiredUnit) { + if (dataUnit.isCompatible(desiredUnit)) { + dataValue = dataUnit.getConverterTo(desiredUnit).convert( + dataValue); + } else { + throw new IllegalArgumentException( + "Unable to interrogate tile set. " + + String.format( + "Desired unit (%s) is not compatible with data unit (%s).", + UnitFormat.getUCUMInstance() + .format(desiredUnit), + UnitFormat.getUCUMInstance() + .format(dataUnit))); + } + } + } + return dataValue; + } + /** * @param target */ diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/tile/TileSetRenderable.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/tile/TileSetRenderable.java index 7fdaf7c2cf..61ecd61884 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/tile/TileSetRenderable.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/tile/TileSetRenderable.java @@ -62,11 +62,12 @@ import com.vividsolutions.jts.geom.Coordinate; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Aug 8, 2012 mschenke Initial creation - * May 28, 2013 2037 njensen Made imageMap concurrent to fix leak - * Jun 20, 2013 2122 mschenke Fixed null pointer in interrogate and made - * canceling jobs safer - * + * Aug 8, 2012 mschenke Initial creation + * May 28, 2013 2037 njensen Made imageMap concurrent to fix leak + * Jun 20, 2013 2122 mschenke Fixed null pointer in interrogate and made + * canceling jobs safer + * Oct 16, 2013 2333 mschenke Added auto NaN checking for interrogation + * * * * @author mschenke @@ -474,6 +475,24 @@ public class TileSetRenderable implements IRenderable { * @throws VizException */ public double interrogate(Coordinate coordinate) throws VizException { + return interrogate(coordinate, Double.NaN); + } + + /** + * Returns the raw image value from tile image that contains the lat/lon + * coordinate. Any values matching nanValue will return {@link Double#NaN} + * + * @param coordinate + * in lat/lon space + * @param nanValue + * if interrogated value is equal to nanValue, {@link Double#NaN} + * will be returned + * @return + * @throws VizException + */ + public double interrogate(Coordinate coordinate, double nanValue) + throws VizException { + double dataValue = Double.NaN; try { double[] local = new double[2]; llToLocalProj @@ -490,15 +509,20 @@ public class TileSetRenderable implements IRenderable { if (di != null) { IImage image = di.getImage(); if (image instanceof IColormappedImage) { - return ((IColormappedImage) image).getValue( + IColormappedImage cmapImage = (IColormappedImage) image; + dataValue = cmapImage.getValue( (int) grid[0] % tileSize, (int) grid[1] % tileSize); + if (dataValue == nanValue) { + dataValue = Double.NaN; + } + } } } } catch (TransformException e) { throw new VizException("Error interrogating ", e); } - return Double.NaN; + return dataValue; } } diff --git a/cave/com.raytheon.uf.viz.truecolor.gl/src/com/raytheon/uf/viz/truecolor/gl/extension/GLTrueColorImagingExtension.java b/cave/com.raytheon.uf.viz.truecolor.gl/src/com/raytheon/uf/viz/truecolor/gl/extension/GLTrueColorImagingExtension.java index 25b955ee44..08e246b0f6 100644 --- a/cave/com.raytheon.uf.viz.truecolor.gl/src/com/raytheon/uf/viz/truecolor/gl/extension/GLTrueColorImagingExtension.java +++ b/cave/com.raytheon.uf.viz.truecolor.gl/src/com/raytheon/uf/viz/truecolor/gl/extension/GLTrueColorImagingExtension.java @@ -117,7 +117,7 @@ public class GLTrueColorImagingExtension extends AbstractGLSLImagingExtension GLOffscreenRenderingExtension extension = target .getExtension(GLOffscreenRenderingExtension.class); try { - extension.renderOffscreen(trueColorImage, + extension.beginOffscreenRendering(trueColorImage, trueColorImage.getImageExtent()); boolean allPainted = true; for (Channel channel : Channel.values()) { @@ -145,7 +145,8 @@ public class GLTrueColorImagingExtension extends AbstractGLSLImagingExtension } } } catch (VizException e) { - extension.renderOnscreen(); + // Exception: end rendering now instead of postImageRender + extension.endOffscreenRendering(); throw e; } renderingChannel = null; @@ -180,7 +181,7 @@ public class GLTrueColorImagingExtension extends AbstractGLSLImagingExtension AbstractGLImage image, Object data) throws VizException { if (image instanceof GLTrueColorImage) { target.getExtension(GLOffscreenRenderingExtension.class) - .renderOnscreen(); + .endOffscreenRendering(); target.drawRasters(paintProps, new DrawableImage( ((GLTrueColorImage) image).getWrappedImage(), (PixelCoverage) data)); diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/AbstractGLColorMapDataFormat.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/AbstractGLColorMapDataFormat.java index bcdd8efd09..4480a8fab5 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/AbstractGLColorMapDataFormat.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/AbstractGLColorMapDataFormat.java @@ -32,7 +32,8 @@ import javax.media.opengl.GL; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Nov 21, 2011 mschenke Initial creation + * Nov 21, 2011 mschenke Initial creation + * Oct 16, 2013 2333 mschenke Removed Buffer from GLColorMapData * * * @@ -83,6 +84,16 @@ public abstract class AbstractGLColorMapDataFormat { */ public abstract double getDataFormatMax(); + /** + * Returns true if the data format is a signed data format (values in format + * can be less than 0), false otherwise + * + * @return true if signed format + */ + public boolean isSignedFormat() { + return getDataFormatMin() < 0; + } + /** * Create a buffer object for specified data for copying data from out of GL * @@ -93,8 +104,7 @@ public abstract class AbstractGLColorMapDataFormat { /** * Specifies if the data format type's values are scaled when copied to GL - * and referenced in shader. True means the values will by default be scaled - * to -1 to 1, false indicates shader will receive values as is + * and referenced in shader. * * @return */ @@ -108,9 +118,11 @@ public abstract class AbstractGLColorMapDataFormat { * @param x * @param y * @param data + * @param dataBuffer * @return */ - public abstract Number getValue(int x, int y, GLColorMapData data); + public abstract Number getValue(int x, int y, GLColorMapData data, + Buffer dataBuffer); /** * Get the number of bytes each pixel takes up diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLBufferColorMapData.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLBufferColorMapData.java new file mode 100644 index 0000000000..21d3613830 --- /dev/null +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLBufferColorMapData.java @@ -0,0 +1,102 @@ +/** + * 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.viz.core.gl.dataformat; + +import java.nio.Buffer; + +import javax.measure.unit.Unit; + +import com.raytheon.uf.common.colormap.image.ColorMapData; + +/** + * GLColorMapData backed by a java Buffer + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Oct 16, 2013       2333 mschenke    Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public class GLBufferColorMapData extends GLColorMapData { + + private Buffer data; + + private int textureType; + + private Unit dataUnit; + + public GLBufferColorMapData(ColorMapData cmData, + AbstractGLColorMapDataFormat dataFormat) { + super(dataFormat, cmData.getDataType(), cmData.getDimensions()); + this.textureType = dataFormat.getTextureType(); + this.data = dataFormat.formatForGL(cmData.getBuffer(), this); + this.dataUnit = cmData.getDataUnit(); + } + + public Buffer getData() { + return data; + } + + public void setData(Buffer data) { + this.data = data; + } + + public Buffer getCopybackBuffer() { + return dataFormat.getCopybackBuffer(this); + } + + public int getCopyBackTextureType() { + return dataFormat.getCopyBackTextureType(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.dataformat.GLColorMapData#getTextureType() + */ + @Override + public int getTextureType() { + return textureType; + } + + public void setTextureType(int textureType) { + this.textureType = textureType; + } + + public Number getValue(int x, int y) { + return dataFormat.getValue(x, y, this, data); + } + + /** + * @return + */ + public Unit getDataUnit() { + return dataUnit; + } + +} diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLByteDataFormat.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLByteDataFormat.java index 0f80cca621..843cdc6ff6 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLByteDataFormat.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLByteDataFormat.java @@ -110,8 +110,7 @@ public class GLByteDataFormat extends AbstractGLColorMapDataFormat { * (int, int, java.nio.Buffer) */ @Override - public Short getValue(int x, int y, GLColorMapData data) { - Buffer dataBuffer = data.getData(); + public Short getValue(int x, int y, GLColorMapData data, Buffer dataBuffer) { if (data.getTextureType() != GL.GL_UNSIGNED_BYTE) { throw new IllegalArgumentException( "Cannot process texture of type " + data.getTextureType()); diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLColorMapData.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLColorMapData.java index 4b00a96489..06cbf805eb 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLColorMapData.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLColorMapData.java @@ -19,10 +19,7 @@ **/ package com.raytheon.viz.core.gl.dataformat; -import java.nio.Buffer; - import com.raytheon.uf.common.colormap.image.ColorMapData; -import com.raytheon.uf.common.colormap.image.ColorMapData.ColorMapDataType; /** * @@ -34,7 +31,8 @@ import com.raytheon.uf.common.colormap.image.ColorMapData.ColorMapDataType; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Aug 10, 2011 bsteffen Initial creation + * Aug 10, 2011 bsteffen Initial creation + * Oct 16, 2013 2333 mschenke Removed Buffer from this object * * * @@ -43,31 +41,17 @@ import com.raytheon.uf.common.colormap.image.ColorMapData.ColorMapDataType; */ public class GLColorMapData { - private final AbstractGLColorMapDataFormat dataFormat; + protected final AbstractGLColorMapDataFormat dataFormat; - private Buffer data; + private final int[] dimensions; - private int[] dimensions; + private final ColorMapData.ColorMapDataType dataType; - private ColorMapData.ColorMapDataType dataType; - - private int textureType; - - public GLColorMapData(ColorMapData cmData, - AbstractGLColorMapDataFormat dataFormat) { + public GLColorMapData(AbstractGLColorMapDataFormat dataFormat, + ColorMapData.ColorMapDataType dataType, int[] dimensions) { this.dataFormat = dataFormat; - this.dimensions = cmData.getDimensions(); - this.dataType = cmData.getDataType(); - this.textureType = dataFormat.getTextureType(); - this.data = dataFormat.formatForGL(cmData.getBuffer(), this); - } - - public Buffer getData() { - return data; - } - - public void setData(Buffer data) { - this.data = data; + this.dataType = dataType; + this.dimensions = dimensions; } public int getTextureFormat() { @@ -79,21 +63,13 @@ public class GLColorMapData { } public int getTextureType() { - return textureType; - } - - public void setTextureType(int textureType) { - this.textureType = textureType; + return dataFormat.getTextureType(); } public ColorMapData.ColorMapDataType getDataType() { return dataType; } - public int getCopyBackTextureType() { - return dataFormat.getCopyBackTextureType(); - } - public double getDataFormatMin() { return dataFormat.getDataFormatMin(); } @@ -106,12 +82,8 @@ public class GLColorMapData { return dataFormat.isScaled(); } - public Buffer getCopybackBuffer() { - return dataFormat.getCopybackBuffer(this); - } - - public Number getValue(int x, int y) { - return dataFormat.getValue(x, y, this); + public boolean isDataFormatSigned() { + return dataFormat.isSignedFormat(); } public int getDimensionSize(int index) { diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLFloatDataFormat.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLFloatDataFormat.java index bec3eabc16..db059d5504 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLFloatDataFormat.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLFloatDataFormat.java @@ -107,18 +107,18 @@ public class GLFloatDataFormat extends AbstractGLColorMapDataFormat { * (int, int, com.raytheon.viz.core.gl.dataprep.GLColorMapData) */ @Override - public Float getValue(int x, int y, GLColorMapData data) { + public Float getValue(int x, int y, GLColorMapData data, Buffer dataBuffer) { if (data.getTextureType() != GL.GL_FLOAT) { throw new IllegalArgumentException( "Cannot process texture of type " + data.getTextureType()); - } else if (!(data.getData() instanceof FloatBuffer)) { + } else if (!(dataBuffer instanceof FloatBuffer)) { throw new IllegalArgumentException( "Expecting data to contain a FloatBuffer but instead it is a " - + data.getData().getClass().getSimpleName()); + + dataBuffer.getClass().getSimpleName()); } int width = data.getDimensionSize(0); int index = y * width + x; - FloatBuffer buffer = (FloatBuffer) data.getData(); + FloatBuffer buffer = (FloatBuffer) dataBuffer; return buffer.get(index); } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLHalfFloatDataFormat.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLHalfFloatDataFormat.java index b346a1c526..2f38202ff7 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLHalfFloatDataFormat.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLHalfFloatDataFormat.java @@ -121,18 +121,18 @@ public class GLHalfFloatDataFormat extends AbstractGLColorMapDataFormat { * (int, int, com.raytheon.viz.core.gl.dataprep.GLColorMapData) */ @Override - public Float getValue(int x, int y, GLColorMapData data) { + public Float getValue(int x, int y, GLColorMapData data, Buffer dataBuffer) { if (data.getTextureType() != GL.GL_HALF_FLOAT_ARB) { throw new IllegalArgumentException( "Cannot process texture of type " + data.getTextureType()); - } else if (!(data.getData() instanceof ShortBuffer)) { + } else if (!(dataBuffer instanceof ShortBuffer)) { throw new IllegalArgumentException( "Expecting data to contain a ShortBuffer but instead it is a " - + data.getData().getClass().getSimpleName()); + + dataBuffer.getClass().getSimpleName()); } int width = getAlignedWidth(data.getDimensionSize(0)); int index = y * width + x; - ShortBuffer buffer = (ShortBuffer) data.getData(); + ShortBuffer buffer = (ShortBuffer) dataBuffer; return convertFromFloat16(buffer.get(index)); } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLIntDataFormat.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLIntDataFormat.java index 3404bf60d5..1171c84f5b 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLIntDataFormat.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLIntDataFormat.java @@ -100,15 +100,15 @@ public class GLIntDataFormat extends AbstractGLColorMapDataFormat { * (int, int, com.raytheon.viz.core.gl.dataprep.GLColorMapData) */ @Override - public Integer getValue(int x, int y, GLColorMapData data) { - if (!(data.getData() instanceof IntBuffer)) { + public Integer getValue(int x, int y, GLColorMapData data, Buffer dataBuffer) { + if (!(dataBuffer instanceof IntBuffer)) { throw new IllegalArgumentException( "Expecting data to contain a IntBuffer but instead it is a " - + data.getData().getClass().getSimpleName()); + + dataBuffer.getClass().getSimpleName()); } int width = data.getDimensionSize(0); int index = y * width + x; - IntBuffer buffer = (IntBuffer) data.getData(); + IntBuffer buffer = (IntBuffer) dataBuffer; int value = buffer.get(index); switch (data.getTextureType()) { case GL.GL_INT: diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLShortDataFormat.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLShortDataFormat.java index 0181426897..9038f6eaa6 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLShortDataFormat.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLShortDataFormat.java @@ -105,15 +105,15 @@ public class GLShortDataFormat extends AbstractGLColorMapDataFormat { * (int, int, com.raytheon.viz.core.gl.dataprep.GLColorMapData) */ @Override - public Number getValue(int x, int y, GLColorMapData data) { - if (!(data.getData() instanceof ShortBuffer)) { + public Number getValue(int x, int y, GLColorMapData data, Buffer dataBuffer) { + if (!(dataBuffer instanceof ShortBuffer)) { throw new IllegalArgumentException( "Expecting data to contain a ShortBuffer but instead it is a " - + data.getData().getClass().getSimpleName()); + + dataBuffer.getClass().getSimpleName()); } int width = getAlignedWidth(data.getDimensionSize(0)); int index = y * width + x; - ShortBuffer buffer = (ShortBuffer) data.getData(); + ShortBuffer buffer = (ShortBuffer) dataBuffer; short value = buffer.get(index); switch (data.getTextureType()) { case GL.GL_SHORT: diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLSignedByteDataFormat.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLSignedByteDataFormat.java index 882a2cf705..027f844ab9 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLSignedByteDataFormat.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLSignedByteDataFormat.java @@ -19,6 +19,7 @@ **/ package com.raytheon.viz.core.gl.dataformat; +import java.nio.Buffer; import java.nio.ByteBuffer; import javax.media.opengl.GL; @@ -49,15 +50,15 @@ public class GLSignedByteDataFormat extends GLByteDataFormat { * int, com.raytheon.viz.core.gl.dataprep.GLColorMapData) */ @Override - public Short getValue(int x, int y, GLColorMapData data) { - if (!(data.getData() instanceof ByteBuffer)) { + public Short getValue(int x, int y, GLColorMapData data, Buffer dataBuffer) { + if (!(dataBuffer instanceof ByteBuffer)) { throw new IllegalArgumentException( "Expecting data to contain a ByteBuffer but instead it is a " - + data.getData().getClass().getSimpleName()); + + dataBuffer.getClass().getSimpleName()); } int width = getAlignedWidth(data.getDimensionSize(0)); int index = y * width + x; - ByteBuffer buffer = (ByteBuffer) data.getData(); + ByteBuffer buffer = (ByteBuffer) dataBuffer; byte value = buffer.get(index); switch (data.getTextureType()) { case GL.GL_BYTE: diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLUnsignedShortDataFormat.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLUnsignedShortDataFormat.java index c2e47d5d06..0b7867d864 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLUnsignedShortDataFormat.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/GLUnsignedShortDataFormat.java @@ -19,6 +19,7 @@ **/ package com.raytheon.viz.core.gl.dataformat; +import java.nio.Buffer; import java.nio.ShortBuffer; import javax.media.opengl.GL; @@ -82,15 +83,15 @@ public class GLUnsignedShortDataFormat extends GLShortDataFormat { * int, com.raytheon.viz.core.gl.dataformat.GLColorMapData) */ @Override - public Number getValue(int x, int y, GLColorMapData data) { - if (!(data.getData() instanceof ShortBuffer)) { + public Number getValue(int x, int y, GLColorMapData data, Buffer dataBuffer) { + if (!(dataBuffer instanceof ShortBuffer)) { throw new IllegalArgumentException( "Expecting data to contain a ShortBuffer but instead it is a " - + data.getData().getClass().getSimpleName()); + + dataBuffer.getClass().getSimpleName()); } int width = getAlignedWidth(data.getDimensionSize(0)); int index = y * width + x; - ShortBuffer buffer = (ShortBuffer) data.getData(); + ShortBuffer buffer = (ShortBuffer) dataBuffer; return (buffer.get(index) & 0xFFFF); } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/IGLColorMapDataFormatProvider.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/IGLColorMapDataFormatProvider.java index 2689e0b67c..204a28f8db 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/IGLColorMapDataFormatProvider.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/dataformat/IGLColorMapDataFormatProvider.java @@ -53,7 +53,7 @@ public interface IGLColorMapDataFormatProvider { public AbstractGLColorMapDataFormat getGLColorMapDataFormat( ColorMapData colorMapData) { return GLColorMapDataFormatFactory - .getGLColorMapDataFormat(colorMapData); + .getGLColorMapDataFormat(colorMapData.getDataType()); } }; diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/ext/GLOffscreenRenderingExtension.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/ext/GLOffscreenRenderingExtension.java index 7d387623e8..b13383fac0 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/ext/GLOffscreenRenderingExtension.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/ext/GLOffscreenRenderingExtension.java @@ -22,18 +22,14 @@ package com.raytheon.viz.core.gl.ext; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; -import java.nio.Buffer; -import java.nio.ByteBuffer; import java.util.Stack; import javax.media.opengl.GL; -import com.raytheon.uf.common.colormap.image.ColorMapData; import com.raytheon.uf.common.colormap.image.ColorMapData.ColorMapDataType; import com.raytheon.uf.common.colormap.prefs.ColorMapParameters; import com.raytheon.uf.viz.core.IExtent; import com.raytheon.uf.viz.core.IView; -import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback; import com.raytheon.uf.viz.core.data.IRenderedImageCallback; import com.raytheon.uf.viz.core.drawables.IImage; import com.raytheon.uf.viz.core.drawables.ext.GraphicsExtension; @@ -42,11 +38,13 @@ import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.core.gl.IGLTarget; import com.raytheon.viz.core.gl.dataformat.AbstractGLColorMapDataFormat; import com.raytheon.viz.core.gl.dataformat.GLByteDataFormat; +import com.raytheon.viz.core.gl.dataformat.GLColorMapData; import com.raytheon.viz.core.gl.dataformat.GLColorMapDataFormatFactory; -import com.raytheon.viz.core.gl.dataformat.IGLColorMapDataFormatProvider; import com.raytheon.viz.core.gl.ext.imaging.GLColormappedImageExtension; +import com.raytheon.viz.core.gl.ext.imaging.GLDefaultImagingExtension; import com.raytheon.viz.core.gl.images.AbstractGLImage; -import com.raytheon.viz.core.gl.images.GLColormappedImage; +import com.raytheon.viz.core.gl.images.GLImage; +import com.raytheon.viz.core.gl.images.GLOffscreenColormappedImage; import com.raytheon.viz.core.gl.internal.GLView2D; /** @@ -97,17 +95,29 @@ public class GLOffscreenRenderingExtension extends GraphicsExtension private ViewInfo currentInfo = null; - public void renderOffscreen(IImage offscreenImage) throws VizException { - renderOffscreen(offscreenImage, target.getView().getExtent()); + /** + * Begins offscreen rendering to the glImage. All rendering after this call + * will occur on the image until {@link #endOffscreenRendering()} is called. + * Render area will be set to the current view's extent + * + * @param glImage + * @throws VizException + */ + public void beginOffscreenRendering(AbstractGLImage glImage) + throws VizException { + beginOffscreenRendering(glImage, target.getView().getExtent()); } - public void renderOffscreen(IImage offscreenImage, IExtent offscreenExtent) - throws VizException { - if (!(offscreenImage instanceof AbstractGLImage)) { - throw new VizException( - "Can only use GLImages as offscreen frameBuffer on GLTarget"); - } - AbstractGLImage glImage = (AbstractGLImage) offscreenImage; + /** + * Begins offscreen rendering to the glImage. All rendering after this call + * will occur on the image until {@link #endOffscreenRendering()} is called. + * Render area will be set to the offscreenExtent provided + * + * @param glImage + * @throws VizException + */ + public void beginOffscreenRendering(AbstractGLImage glImage, + IExtent offscreenExtent) throws VizException { if (glImage.getStatus() == IImage.Status.UNLOADED || glImage.getStatus() == IImage.Status.LOADING) { glImage.setStatus(IImage.Status.LOADING); @@ -129,8 +139,16 @@ public class GLOffscreenRenderingExtension extends GraphicsExtension setCurrentView(new ViewInfo(view, glImage)); } - public void renderOnscreen() throws VizException { - if (viewStack.size() > 0) { + /** + * Ends offscreen rendering. Should only be called if a call to + * {@link #beginOffscreenRendering(AbstractGLImage)} or + * {@link #beginOffscreenRendering(AbstractGLImage, IExtent)} was + * successfully called first first + * + * @throws VizException + */ + public void endOffscreenRendering() throws VizException { + if (viewStack.isEmpty() == false) { setCurrentView(viewStack.pop()); } } @@ -167,60 +185,84 @@ public class GLOffscreenRenderingExtension extends GraphicsExtension return Compatibilty.TARGET_COMPATIBLE; } - public IImage constructOffscreenImage(final int[] dimensions) + /** + * Creates an RGB based image for use in offscreen rendering + * + * @param dimensions + * @return + * @throws VizException + */ + public AbstractGLImage constructOffscreenImage(final int[] dimensions) throws VizException { - return target.initializeRaster(new IRenderedImageCallback() { + return new GLImage(new IRenderedImageCallback() { @Override public RenderedImage getImage() throws VizException { return new BufferedImage(dimensions[0], dimensions[1], BufferedImage.TYPE_INT_RGB); } - }); + }, GLDefaultImagingExtension.class); } - public GLColormappedImage constructOffscreenImage( + /** + * Creates a colormapped offscreen image with the specified dataType and + * dimensions + * + * @param dataType + * @param dimensions + * @return + * @throws VizException + */ + public GLOffscreenColormappedImage constructOffscreenImage( ColorMapDataType dataType, int[] dimensions) throws VizException { return constructOffscreenImage(dataType, dimensions, null); } - public GLColormappedImage constructOffscreenImage( + /** + * Creates a colormapped offscreen image with the specified dataType and + * dimensions and default colormap parameters + * + * @param dataType + * @param dimensions + * @param parameters + * @return + * @throws VizException + */ + public GLOffscreenColormappedImage constructOffscreenImage( final ColorMapDataType dataType, final int[] dimensions, ColorMapParameters parameters) throws VizException { - GLColormappedImageExtension cmapExt = target - .getExtension(GLColormappedImageExtension.class); - if (!supportsLuminance) { - return cmapExt.initializeRaster(new NoLuminanceDataCallback( - dimensions, dataType), parameters); - } else { - GLColormappedImage image = cmapExt.initializeRaster( - new IColorMapDataRetrievalCallback() { + AbstractGLColorMapDataFormat format = null; - @Override - public ColorMapData getColorMapData() - throws VizException { - return new ColorMapData(dataType, dimensions); - } - }, parameters); - if (!checkedLuminance) { - checkedLuminance = true; - try { - renderOffscreen(image); - } catch (VizException e) { - // Log this so it is easy to see in the console logs. - new VizException( - "Graphics card does not support luminance textures.", - e).printStackTrace(System.out); - // assume we don't support luminance - supportsLuminance = false; - // Reconstruct image - image = constructOffscreenImage(dataType, dimensions, - parameters); - } finally { - renderOnscreen(); - } - } - return image; + if (supportsLuminance) { + format = GLColorMapDataFormatFactory + .getGLColorMapDataFormat(dataType); + } else { + format = new NoLuminanceDataFormat(dataType); } + + GLOffscreenColormappedImage image = new GLOffscreenColormappedImage( + new GLColorMapData(format, dataType, dimensions), parameters, + GLColormappedImageExtension.class); + + if (!checkedLuminance) { + checkedLuminance = true; + try { + beginOffscreenRendering(image); + } catch (VizException e) { + // Log this so it is easy to see in the console logs. + new VizException( + "Graphics card does not support luminance textures.", e) + .printStackTrace(System.out); + // assume we don't support luminance + supportsLuminance = false; + // Reconstruct image + image = constructOffscreenImage(dataType, dimensions, + parameters); + } finally { + endOffscreenRendering(); + } + } + + return image; } private static final class NoLuminanceDataFormat extends GLByteDataFormat { @@ -228,10 +270,11 @@ public class GLOffscreenRenderingExtension extends GraphicsExtension // Used to get the original min/max which makes signed bytes work and // theoretically will give better looking results for other integer data // types. - private final ColorMapDataType originalType; + private final AbstractGLColorMapDataFormat originalFormat; private NoLuminanceDataFormat(ColorMapDataType originalType) { - this.originalType = originalType; + this.originalFormat = GLColorMapDataFormatFactory + .getGLColorMapDataFormat(originalType); } @Override @@ -251,46 +294,14 @@ public class GLOffscreenRenderingExtension extends GraphicsExtension @Override public double getDataFormatMin() { - return getOriginalGLColorMapDataFormat().getDataFormatMin(); + return originalFormat.getDataFormatMin(); } @Override public double getDataFormatMax() { - return getOriginalGLColorMapDataFormat().getDataFormatMax(); + return originalFormat.getDataFormatMax(); } - private AbstractGLColorMapDataFormat getOriginalGLColorMapDataFormat() { - return GLColorMapDataFormatFactory - .getGLColorMapDataFormat(originalType); - } - - } - - private static final class NoLuminanceDataCallback implements - IColorMapDataRetrievalCallback, IGLColorMapDataFormatProvider { - - private int[] dimensions; - - private final ColorMapDataType originalType; - - private NoLuminanceDataCallback(int[] dimensions, - ColorMapDataType type) { - this.dimensions = dimensions; - this.originalType = type; - } - - @Override - public AbstractGLColorMapDataFormat getGLColorMapDataFormat( - ColorMapData colorMapData) { - return new NoLuminanceDataFormat(originalType); - } - - @Override - public ColorMapData getColorMapData() throws VizException { - Buffer buffer = ByteBuffer.allocate(dimensions[0] * dimensions[1] - * 3); - return new ColorMapData(buffer, dimensions, originalType); - } } } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/ext/imaging/GLColormappedImageExtension.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/ext/imaging/GLColormappedImageExtension.java index 1974b0d966..98d1b9ab54 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/ext/imaging/GLColormappedImageExtension.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/ext/imaging/GLColormappedImageExtension.java @@ -34,6 +34,7 @@ import com.raytheon.uf.viz.core.drawables.ext.colormap.IColormappedImageExtensio import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.viz.core.gl.glsl.AbstractGLSLImagingExtension; import com.raytheon.viz.core.gl.glsl.GLShaderProgram; +import com.raytheon.viz.core.gl.images.AbstractGLColormappedImage; import com.raytheon.viz.core.gl.images.AbstractGLImage; import com.raytheon.viz.core.gl.images.GLColormappedImage; import com.raytheon.viz.core.gl.objects.GLTextureObject; @@ -48,10 +49,11 @@ import com.raytheon.viz.core.gl.objects.GLTextureObject; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Nov 18, 2011 mschenke Initial creation + * Nov 18, 2011 mschenke Initial creation * Feb 14, 2013 1616 bsteffen Add option for interpolation of colormap * parameters, disable colormap interpolation * by default. + * Oct 16, 2013 2333 mschenke Cleaned up load shader method, used isScaled * * * @@ -94,10 +96,10 @@ public class GLColormappedImageExtension extends AbstractGLSLImagingExtension public Object preImageRender(PaintProperties paintProps, AbstractGLImage image, PixelCoverage coverage) throws VizException { GLColormappedImageExtensionData data = null; - if (image instanceof GLColormappedImage) { + if (image instanceof AbstractGLColormappedImage) { data = new GLColormappedImageExtensionData(); GL gl = target.getGl(); - GLColormappedImage glImage = (GLColormappedImage) image; + AbstractGLColormappedImage glImage = (AbstractGLColormappedImage) image; // First see if the colormap has been loaded ColorMapParameters usedColorMapParameters = ((IColormappedImage) glImage) .getColorMapParameters(); @@ -199,31 +201,30 @@ public class GLColormappedImageExtension extends AbstractGLSLImagingExtension public void loadShaderData(GLShaderProgram program, IImage iimage, PaintProperties paintProps) throws VizException { // Get image as AbstractGLImage - GLColormappedImage image = null; - if (iimage instanceof GLColormappedImage == false) { + AbstractGLColormappedImage image = null; + if (iimage instanceof AbstractGLColormappedImage == false) { throw new VizException( "Cannot apply glsl colormap raster shader to non gl colormap image"); } - image = (GLColormappedImage) iimage; + image = (AbstractGLColormappedImage) iimage; - GLColormappedImage colormappedImg = (GLColormappedImage) image; - ColorMapParameters colorMapParameters = colormappedImg - .getColorMapParameters(); + ColorMapParameters colorMapParameters = image.getColorMapParameters(); program.setUniform("colorMapSz", colorMapParameters.getColorMap() .getSize()); - int textureType = image.getTextureType(); - boolean isFloat = textureType == GL.GL_FLOAT - || textureType == GL.GL_HALF_FLOAT_ARB; + boolean isScaled = image.isImageFormatScaled(); double dataMin = colorMapParameters.getDataMin(); double dataMax = colorMapParameters.getDataMax(); - if (isFloat == false) { + if (isScaled) { // get format from image and get data min/max from it dataMin = image.getDataMin(); dataMax = image.getDataMax(); } - program.setUniform("isFloat", isFloat); + double cmapMin = colorMapParameters.getColorMapMin(); + double cmapMax = colorMapParameters.getColorMapMax(); + + program.setUniform("isFloat", !isScaled); program.setUniform("logarithmic", colorMapParameters.isLogarithmic() ? 1 : 0); program.setUniform("logFactor", colorMapParameters.getLogFactor()); @@ -233,8 +234,8 @@ public class GLColormappedImageExtension extends AbstractGLSLImagingExtension program.setUniform("naturalMin", dataMin); program.setUniform("naturalMax", dataMax); - program.setUniform("cmapMin", colorMapParameters.getColorMapMin()); - program.setUniform("cmapMax", colorMapParameters.getColorMapMax()); + program.setUniform("cmapMin", cmapMin); + program.setUniform("cmapMax", cmapMax); program.setUniform("alphaMask", 2); program.setUniform("colorMap", 1); diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/AbstractGLColormappedImage.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/AbstractGLColormappedImage.java new file mode 100644 index 0000000000..fcbba6b048 --- /dev/null +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/AbstractGLColormappedImage.java @@ -0,0 +1,280 @@ +/** + * 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.viz.core.gl.images; + +import javax.media.opengl.GL; + +import com.raytheon.uf.common.colormap.image.ColorMapData.ColorMapDataType; +import com.raytheon.uf.common.colormap.prefs.ColorMapParameters; +import com.raytheon.uf.viz.core.drawables.IColormappedImage; +import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension; +import com.raytheon.uf.viz.core.exception.VizException; +import com.sun.opengl.util.texture.TextureCoords; + +/** + * Base implementation of a gl colormapped image. + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Oct 16, 2013       2333 mschenke    Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public abstract class AbstractGLColormappedImage extends AbstractGLImage + implements IColormappedImage { + + protected ColorMapParameters colorMapParameters; + + protected GLCMTextureData data; + + public AbstractGLColormappedImage(GLCMTextureData data, + ColorMapParameters params, + Class extensionClass) { + super(extensionClass); + this.data = data; + this.colorMapParameters = params; + if (data.isLoaded()) { + setStatus(Status.LOADED); + } else if (data.isStaged()) { + setStatus(Status.STAGED); + } + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.images.AbstractGLImage#stageTexture() + */ + @Override + public boolean stageTexture() throws VizException { + if (data == null) { + throw new VizException( + "Cannot stage texture, image has been disposed"); + } + return data.stageTexture(); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.internal.GLImage#loadTexture(javax.media.opengl + * .GLContext) + */ + @Override + public void loadTexture(GL gl) throws VizException { + if (data.loadTexture(gl)) { + // Add to texture cache + setStatus(Status.LOADED); + } else { + setStatus(Status.FAILED); + } + } + + /** + * Return the texture's data type + * + * Example: GL.GL_FLOAT + * + * @return the data type of the texture + * + */ + public int getTextureType() { + return data.getTextureType(); + } + + public ColorMapDataType getColorMapDataType() { + return data.getColorMapDataType(); + } + + /** + * Return the texture's format + * + * Example: GL.GL_LUMINANCE + * + * @return the texture format + */ + public int getTextureFormat() { + return data.getTextureFormat(); + } + + /** + * Return the texture's internal format + * + * This is the format of the texture after driver manipulation + * + * Example: GL.GL_LUMINANCE8 + * + * @return the texture internal format + */ + public int getTextureInternalFormat() { + return data.getTextureInternalFormat(); + } + + /** + * @return the textureid + */ + public int getTextureid() { + return data.getTexId(); + } + + /** + * the absolute minimum value of a pixel in this image. {@link Double#NaN} + * if no absolute minimum exists + * + * @return + */ + public double getDataMin() { + return data.getDataMin(); + } + + /** + * the absolute maximum value of a pixel in this image. {@link Double#NaN} + * if no absolute maximum exists + * + * @return + */ + public double getDataMax() { + return data.getDataMax(); + } + + /** + * Returns true if the image values will be scaled when loaded into GL + * + * @return + */ + public boolean isImageFormatScaled() { + return data.isDataFormatScaled(); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.drawables.IColormappedImage#getColorMapParameters() + */ + @Override + public ColorMapParameters getColorMapParameters() { + return this.colorMapParameters; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.drawables.IColormappedImage#setColorMapParameters + * (com.raytheon.viz.core.drawables.ColorMapParameters) + */ + @Override + public void setColorMapParameters(ColorMapParameters params) { + this.colorMapParameters = params; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.internal.images.GLImage#getTextureStorageType() + */ + @Override + public int getTextureStorageType() { + return data.getTextureStorageType(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.internal.images.GLImage#getHeight() + */ + @Override + public int getHeight() { + return data.getDimensionSize(1); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.internal.images.GLImage#getWidth() + */ + @Override + public int getWidth() { + return data.getDimensionSize(0); + } + + @Override + public void dispose() { + super.dispose(); + if (data != null) { + data.dispose(); + data = null; + } + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.images.AbstractGLImage#getStatus() + */ + @Override + public Status getStatus() { + Status status = super.getStatus(); + if (data == null) { + if (status != Status.UNLOADED) { + setStatus(Status.UNLOADED); + } + } else if (data.isLoaded()) { + if (status != Status.LOADED) { + setStatus(Status.LOADED); + } + } else if (data.isStaged()) { + if (status != Status.STAGED) { + setStatus(Status.STAGED); + } + } else if (data.isLoaded() == false && status == Status.LOADED) { + if (data.isStaged()) { + setStatus(Status.STAGED); + } else { + setStatus(Status.UNLOADED); + } + } else if (data.isStaged() == false && status == Status.STAGED) { + setStatus(Status.UNLOADED); + } + return super.getStatus(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.images.AbstractGLImage#getTextureCoords() + */ + @Override + public TextureCoords getTextureCoords() { + return new TextureCoords(0, 1, 1, 0); + } + +} diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/AbstractGLImage.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/AbstractGLImage.java index 86b9a7d7d0..d389970fdd 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/AbstractGLImage.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/AbstractGLImage.java @@ -41,7 +41,8 @@ import com.sun.opengl.util.texture.TextureCoords; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Aug 2, 2011 bsteffen Initial creation + * Aug 2, 2011 bsteffen Initial creation + * Oct 16, 2013 2333 mschenke Cleaned up usaAsFrameBuffer for clearer logic * * * @@ -171,55 +172,61 @@ public abstract class AbstractGLImage implements IImage { public void usaAsFrameBuffer() throws VizException { GL gl = GLU.getCurrentGL(); - if (fbo != null && fbo.isValid()) { - fbo.bind(gl); - gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - if (rbuf != null && rbuf.isValid()) { - gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); + if (fbo == null || fbo.isValid() == false) { + gl.glBindTexture(getTextureStorageType(), 0); + + fbo = new GLFrameBufferObject(this); + if (fbo.isValid()) { + fbo.bind(gl); + if ((rbuf == null || rbuf.isValid() == false) + && gl.glIsEnabled(GL.GL_DEPTH_TEST)) { + // Generate and bind a render buffer for the depth component + rbuf = new GLRenderBuffer(this); + rbuf.bind(gl); + rbuf.createStorage(gl, GL.GL_DEPTH_COMPONENT, getWidth(), + getHeight()); + gl.glBindRenderbufferEXT(GL.GL_RENDERBUFFER_EXT, 0); + + // Attach render buffer to depth of fbo + gl.glFramebufferRenderbufferEXT(GL.GL_FRAMEBUFFER_EXT, + GL.GL_DEPTH_ATTACHMENT_EXT, GL.GL_RENDERBUFFER_EXT, + rbuf.getId()); + } + + // Attach texture to color attachement on fbo + gl.glFramebufferTexture2DEXT(GL.GL_FRAMEBUFFER_EXT, + GL.GL_COLOR_ATTACHMENT0_EXT, getTextureStorageType(), + getTextureid(), 0); + String errorMessage = fbo.checkStatus(gl); + + // use the window buffer + if (errorMessage != null) { + gl.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, 0); + if (fbo != null) { + fbo.dispose(); + fbo = null; + } + if (rbuf != null) { + rbuf.dispose(); + rbuf = null; + } + throw new VizException(errorMessage); + } } else { - gl.glClear(GL.GL_COLOR_BUFFER_BIT); + throw new VizException("Error generating Frame Buffer Object"); } - return; + } else { + // Bind the fbo for use + fbo.bind(gl); } - gl = GLU.getCurrentGL(); - gl.glBindTexture(getTextureStorageType(), 0); - - fbo = new GLFrameBufferObject(this); - fbo.bind(gl); - - if (gl.glIsEnabled(GL.GL_DEPTH_TEST)) { - // Generate and bind a render buffer for the depth component - rbuf = new GLRenderBuffer(this); - rbuf.bind(gl); - rbuf.createStorage(gl, GL.GL_DEPTH_COMPONENT, getWidth(), - getHeight()); - gl.glBindRenderbufferEXT(GL.GL_RENDERBUFFER_EXT, 0); - - // Attach render buffer to depth of fbo - gl.glFramebufferRenderbufferEXT(GL.GL_FRAMEBUFFER_EXT, - GL.GL_DEPTH_ATTACHMENT_EXT, GL.GL_RENDERBUFFER_EXT, - rbuf.getId()); + gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + if (rbuf != null && rbuf.isValid()) { + gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); + } else { + gl.glClear(GL.GL_COLOR_BUFFER_BIT); } - // Attach texture to color attachement on fbo - gl.glFramebufferTexture2DEXT(GL.GL_FRAMEBUFFER_EXT, - GL.GL_COLOR_ATTACHMENT0_EXT, getTextureStorageType(), - getTextureid(), 0); - String errorMessage = fbo.checkStatus(gl); - // use the window buffer - if (errorMessage != null) { - gl.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, 0); - if (fbo != null) { - fbo.dispose(); - fbo = null; - } - if (rbuf != null) { - rbuf.dispose(); - rbuf = null; - } - throw new VizException(errorMessage); - } } /* @@ -265,7 +272,7 @@ public abstract class AbstractGLImage implements IImage { } return false; } - + /* * (non-Javadoc) * diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLCMTextureData.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLCMTextureData.java index 4432d3f462..d9df2d3bff 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLCMTextureData.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLCMTextureData.java @@ -19,29 +19,15 @@ **/ package com.raytheon.viz.core.gl.images; -import java.nio.Buffer; -import java.util.HashMap; -import java.util.Map; - import javax.media.opengl.GL; -import javax.media.opengl.glu.GLU; -import com.raytheon.uf.common.colormap.image.ColorMapData; import com.raytheon.uf.common.colormap.image.ColorMapData.ColorMapDataType; -import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback; import com.raytheon.uf.viz.core.exception.VizException; -import com.raytheon.viz.core.gl.GLContextBridge; import com.raytheon.viz.core.gl.dataformat.GLColorMapData; -import com.raytheon.viz.core.gl.dataformat.IGLColorMapDataFormatProvider; -import com.raytheon.viz.core.gl.internal.cache.IImageCacheable; -import com.raytheon.viz.core.gl.internal.cache.ImageCache; -import com.raytheon.viz.core.gl.internal.cache.ImageCache.CacheType; import com.raytheon.viz.core.gl.objects.GLTextureObject; /** - * - * TODO Make use new ColorMapData retrieval callback stuff.... Keep old - * CMDataPreparer stuff working + * Colormappable texture data object. Does not provide source of data * *
  * 
@@ -49,87 +35,77 @@ import com.raytheon.viz.core.gl.objects.GLTextureObject;
  * 
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
- * Aug 2, 2011            bsteffen     Initial creation
+ * Aug 2, 2011             bsteffen    Initial creation
  * Mar 21, 2013 1806       bsteffen    Update GL mosaicing to use dynamic data
  *                                     format for offscreen textures.
+ * Oct 16, 2013 2333       mschenke    Moved retrievable/Buffer parts out and
+ *                                     into separate class.
  * 
  * 
* * @author bsteffen * @version 1.0 */ -public class GLCMTextureData implements IImageCacheable { +public class GLCMTextureData { - private GLTextureObject tex; + protected GLTextureObject tex; - private final IColorMapDataRetrievalCallback callback; + protected GLColorMapData data; - private int refCount = 0; - - private GLColorMapData data = null; - - private GLCMTextureData(IColorMapDataRetrievalCallback callback) { - this.callback = callback; - } - - public void use() { - refCount += 1; - } - - public void dispose() { - synchronized (texMap) { - refCount -= 1; - if (refCount == 0) { - texMap.remove(callback); - ImageCache.getInstance(CacheType.MEMORY).remove(this); - ImageCache.getInstance(CacheType.TEXTURE).remove(this); - } + /** + * Constructs a GLCMTextureData with the specified GLColorMapData. + * + * @param data + */ + public GLCMTextureData(GLColorMapData data) { + this.data = data; + if (data == null && getClass().equals(GLCMTextureData.class)) { + // If null data and class is not overridden, throw exception + throw new IllegalArgumentException( + "null GLColorMapData is not allowed for GLCMTextureData"); } } - public synchronized void disposeTexture(GL gl) { + protected GLColorMapData getDataObject() { + return data; + } + + /** + * Disposes the texture data object + */ + public void dispose() { + // Dispose the texture + disposeTexture(); + } + + /** + * Disposes the underlying texture in the texture data + */ + public synchronized void disposeTexture() { if (isLoaded()) { tex.dispose(); tex = null; } - ImageCache.getInstance(CacheType.TEXTURE).remove(this); - } - - public synchronized void disposeTextureData() { - if (isStaged()) { - data.setData(null); - } - ImageCache.getInstance(CacheType.MEMORY).remove(this); } + /** + * Stages the texture data for use. + * + * @return true if successfully staged, false otherwise + * @throws VizException + */ public synchronized boolean stageTexture() throws VizException { - // Don't need to stage if we are already in gpu - if (isLoaded()) { - return true; - } - // Don't need to stage if we already have data - if (isStaged()) { - return true; - } - - // OK, Fetch the data - ColorMapData cmData = callback.getColorMapData(); - if (cmData != null) { - IGLColorMapDataFormatProvider glDataFormatCallback = IGLColorMapDataFormatProvider.defaultCallback; - if (callback instanceof IGLColorMapDataFormatProvider) { - glDataFormatCallback = (IGLColorMapDataFormatProvider) callback; - } - data = new GLColorMapData(cmData, - glDataFormatCallback.getGLColorMapDataFormat(cmData)); - if (isStaged()) { - ImageCache.getInstance(CacheType.MEMORY).put(this); - return true; - } - } - // The data fetch didn't go well - return false; + // There is no data to stage + return isStaged(); } + /** + * Loads the texture object into GL + * + * @param gl + * @return true if texture is loaded, false otherwise + * @throws VizException + */ public synchronized boolean loadTexture(GL gl) throws VizException { // Don't need to load if we are already loaded if (isLoaded()) { @@ -149,8 +125,7 @@ public class GLCMTextureData implements IImageCacheable { gl.glTexParameteri(type, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR); gl.glTexParameteri(type, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR); - if (getTextureType() == GL.GL_SHORT || getTextureType() == GL.GL_INT - || getTextureType() == GL.GL_BYTE) { + if (isDataFormatScaled() && isDataFormatSigned()) { // GL maps signed data into the range -1 to 1, but gl trims // this to a valid range of 0 to 1, essentially removing // negative values. Adding a scale and bias remaps this from @@ -160,120 +135,156 @@ public class GLCMTextureData implements IImageCacheable { gl.glPixelTransferf(GL.GL_RED_BIAS, 0.5f); } - int w = data.getDimensionSize(0); - int h = data.getDimensionSize(1); + int w = getDimensionSize(0); + int h = getDimensionSize(1); + + createTexture2D(gl, type, w, h); - gl.glTexImage2D(type, 0, getTextureInternalFormat(), w, h, 0, - getTextureFormat(), getTextureType(), data.getData().rewind()); gl.glPixelTransferf(GL.GL_RED_SCALE, 1.0f); gl.glPixelTransferf(GL.GL_RED_BIAS, 0.0f); - ImageCache.getInstance(CacheType.TEXTURE).put(this); + return true; } - public boolean isStaged() { - return data != null && data.getData() != null; + /** + * Creates a 2D texture for type, with width/height w/h. Texture object must + * be bound for this call to work using + * {@link GLTextureObject#bind(GL, int)} + * + * @param gl + * @param type + * @param w + * @param h + */ + protected void createTexture2D(GL gl, int type, int w, int h) { + // Allocate our space on the graphics card, no buffer to upload so it + // will be filled with default values initially (0s) + gl.glTexImage2D(type, 0, getTextureInternalFormat(), w, h, 0, + getTextureFormat(), getTextureType(), null); } + /** + * Checks if texture data is staged. If false, a call to + * {@link #stageTexture()} is needed before texture can be loaded + * + * @return true if staged + */ + public boolean isStaged() { + // There is nothing to stage, so we are good if data != null + return getDataObject() != null; + } + + /** + * Checks if texture data is loaded. If false, a call to + * {@link #loadTexture(GL)} is needed before the texture can be used in GL + * + * @return true if staged + */ public boolean isLoaded() { return tex != null && tex.isValid(); } + /** + * Returns the size of the dimension index passed in (0=width,1=height) + * + * @param dimension + * @return + */ public int getDimensionSize(int dimension) { return data.getDimensionSize(dimension); } + /** + * Returns the texture type of the data (FLOAT,INT,SHORT,etc). + * + * @return + */ public int getTextureType() { return data.getTextureType(); } + /** + * Returns texture format (LUMINANCE,RGB) + * + * @return + */ public int getTextureFormat() { return data.getTextureFormat(); } + /** + * Returns texture gl internal format (number of bits: LUMINANCE8/16/32) + * + * @return + */ public int getTextureInternalFormat() { return data.getTextureInternalFormat(); } + /** + * Returns the minimum valid data value for the texture format. (0 for + * unsigned byte, -128 for signed byte, etc) + * + * @return + */ public double getDataMin() { return data.getDataFormatMin(); } + /** + * Returns the maximium valid data value for the texture format. ( 255 for + * usnigned byte, 127 for signed byte, etc) + * + * @return + */ public double getDataMax() { return data.getDataFormatMax(); } + /** + * Returns true if the data values when uploaded to GL are in a scaled + * format and need to be converted to get actual data value + * + * @return + */ public boolean isDataFormatScaled() { return data.isDataFormatScaled(); } + /** + * Returns true if the data format is a signed data format (values in format + * can be less than 0), false otherwise + * + * @return true if signed format + */ + public boolean isDataFormatSigned() { + return data.isDataFormatSigned(); + } + + /** + * The id of the texture in GL. Will not work if {@link #isLoaded()} returns + * false + * + * @return + */ public int getTexId() { - if (isLoaded()) { - ImageCache.getInstance(CacheType.TEXTURE).put(this); - } return tex.getId(); } + /** + * The texture storage type of the data (TEXTURE_2D) + * + * @return + */ public int getTextureStorageType() { return GL.GL_TEXTURE_2D; } - public double getValue(int x, int y) { - double value = Double.NaN; - if (!isStaged() && isLoaded()) { - GLContextBridge.makeMasterContextCurrent(); - GL gl = GLU.getCurrentGL(); - int textureStorageType = getTextureStorageType(); - int copybackTextureType = data.getCopyBackTextureType(); - Buffer copybackBuffer = data.getCopybackBuffer(); - gl.glEnable(textureStorageType); - gl.glActiveTexture(GL.GL_TEXTURE0); - tex.bind(gl, textureStorageType); - gl.glGetTexImage(textureStorageType, 0, getTextureFormat(), - copybackTextureType, copybackBuffer.rewind()); - gl.glActiveTexture(GL.GL_TEXTURE0); - gl.glBindTexture(textureStorageType, 0); - gl.glDisable(textureStorageType); - - data.setTextureType(copybackTextureType); - data.setData(copybackBuffer); - GLContextBridge.releaseMasterContext(); - } - if (data != null) { - ImageCache.getInstance(CacheType.MEMORY).put(this); - value = data.getValue(x, y).doubleValue(); - } - return value; - } - - private static Map texMap = new HashMap(); - - public static GLCMTextureData getGlTextureId( - IColorMapDataRetrievalCallback callback) { - synchronized (texMap) { - GLCMTextureData data = texMap.get(callback); - if (data == null) { - data = new GLCMTextureData(callback); - texMap.put(callback, data); - } - data.use(); - return data; - } - } - - @Override - public int getSize() { - if (data != null) { - int[] dimensions = data.getDimensions(); - int totalSize = data.getBytesPerPixel(); - for (int i = 0; i < dimensions.length; ++i) { - totalSize *= dimensions[i]; - } - return totalSize; - } - return 0; - } - + /** + * Returns the {@link ColorMapDataType} for the texture + * + * @return + */ public ColorMapDataType getColorMapDataType() { return data.getDataType(); } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLColormappedImage.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLColormappedImage.java index 93e95a9f66..98811a23db 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLColormappedImage.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLColormappedImage.java @@ -24,10 +24,8 @@ import javax.media.opengl.GL; import com.raytheon.uf.common.colormap.image.ColorMapData.ColorMapDataType; import com.raytheon.uf.common.colormap.prefs.ColorMapParameters; import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback; -import com.raytheon.uf.viz.core.drawables.IColormappedImage; import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension; import com.raytheon.uf.viz.core.exception.VizException; -import com.sun.opengl.util.texture.TextureCoords; /** * @@ -39,46 +37,25 @@ import com.sun.opengl.util.texture.TextureCoords; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Jul 27, 2009 mschenke Initial creation + * Jul 27, 2009 mschenke Initial creation * Mar 21, 2013 1806 bsteffen Update GL mosaicing to use dynamic data * format for offscreen textures. + * Oct 16, 2013 2333 mschenke Moved shared logic into base class * * * * @author mschenke */ -public class GLColormappedImage extends AbstractGLImage implements - IColormappedImage { +public class GLColormappedImage extends AbstractGLColormappedImage { - protected ColorMapParameters colorMapParameters; - - protected GLCMTextureData data; + protected GLRetrievableCMTextureData data; public GLColormappedImage(IColorMapDataRetrievalCallback dataCallback, ColorMapParameters params, Class extensionClass) { - super(extensionClass); - this.data = GLCMTextureData.getGlTextureId(dataCallback); - this.colorMapParameters = params; - if (data.isLoaded()) { - setStatus(Status.LOADED); - } else if (data.isStaged()) { - setStatus(Status.STAGED); - } - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.gl.images.AbstractGLImage#stageTexture() - */ - @Override - public boolean stageTexture() throws VizException { - if (data == null) { - throw new VizException( - "Cannot stage texture, image has been disposed"); - } - return data.stageTexture(); + super(GLRetrievableCMTextureData.getGlTextureId(dataCallback), params, + extensionClass); + this.data = (GLRetrievableCMTextureData) super.data; } /* @@ -90,117 +67,15 @@ public class GLColormappedImage extends AbstractGLImage implements */ @Override public void loadTexture(GL gl) throws VizException { - if (data.loadTexture(gl)) { - // Add to texture cache - setStatus(Status.LOADED); - data.disposeTextureData(); - } else { - setStatus(Status.FAILED); - data.disposeTextureData(); - } - } - - /** - * Return the texture's data type - * - * Example: GL.GL_FLOAT - * - * @return the data type of the texture - * - */ - public int getTextureType() { - return data.getTextureType(); + super.loadTexture(gl); + // No need to keep around texture data after loading + data.disposeTextureData(); } public ColorMapDataType getColorMapDataType() { return data.getColorMapDataType(); } - /** - * Return the texture's format - * - * Example: GL.GL_LUMINANCE - * - * @return the texture format - */ - public int getTextureFormat() { - return data.getTextureFormat(); - } - - /** - * Return the texture's internal format - * - * This is the format of the texture after driver manipulation - * - * Example: GL.GL_LUMINANCE8 - * - * @return the texture internal format - */ - public int getTextureInternalFormat() { - return data.getTextureInternalFormat(); - } - - /** - * @return the textureid - */ - public int getTextureid() { - return data.getTexId(); - } - - /** - * the absolute minimum value of a pixel in this image. {@link Double#NaN} - * if no absolute minimum exists - * - * @return - */ - public double getDataMin() { - return data.getDataMin(); - } - - /** - * the absolute maximum value of a pixel in this image. {@link Double#NaN} - * if no absolute maximum exists - * - * @return - */ - public double getDataMax() { - return data.getDataMax(); - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.viz.core.drawables.IColormappedImage#getColorMapParameters() - */ - @Override - public ColorMapParameters getColorMapParameters() { - return this.colorMapParameters; - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.viz.core.drawables.IColormappedImage#setColorMapParameters - * (com.raytheon.viz.core.drawables.ColorMapParameters) - */ - @Override - public void setColorMapParameters(ColorMapParameters params) { - this.colorMapParameters = params; - } - - /* - * (non-Javadoc) - * - * @see - * com.raytheon.viz.core.gl.internal.images.GLImage#getTextureStorageType() - */ - @Override - public int getTextureStorageType() { - return data.getTextureStorageType(); - } - @Override public double getValue(int x, int y) { double val = Double.NaN; @@ -210,33 +85,10 @@ public class GLColormappedImage extends AbstractGLImage implements return val; } - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.gl.internal.images.GLImage#getHeight() - */ - @Override - public int getHeight() { - return data.getDimensionSize(1); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.gl.internal.images.GLImage#getWidth() - */ - @Override - public int getWidth() { - return data.getDimensionSize(0); - } - @Override public void dispose() { super.dispose(); - if (data != null) { - data.dispose(); - data = null; - } + data = null; } /* @@ -250,46 +102,4 @@ public class GLColormappedImage extends AbstractGLImage implements super.usaAsFrameBuffer(); } - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.gl.images.AbstractGLImage#getStatus() - */ - @Override - public Status getStatus() { - Status status = super.getStatus(); - if (data == null) { - if (status != Status.UNLOADED) { - setStatus(Status.UNLOADED); - } - } else if (data.isLoaded()) { - if (status != Status.LOADED) { - setStatus(Status.LOADED); - } - } else if (data.isStaged()) { - if (status != Status.STAGED) { - setStatus(Status.STAGED); - } - } else if (data.isLoaded() == false && status == Status.LOADED) { - if (data.isStaged()) { - setStatus(Status.STAGED); - } else { - setStatus(Status.UNLOADED); - } - } else if (data.isStaged() == false && status == Status.STAGED) { - setStatus(Status.UNLOADED); - } - return super.getStatus(); - } - - /* - * (non-Javadoc) - * - * @see com.raytheon.viz.core.gl.images.AbstractGLImage#getTextureCoords() - */ - @Override - public TextureCoords getTextureCoords() { - return new TextureCoords(0, 1, 1, 0); - } - } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLImage.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLImage.java index 56be9e488d..834f7c5ac8 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLImage.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLImage.java @@ -105,7 +105,7 @@ public class GLImage extends AbstractGLImage implements IImageCacheable { ImageCache.getInstance(CacheType.TEXTURE).remove(this); } - public void disposeTexture(GL gl) { + public void disposeTexture() { synchronized (this) { if (theTexture == null) { return; diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLOffscreenColormappedImage.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLOffscreenColormappedImage.java new file mode 100644 index 0000000000..181ee5275a --- /dev/null +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLOffscreenColormappedImage.java @@ -0,0 +1,69 @@ +/** + * 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.viz.core.gl.images; + +import com.raytheon.uf.common.colormap.prefs.ColorMapParameters; +import com.raytheon.uf.viz.core.drawables.ext.IImagingExtension; +import com.raytheon.viz.core.gl.dataformat.GLColorMapData; + +/** + * Colormappable image that is writeable to in GL/GLSL but is not back by a + * Buffer and therefore not preinitialized or inspectable + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Oct 16, 2013       2333 mschenke    Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public class GLOffscreenColormappedImage extends AbstractGLColormappedImage { + + /** + * @param data + * @param params + * @param extensionClass + */ + public GLOffscreenColormappedImage(GLColorMapData data, + ColorMapParameters params, + Class extensionClass) { + super(new GLCMTextureData(data), params, extensionClass); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.viz.core.drawables.IColormappedImage#getValue(int, + * int) + */ + @Override + public double getValue(int x, int y) { + // TODO: Read value off of graphics card? + return Double.NaN; + } + +} diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLRetrievableCMTextureData.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLRetrievableCMTextureData.java new file mode 100644 index 0000000000..a77cd86450 --- /dev/null +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/images/GLRetrievableCMTextureData.java @@ -0,0 +1,291 @@ +/** + * 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.viz.core.gl.images; + +import java.nio.Buffer; +import java.util.HashMap; +import java.util.Map; + +import javax.measure.unit.Unit; +import javax.media.opengl.GL; +import javax.media.opengl.glu.GLU; + +import com.raytheon.uf.common.colormap.image.ColorMapData; +import com.raytheon.uf.viz.core.data.IColorMapDataRetrievalCallback; +import com.raytheon.uf.viz.core.exception.VizException; +import com.raytheon.viz.core.gl.GLContextBridge; +import com.raytheon.viz.core.gl.dataformat.GLBufferColorMapData; +import com.raytheon.viz.core.gl.dataformat.IGLColorMapDataFormatProvider; +import com.raytheon.viz.core.gl.internal.cache.IImageCacheable; +import com.raytheon.viz.core.gl.internal.cache.ImageCache; +import com.raytheon.viz.core.gl.internal.cache.ImageCache.CacheType; + +/** + * Object that represents a colormapped texture that can be unloaded and + * reloaded from main/graphics memory using a retrieval callback + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Jun 24, 2013            mschenke     Initial creation
+ * 
+ * 
+ * + * @author mschenke + * @version 1.0 + */ + +public class GLRetrievableCMTextureData extends GLCMTextureData implements + IImageCacheable { + + private static Map texMap = new HashMap(); + + /** + * Gets a {@link GLRetrievableCMTextureData} for the callback. These + * TextureData objects can be shared among callbacks + * + * @param callback + * @return + */ + public static GLRetrievableCMTextureData getGlTextureId( + IColorMapDataRetrievalCallback callback) { + synchronized (texMap) { + GLRetrievableCMTextureData data = texMap.get(callback); + if (data == null) { + data = new GLRetrievableCMTextureData(callback); + texMap.put(callback, data); + } + data.use(); + return data; + } + } + + private final IColorMapDataRetrievalCallback callback; + + private int refCount = 0; + + /** + * Private constructor, access only allowed through + * {@link #getGlTextureId(IColorMapDataRetrievalCallback)} + * + * @param callback + */ + private GLRetrievableCMTextureData(IColorMapDataRetrievalCallback callback) { + super(null); + this.callback = callback; + } + + @Override + protected GLBufferColorMapData getDataObject() { + return (GLBufferColorMapData) super.getDataObject(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.images.GLCMTextureData#stageTexture() + */ + @Override + public synchronized boolean stageTexture() throws VizException { + // Don't need to stage if we are already in GL + if (isLoaded()) { + return true; + } + // Don't need to stage if we already have data locally + if (isStaged()) { + return true; + } + + // OK, Fetch the data + ColorMapData cmData = callback.getColorMapData(); + if (cmData != null) { + IGLColorMapDataFormatProvider glDataFormatCallback = IGLColorMapDataFormatProvider.defaultCallback; + if (callback instanceof IGLColorMapDataFormatProvider) { + glDataFormatCallback = (IGLColorMapDataFormatProvider) callback; + } + this.data = new GLBufferColorMapData(cmData, + glDataFormatCallback.getGLColorMapDataFormat(cmData)); + if (isStaged()) { + ImageCache.getInstance(CacheType.MEMORY).put(this); + return true; + } + } + // The data fetch didn't go well + return false; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.images.GLCMTextureData#loadTexture(javax.media + * .opengl.GL) + */ + @Override + public synchronized boolean loadTexture(GL gl) throws VizException { + if (super.loadTexture(gl)) { + ImageCache.getInstance(CacheType.TEXTURE).put(this); + return true; + } + return false; + } + + @Override + public synchronized void disposeTexture() { + super.disposeTexture(); + ImageCache.getInstance(CacheType.TEXTURE).remove(this); + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.internal.cache.IImageCacheable#disposeTextureData + * () + */ + @Override + public void disposeTextureData() { + if (isStaged()) { + getDataObject().setData(null); + } + ImageCache.getInstance(CacheType.MEMORY).remove(this); + } + + public void use() { + refCount += 1; + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.images.GLCMTextureData#dispose() + */ + @Override + public void dispose() { + synchronized (texMap) { + refCount -= 1; + if (refCount == 0) { + texMap.remove(callback); + ImageCache.getInstance(CacheType.TEXTURE).remove(this); + ImageCache.getInstance(CacheType.MEMORY).remove(this); + } + } + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.images.GLCMTextureData#getTexId() + */ + @Override + public int getTexId() { + if (isLoaded()) { + ImageCache.getInstance(CacheType.TEXTURE).put(this); + } + return super.getTexId(); + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.uf.common.util.cache.ICacheObject#getSize() + */ + @Override + public int getSize() { + GLBufferColorMapData data = getDataObject(); + if (data != null) { + int[] dimensions = data.getDimensions(); + int totalSize = data.getBytesPerPixel(); + for (int i = 0; i < dimensions.length; ++i) { + totalSize *= dimensions[i]; + } + return totalSize; + } + return 0; + } + + /* + * (non-Javadoc) + * + * @see com.raytheon.viz.core.gl.images.GLCMTextureData#isStaged() + */ + @Override + public boolean isStaged() { + GLBufferColorMapData data = getDataObject(); + // Override since we have our required data + return data != null && data.getData() != null; + } + + public double getValue(int x, int y) { + GLBufferColorMapData data = getDataObject(); + double value = Double.NaN; + if (!isStaged() && isLoaded()) { + GLContextBridge.makeMasterContextCurrent(); + GL gl = GLU.getCurrentGL(); + int textureStorageType = getTextureStorageType(); + int copybackTextureType = data.getCopyBackTextureType(); + Buffer copybackBuffer = data.getCopybackBuffer(); + gl.glEnable(textureStorageType); + gl.glActiveTexture(GL.GL_TEXTURE0); + tex.bind(gl, textureStorageType); + gl.glGetTexImage(textureStorageType, 0, getTextureFormat(), + copybackTextureType, copybackBuffer.rewind()); + gl.glActiveTexture(GL.GL_TEXTURE0); + gl.glBindTexture(textureStorageType, 0); + gl.glDisable(textureStorageType); + + data.setTextureType(copybackTextureType); + data.setData(copybackBuffer); + GLContextBridge.releaseMasterContext(); + } + if (data != null) { + ImageCache.getInstance(CacheType.MEMORY).put(this); + value = data.getValue(x, y).doubleValue(); + } + return value; + } + + /* + * (non-Javadoc) + * + * @see + * com.raytheon.viz.core.gl.images.GLCMTextureData#uploadTexture2D(javax + * .media.opengl.GL, int, int, int) + */ + @Override + protected void createTexture2D(GL gl, int type, int w, int h) { + gl.glTexImage2D(type, 0, getTextureInternalFormat(), w, h, 0, + getTextureFormat(), getTextureType(), getDataObject().getData() + .rewind()); + } + + /** + * Returns the {@link Unit} associated with the data + * + * @return the dataUnit + */ + public Unit getDataUnit() { + GLBufferColorMapData data = getDataObject(); + return data != null ? data.getDataUnit() : null; + } +} diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/cache/IImageCacheable.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/cache/IImageCacheable.java index 41627da7e8..9b59791f39 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/cache/IImageCacheable.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/cache/IImageCacheable.java @@ -19,8 +19,6 @@ **/ package com.raytheon.viz.core.gl.internal.cache; -import javax.media.opengl.GL; - import com.raytheon.uf.common.util.cache.ICacheObject; /** @@ -44,6 +42,6 @@ public interface IImageCacheable extends ICacheObject { public abstract void disposeTextureData(); - public abstract void disposeTexture(GL gl); + public abstract void disposeTexture(); } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/cache/ImageCache.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/cache/ImageCache.java index f956533d01..bc634cf6eb 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/cache/ImageCache.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/cache/ImageCache.java @@ -130,7 +130,7 @@ public class ImageCache extends LRUCache implements new GLDisposer() { @Override protected void dispose(GL gl) { - i.disposeTexture(gl); + i.disposeTexture(); } }.dispose(); } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/mosaic/GLMosaicImage.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/mosaic/GLMosaicImage.java index 45a3a0dd84..08adb03de7 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/mosaic/GLMosaicImage.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/mosaic/GLMosaicImage.java @@ -24,8 +24,8 @@ import com.raytheon.uf.viz.core.DrawableImage; import com.raytheon.uf.viz.core.IExtent; import com.raytheon.uf.viz.core.drawables.ext.IMosaicImageExtension; import com.raytheon.uf.viz.core.drawables.ext.IMosaicImageExtension.IMosaicImage; -import com.raytheon.viz.core.gl.images.GLColormappedImage; import com.raytheon.viz.core.gl.images.GLDelegateImage; +import com.raytheon.viz.core.gl.images.GLOffscreenColormappedImage; /** * GL implementation of IMosaicImage, wraps an offscreen image and contains @@ -47,7 +47,7 @@ import com.raytheon.viz.core.gl.images.GLDelegateImage; * @version 1.0 */ -public class GLMosaicImage extends GLDelegateImage +public class GLMosaicImage extends GLDelegateImage implements IMosaicImage { private DrawableImage[] images; @@ -63,7 +63,7 @@ public class GLMosaicImage extends GLDelegateImage * @param image * @param extensionClass */ - public GLMosaicImage(GLColormappedImage image, int[] bounds, + public GLMosaicImage(GLOffscreenColormappedImage image, int[] bounds, IExtent imageExtent, Class extensionClass) { super(image, extensionClass); @@ -167,7 +167,7 @@ public class GLMosaicImage extends GLDelegateImage return image.getValue(x, y); } - public void setWrappedImage(GLColormappedImage wrappedImage) { + public void setWrappedImage(GLOffscreenColormappedImage wrappedImage) { this.image.dispose(); this.image = wrappedImage; } diff --git a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/mosaic/GLMosaicImageExtension.java b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/mosaic/GLMosaicImageExtension.java index 83434d90b9..e83a480737 100644 --- a/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/mosaic/GLMosaicImageExtension.java +++ b/cave/com.raytheon.viz.core.gl/src/com/raytheon/viz/core/gl/internal/ext/mosaic/GLMosaicImageExtension.java @@ -37,6 +37,7 @@ import com.raytheon.viz.core.gl.glsl.AbstractGLSLImagingExtension; import com.raytheon.viz.core.gl.glsl.GLShaderProgram; import com.raytheon.viz.core.gl.images.AbstractGLImage; import com.raytheon.viz.core.gl.images.GLColormappedImage; +import com.raytheon.viz.core.gl.images.GLOffscreenColormappedImage; /** * Extension used for rendering radar mosaic images @@ -47,9 +48,11 @@ import com.raytheon.viz.core.gl.images.GLColormappedImage; * * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Dec 16, 2011 mschenke Initial creation + * Dec 16, 2011 mschenke Initial creation * Mar 21, 2013 1806 bsteffen Update GL mosaicing to use dynamic data * format for offscreen textures. + * Oct 16, 2013 2333 mschenke Cleaned up render logic, switched to + * use GLOffscreenColormappedImage * * * @@ -60,11 +63,12 @@ import com.raytheon.viz.core.gl.images.GLColormappedImage; public class GLMosaicImageExtension extends AbstractGLSLImagingExtension implements IMosaicImageExtension { - private GLColormappedImage writeToImage; + private GLOffscreenColormappedImage writeToImage; public GLMosaicImage initializeRaster(int[] imageBounds, IExtent imageExtent, ColorMapParameters params) throws VizException { - // Since byte is the most common type of mosaic start with a byte image. It might switch later if needed. + // Since byte is the most common type of mosaic start with a byte image. + // It might switch later if needed when images to mosaic are set return new GLMosaicImage(target.getExtension( GLOffscreenRenderingExtension.class).constructOffscreenImage( ColorMapDataType.BYTE, imageBounds, params), imageBounds, @@ -80,6 +84,7 @@ public class GLMosaicImageExtension extends AbstractGLSLImagingExtension */ @Override public String getShaderProgramName() { + // Default mosaicing algorithm glsl program return "mosaicOrdered"; } @@ -96,36 +101,47 @@ public class GLMosaicImageExtension extends AbstractGLSLImagingExtension AbstractGLImage image, PixelCoverage coverage) throws VizException { if (image instanceof GLMosaicImage) { GLMosaicImage mosaicImage = (GLMosaicImage) image; + boolean drawMosaic = true; if (mosaicImage.isRepaint()) { - writeToImage = getWriteToImage(mosaicImage); - GLOffscreenRenderingExtension extension = target - .getExtension(GLOffscreenRenderingExtension.class); - try { - extension.renderOffscreen(mosaicImage, - mosaicImage.getImageExtent()); - DrawableImage[] imagesToMosaic = mosaicImage - .getImagesToMosaic(); - // Make sure images are staged before we mosaic them - ImagingSupport.prepareImages(target, imagesToMosaic); + DrawableImage[] imagesToMosaic = mosaicImage + .getImagesToMosaic(); + // Make sure images are staged before we mosaic them + ImagingSupport.prepareImages(target, imagesToMosaic); - boolean allPainted = true; - // Each image needs to draw separately due to gl issues when - // zoomed in very far, rendered parts near the corners don't - // show all the pixels for each image. Pushing and popping - // GL_TEXTURE_BIT before/after each render fixes this issue - for (DrawableImage di : imagesToMosaic) { - allPainted &= drawRasters(paintProps, di); + writeToImage = getWriteToImage(mosaicImage); + if (writeToImage != null) { + GLOffscreenRenderingExtension extension = target + .getExtension(GLOffscreenRenderingExtension.class); + try { + extension.beginOffscreenRendering(mosaicImage, + mosaicImage.getImageExtent()); + + boolean allPainted = true; + // Each image needs to draw separately due to gl issues + // when zoomed in very far, rendered parts near the + // corners don't show all the pixels for each image. + // Pushing and popping GL_TEXTURE_BIT before/after each + // render fixes this issue + for (DrawableImage di : imagesToMosaic) { + allPainted &= drawRasters(paintProps, di); + } + // Need to set repaint based on if drawing completed. + mosaicImage.setRepaint(allPainted == false); + } finally { + extension.endOffscreenRendering(); } - // Need to set repaint based on if drawing completed. - mosaicImage.setRepaint(allPainted == false); - } finally { - extension.renderOnscreen(); + writeToImage = null; + } else { + drawMosaic = false; + mosaicImage.setRepaint(true); } - writeToImage = null; } - target.drawRasters(paintProps, - new DrawableImage(mosaicImage.getWrappedImage(), coverage)); + if (drawMosaic) { + target.drawRasters(paintProps, + new DrawableImage(mosaicImage.getWrappedImage(), + coverage)); + } // Don't actually render this image now since we just did it return null; } else { @@ -138,12 +154,13 @@ public class GLMosaicImageExtension extends AbstractGLSLImagingExtension } } - private GLColormappedImage getWriteToImage(GLMosaicImage mosaicImage) - throws VizException { + private GLOffscreenColormappedImage getWriteToImage( + GLMosaicImage mosaicImage) throws VizException { ColorMapDataType neededType = null; for (DrawableImage di : mosaicImage.getImagesToMosaic()) { IImage image = di.getImage(); - if (image.getStatus() != Status.LOADED) { + if (image.getStatus() != Status.LOADED + && image.getStatus() != Status.STAGED) { continue; } if (image instanceof GLColormappedImage) { @@ -158,11 +175,17 @@ public class GLMosaicImageExtension extends AbstractGLSLImagingExtension } } } - GLColormappedImage writeTo = mosaicImage.getWrappedImage(); + + if (neededType == null) { + return null; + } + + GLOffscreenColormappedImage writeTo = mosaicImage.getWrappedImage(); if (neededType != null && neededType != writeTo.getColorMapDataType()) { GLOffscreenRenderingExtension offscreenExt = target .getExtension(GLOffscreenRenderingExtension.class); int[] dimensions = { writeTo.getWidth(), writeTo.getHeight() }; + writeTo.dispose(); writeTo = offscreenExt.constructOffscreenImage(neededType, dimensions, writeTo.getColorMapParameters()); mosaicImage.setWrappedImage(writeTo); diff --git a/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatResource.java b/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatResource.java index 44802ee05b..4b4fe8bc5e 100644 --- a/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatResource.java +++ b/cave/com.raytheon.viz.satellite/src/com/raytheon/viz/satellite/rsc/SatResource.java @@ -220,8 +220,8 @@ public class SatResource extends InterrogationResult result = null; synchronized (tileMap) { for (SatTileSetRenderable renderable : tileMap.values()) { - double rValue = renderable.interrogate(latLon); - if (Double.isNaN(rValue) == false && rValue != fillValue) { + double rValue = renderable.interrogate(latLon, fillValue); + if (Double.isNaN(rValue) == false) { result = new InterrogationResult( renderable.getSatelliteRecord(), rValue); } diff --git a/edexOsgi/com.raytheon.uf.common.colormap/src/com/raytheon/uf/common/colormap/image/ColorMapData.java b/edexOsgi/com.raytheon.uf.common.colormap/src/com/raytheon/uf/common/colormap/image/ColorMapData.java index 9833a9f715..6bf156cfa6 100644 --- a/edexOsgi/com.raytheon.uf.common.colormap/src/com/raytheon/uf/common/colormap/image/ColorMapData.java +++ b/edexOsgi/com.raytheon.uf.common.colormap/src/com/raytheon/uf/common/colormap/image/ColorMapData.java @@ -25,6 +25,8 @@ import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.nio.ShortBuffer; +import javax.measure.unit.Unit; + /** * * Container for colormap data. @@ -36,6 +38,7 @@ import java.nio.ShortBuffer; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Feb 28, 2013 bsteffen Seperate from IColorMapDataRetrievalCallback + * Oct 16, 2013 2333 mschenke Added field for specifying the unit of the data * * * @@ -48,11 +51,13 @@ public class ColorMapData { BYTE, SIGNED_BYTE, UNSIGNED_SHORT, SHORT, INT, FLOAT; } - private Buffer buffer; + private final Buffer buffer; - private int[] dimensions; + private final int[] dimensions; - private ColorMapData.ColorMapDataType dataType; + private final ColorMapData.ColorMapDataType dataType; + + private final Unit dataUnit; /** * @@ -63,6 +68,14 @@ public class ColorMapData { this(buffer, dimensions, getDataType(buffer)); } + /** + * @param dataType + * @param dataBounds + */ + public ColorMapData(ColorMapDataType dataType, int[] dimensions) { + this(getBuffer(dataType, dimensions), dimensions, dataType); + } + /** * @param buffer * @param dataBounds @@ -70,19 +83,20 @@ public class ColorMapData { */ public ColorMapData(Buffer buffer, int[] dimensions, ColorMapData.ColorMapDataType dataType) { - this.buffer = buffer; - this.dimensions = dimensions; - this.dataType = dataType; + this(buffer, dimensions, dataType, null); } /** - * @param dataType + * @param buffer * @param dataBounds + * @param dataType */ - public ColorMapData(ColorMapDataType dataType, int[] dimensions) { - this.buffer = getBuffer(dataType, dimensions); + public ColorMapData(Buffer buffer, int[] dimensions, + ColorMapData.ColorMapDataType dataType, Unit dataUnit) { + this.buffer = buffer; this.dimensions = dimensions; this.dataType = dataType; + this.dataUnit = dataUnit; } public Buffer getBuffer() { @@ -97,6 +111,10 @@ public class ColorMapData { return dataType; } + public Unit getDataUnit() { + return dataUnit; + } + public static ColorMapData.ColorMapDataType getDataType(Buffer buffer) { if (buffer instanceof FloatBuffer) { return ColorMapData.ColorMapDataType.FLOAT; diff --git a/ncep/gov.noaa.nws.ncep.viz.cloudHeight/src/gov/noaa/nws/ncep/viz/cloudHeight/CloudHeightProcesser.java b/ncep/gov.noaa.nws.ncep.viz.cloudHeight/src/gov/noaa/nws/ncep/viz/cloudHeight/CloudHeightProcesser.java index 57fcc1b5d6..4e85dbe1d4 100644 --- a/ncep/gov.noaa.nws.ncep.viz.cloudHeight/src/gov/noaa/nws/ncep/viz/cloudHeight/CloudHeightProcesser.java +++ b/ncep/gov.noaa.nws.ncep.viz.cloudHeight/src/gov/noaa/nws/ncep/viz/cloudHeight/CloudHeightProcesser.java @@ -80,6 +80,8 @@ import com.raytheon.uf.common.datastorage.records.AbstractStorageRecord; import com.raytheon.uf.common.datastorage.records.ByteDataRecord; import com.raytheon.uf.common.datastorage.records.IDataRecord; import com.raytheon.uf.common.geospatial.ISpatialEnabled; +import com.raytheon.uf.common.geospatial.interpolation.data.ByteBufferWrapper; +import com.raytheon.uf.common.geospatial.interpolation.data.UnsignedByteBufferWrapper; //import com.raytheon.viz.core.gl.dataprep.ByteDataPreparer; //import com.raytheon.viz.core.gl.dataprep.GlNumericImageData; import com.raytheon.viz.core.gl.dataformat.GLByteDataFormat; @@ -845,15 +847,11 @@ SoundingModelReader sndingMdlRdr = new SoundingModelReader( double tempDbl = Double.NaN; if (retriever != null ){ - /* Wrap the raw data of bytes into a GLByteDataFormat object */ - //TODO? GLColorMapDataFormatFactory bdff = new GLColorMapDataFormatFactory(); - //TODO? GLByteDataFormat bdf = bdff.getGLColorMapDataFormat(byteBuffer, retriever, rectangle, new int[] {maxX,maxY}); - GLByteDataFormat bdf = new GLByteDataFormat(); - ColorMapData cmd = new ColorMapData(byteBuffer, new int[] {maxX,maxY}); - GLColorMapData glColorMapData = new GLColorMapData(cmd, bdf); + /* Wrap the raw data of bytes into a ByteBufferWrapper object */ + UnsignedByteBufferWrapper bdf = new UnsignedByteBufferWrapper(byteBuffer, maxX, maxY); /*Get the actual pixel value information from the byte array */ - tempDbl = bdf.getValue( ( int )( outCoord[ 0 ] ), ( int ) ( outCoord[ 1 ] ), glColorMapData ); + tempDbl = bdf.getDataValue( ( int )( outCoord[ 0 ] ), ( int ) ( outCoord[ 1 ] )); if ( isSinglePixelNeeded ){ pixVal = new Double( (tempDbl) ); @@ -880,7 +878,7 @@ SoundingModelReader sndingMdlRdr = new SoundingModelReader( /*Generate the NxN array of pixel values*/ for ( int i = 0 ; i < newArrDimensions ; i++){ for ( int j = 0 ; j < newArrDimensions ; j++){ - arrayOfPixVal[i][j] = bdf.getValue( ( int )( squarePixelArea[i][j].xCoord ), ( int ) ( squarePixelArea[i][j].yCoord ), glColorMapData ); + arrayOfPixVal[i][j] = bdf.getDataValue( ( int )( squarePixelArea[i][j].xCoord ), ( int ) ( squarePixelArea[i][j].yCoord )); } } From a5718a7d06b4e2f2b4620dde09ca94995fc20c4e Mon Sep 17 00:00:00 2001 From: Ben Steffensmeier Date: Mon, 21 Oct 2013 13:15:02 -0500 Subject: [PATCH 02/12] Issue #2379 Fix bufrssmi null pointer exception. Former-commit-id: 7a82e94390e0f2c63ee0ad88b217341bcf1818f4 [formerly 7a82e94390e0f2c63ee0ad88b217341bcf1818f4 [formerly 1fa24e52c8d5bded0bc60f14c13e88f9c33ed895]] Former-commit-id: 02264afc300c48381d08cb19f51c4ebe8ba06a12 Former-commit-id: bc7ed15ce5e99b8a2aee3270bb10d9cf876fb963 --- .../bufrssmi/decoder/SSMIDataAdapter.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.bufrssmi/src/com/raytheon/uf/edex/plugin/bufrssmi/decoder/SSMIDataAdapter.java b/edexOsgi/com.raytheon.uf.edex.plugin.bufrssmi/src/com/raytheon/uf/edex/plugin/bufrssmi/decoder/SSMIDataAdapter.java index 39a7fb75c8..7c2030747e 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.bufrssmi/src/com/raytheon/uf/edex/plugin/bufrssmi/decoder/SSMIDataAdapter.java +++ b/edexOsgi/com.raytheon.uf.edex.plugin.bufrssmi/src/com/raytheon/uf/edex/plugin/bufrssmi/decoder/SSMIDataAdapter.java @@ -47,13 +47,14 @@ import com.raytheon.uf.edex.wmo.message.WMOHeader; * *
  * SOFTWARE HISTORY
- * Date         Ticket#    Engineer    Description
- * ------------ ---------- ----------- --------------------------
- * Mar 03, 2008 969        jkorman     Initial implementation.
- * Jul 06, 2009 2538       jsanchez    Added latitude,longitude to point data.
- * May 17, 2013 1869       bsteffen    Remove DataURI column from sat plot
- *                                     types.
- * Aug 30, 2013 2298       rjpeter     Make getPluginName abstract
+ * Date          Ticket#  Engineer    Description
+ * ------------- -------- ----------- --------------------------
+ * Mar 03, 2008  969      jkorman     Initial implementation.
+ * Jul 06, 2009  2538     jsanchez    Added latitude,longitude to point data.
+ * May 17, 2013  1869     bsteffen    Remove DataURI column from sat plot
+ *                                    types.
+ * Aug 30, 2013  2298     rjpeter     Make getPluginName abstract
+ * Oct 21, 2013  2379     bsteffen    Fix a null pointer exception.
  * 
  * 
* @@ -154,10 +155,9 @@ public class SSMIDataAdapter extends BUFRPointDataAdapter { // Extract the header data. obsData = getHeaderData(dataList); - obsData.setWmoHeader(wmoHeader.getWmoHeader()); if (obsData != null) { - + obsData.setWmoHeader(wmoHeader.getWmoHeader()); obsList = new ArrayList(); logger.debug("Created master observation for scanline"); // Now go get the point data for this obs From d60cae44fe2b55507da00540156a2c71e8c53f1f Mon Sep 17 00:00:00 2001 From: Nate Jensen Date: Mon, 21 Oct 2013 14:03:05 -0500 Subject: [PATCH 03/12] Issue #2476 fix in a better way the rare leak of local references of java args being passed to java methods Change-Id: I1424ce53cb3dea01d932af8b87ee93aa33c6241a Former-commit-id: d27635ce4bcde590284c73b199b65588c1bce1e1 [formerly d27635ce4bcde590284c73b199b65588c1bce1e1 [formerly e28dd5738aaebe4fe36779de09cb53f0f90a7744]] Former-commit-id: 98660b5ae9f37c185699928b0e780424cb64a476 Former-commit-id: 67e02cad76fa87661254723e349892d1ccb3c1ab --- .../jepp-2.3/src/jep/pyjmethod.c | 48 ++++++------------- .../jepp-2.3/src/jep/pyjobject.c | 15 ++++-- 2 files changed, 25 insertions(+), 38 deletions(-) diff --git a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjmethod.c b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjmethod.c index b8b43b36d1..8b8aaa1618 100644 --- a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjmethod.c +++ b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjmethod.c @@ -448,7 +448,6 @@ PyObject* pyjmethod_call_internal(PyJmethod_Object *self, JNIEnv *env = NULL; int pos = 0; jvalue *jargs = NULL; - int *jargTypes = NULL; // added by njensen int foundArray = 0; /* if params includes pyjarray instance */ PyThreadState *_save; @@ -478,10 +477,11 @@ PyObject* pyjmethod_call_internal(PyJmethod_Object *self, } jargs = (jvalue *) PyMem_Malloc(sizeof(jvalue) * self->lenParameters); - jargTypes = (int *) PyMem_Malloc(sizeof(int) * self->lenParameters); // ------------------------------ build jargs off python values + // added by njensen, hopefully 40 local references are enough per method call + (*env)->PushLocalFrame(env, 40); for(pos = 0; pos < self->lenParameters; pos++) { PyObject *param = NULL; int paramTypeId = -1; @@ -493,16 +493,14 @@ PyObject* pyjmethod_call_internal(PyJmethod_Object *self, param = PyTuple_GetItem(args, pos); /* borrowed */ if(PyErr_Occurred()) { /* borrowed */ - PyMem_Free(jargs); - PyMem_Free(jargTypes); - return NULL; + // changed by njensen + goto EXIT_ERROR; } pclazz = (*env)->GetObjectClass(env, paramType); if(process_java_exception(env) || !pclazz) { - PyMem_Free(jargs); - PyMem_Free(jargTypes); - return NULL; + // changed by njensen + goto EXIT_ERROR; } paramTypeId = get_jtype(env, paramType, pclazz); @@ -511,16 +509,14 @@ PyObject* pyjmethod_call_internal(PyJmethod_Object *self, if(paramTypeId == JARRAY_ID) foundArray = 1; - jargTypes[pos] = paramTypeId; jargs[pos] = convert_pyarg_jvalue(env, param, paramType, paramTypeId, pos); if(PyErr_Occurred()) { /* borrowed */ - PyMem_Free(jargs); - PyMem_Free(jargTypes); - return NULL; + // changed by njensen + goto EXIT_ERROR; } (*env)->DeleteLocalRef(env, paramType); @@ -597,10 +593,6 @@ PyObject* pyjmethod_call_internal(PyJmethod_Object *self, if(!process_java_exception(env) && obj != NULL) result = pyjarray_new(env, obj); - // added by njensen to keep memory down - if(obj != NULL) - (*env)->DeleteLocalRef(env, obj); - break; } @@ -631,10 +623,6 @@ PyObject* pyjmethod_call_internal(PyJmethod_Object *self, if(!process_java_exception(env) && obj != NULL) result = pyjobject_new_class(env, obj); - // added by njensen to keep memory down - if(obj != NULL) - (*env)->DeleteLocalRef(env, obj); - break; } @@ -665,10 +653,6 @@ PyObject* pyjmethod_call_internal(PyJmethod_Object *self, if(!process_java_exception(env) && obj != NULL) result = pyjobject_new(env, obj); - // added by njensen to keep memory down - if(obj != NULL) - (*env)->DeleteLocalRef(env, obj); - break; } @@ -934,16 +918,8 @@ PyObject* pyjmethod_call_internal(PyJmethod_Object *self, process_java_exception(env); } - // added by njensen to keep memory usage down - for(pos = 0; pos < self->lenParameters; pos++) { - if(jargs[pos].l != NULL && jargTypes[pos] != JARRAY_ID) - { - (*env)->DeleteLocalRef(env, jargs[pos].l); - } - } - PyMem_Free(jargs); - PyMem_Free(jargTypes); + (*env)->PopLocalFrame(env, NULL); // added by njensen if(PyErr_Occurred()) return NULL; @@ -963,6 +939,12 @@ PyObject* pyjmethod_call_internal(PyJmethod_Object *self, } return result; + +// added by njensen +EXIT_ERROR: + PyMem_Free(jargs); + (*env)->PopLocalFrame(env, NULL); + return NULL; } diff --git a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjobject.c b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjobject.c index 26ae6084c8..4b9feaa71f 100644 --- a/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjobject.c +++ b/nativeLib/rary.cots.jepp/jepp-2.3/src/jep/pyjobject.c @@ -779,11 +779,15 @@ static PyObject* pyjobject_numpy(PyJobject_Object *obj) { initNumpy(); resultList = PyList_New(listSize); - - floatarrayclass = (*env)->FindClass(env, "[F"); - bytearrayclass = (*env)->FindClass(env, "[B"); - intarrayclass = (*env)->FindClass(env, "[I"); - stringclass = (*env)->FindClass(env, "java/lang/String"); + + if(floatarrayclass == NULL) + floatarrayclass = (*env)->FindClass(env, "[F"); + if(bytearrayclass == NULL) + bytearrayclass = (*env)->FindClass(env, "[B"); + if(intarrayclass == NULL) + intarrayclass = (*env)->FindClass(env, "[I"); + if(stringclass == NULL) + stringclass = (*env)->FindClass(env, "java/lang/String"); for(i=0; i < listSize; i=i+1) { @@ -821,6 +825,7 @@ static PyObject* pyjobject_numpy(PyJobject_Object *obj) { } else { + Py_INCREF(Py_None); pyjob = Py_None; } PyList_SetItem(resultList, i, pyjob); From 0ea9efa8dc2af9041014832f7239bf5e73f87752 Mon Sep 17 00:00:00 2001 From: Slav Korolev Date: Tue, 22 Oct 2013 12:34:34 -0400 Subject: [PATCH 04/12] Issue #2455. Fixed error from test. Former-commit-id: 359c281b1e46952d449086943c0807cf5d5a95a4 [formerly 359c281b1e46952d449086943c0807cf5d5a95a4 [formerly 86967352eba1893eb4ec40187638bfc33d06cc21]] Former-commit-id: 981544290e70cb7fd196ff359d1518a52a86f419 Former-commit-id: 263244b6064c3756cb970afe7d87eb31797754f6 --- .../uf/viz/datadelivery/system/BandwidthComposite.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/system/BandwidthComposite.java b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/system/BandwidthComposite.java index 6a59487cd8..41221b2630 100644 --- a/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/system/BandwidthComposite.java +++ b/cave/com.raytheon.uf.viz.datadelivery/src/com/raytheon/uf/viz/datadelivery/system/BandwidthComposite.java @@ -163,6 +163,9 @@ public class BandwidthComposite extends Composite implements IApplyCancelAction Set unscheduledSubscriptions = SystemRuleManager .setAvailableBandwidth(Network.OPSNET, bandwidth); + if (unscheduledSubscriptions == null) { + return changesApplied; + } if (unscheduledSubscriptions.isEmpty()) { changesApplied = true; } else { From 4f4af2220109580a997a25923140a1bc0c13a919 Mon Sep 17 00:00:00 2001 From: Nate Jensen Date: Tue, 22 Oct 2013 12:42:41 -0500 Subject: [PATCH 05/12] Issue #2361 undo loading maps at startup Change-Id: If737fe16df0b11dbb2dd510697cba2ffaa5967a4 Former-commit-id: 5e2ebbaad856349d470a38977013f5593467a716 [formerly 5e2ebbaad856349d470a38977013f5593467a716 [formerly 15c1452f6970515d91b5bcc0c75de1679f561c87]] Former-commit-id: 938e4a307361548127d140095446d2afc56993ff Former-commit-id: d1ff15485c84d22154f30b20d07d60ee504df71f --- .../raytheon/viz/ui/personalities/awips/CAVE.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/CAVE.java b/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/CAVE.java index d745adf9f6..486dfa997d 100644 --- a/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/CAVE.java +++ b/cave/com.raytheon.viz.ui.personalities.awips/src/com/raytheon/viz/ui/personalities/awips/CAVE.java @@ -19,8 +19,6 @@ **/ package com.raytheon.viz.ui.personalities.awips; -import com.raytheon.uf.viz.core.maps.MapStore; - /** * This is the default component for CAVE that is the standard workbench with * all the perspectives. @@ -30,8 +28,9 @@ import com.raytheon.uf.viz.core.maps.MapStore; * SOFTWARE HISTORY * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * Aug 9, 2010 mschenke Initial creation - * Jul 1, 2013 2139 jsanchez Loaded map tree at cave start up. + * Aug 09, 2010 mschenke Initial creation + * Jul 01, 2013 2139 jsanchez Loaded map tree at cave start up. + * Oct 22, 2013 2361 njensen Undid 2139 fix since 2158 fixes it more efficiently * * * @@ -54,11 +53,7 @@ public class CAVE extends AbstractCAVEComponent { */ @Override protected void startInternal(String componentName) throws Exception { - // Loading Map Tree - long t = System.currentTimeMillis(); - MapStore.getMapTree(); - System.out.println("Loading Map Tree: " - + (System.currentTimeMillis() - t)); + } } From 8f1956da816122c514d2d6fa9d8996d7a974831e Mon Sep 17 00:00:00 2001 From: Lee Venable Date: Wed, 23 Oct 2013 08:25:54 -0500 Subject: [PATCH 06/12] Issue #2483 - Fixed image memory leak. Former-commit-id: a2f75e547d4fdf664fc090ac5fb191c4fe0c9345 [formerly a2f75e547d4fdf664fc090ac5fb191c4fe0c9345 [formerly b590a1d5799a94068fe9e444e40bb3819d596071]] Former-commit-id: 3d6547d644e83c065e031658f2791f2e4d29cfab Former-commit-id: 74603afd977d0faf6594979bfefb8ac2d87c4e54 --- .../ui/CollaborationGroupView.java | 45 ++++++++++++------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/CollaborationGroupView.java b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/CollaborationGroupView.java index d6692704e7..26c2fff096 100644 --- a/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/CollaborationGroupView.java +++ b/cave/com.raytheon.uf.viz.collaboration.ui/src/com/raytheon/uf/viz/collaboration/ui/CollaborationGroupView.java @@ -82,8 +82,6 @@ import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.Bundle; import com.google.common.eventbus.Subscribe; -import com.raytheon.uf.common.status.IUFStatusHandler; -import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.viz.collaboration.comm.identity.IVenueSession; import com.raytheon.uf.viz.collaboration.comm.identity.event.IRosterChangeEvent; import com.raytheon.uf.viz.collaboration.comm.provider.event.UserNicknameChangedEvent; @@ -132,6 +130,7 @@ import com.raytheon.viz.ui.views.CaveFloatingView; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * Mar 1, 2012 rferrel Initial creation + * Oct 22, 2013 #2483 lvenable Fixed image memory leak. * * * @@ -142,13 +141,8 @@ public class CollaborationGroupView extends CaveFloatingView implements LocalGroupListener, IUserSelector { public static final String ID = "com.raytheon.uf.viz.collaboration.ui.CollaborationGroupView"; - private static final transient IUFStatusHandler statusHandler = UFStatus - .getHandler(CollaborationGroupView.class); - private TreeViewer usersTreeViewer; - // private List groups; - private UsersTreeFilter usersTreeFilter; private CollaborationGroupContainer topLevel; @@ -159,14 +153,18 @@ public class CollaborationGroupView extends CaveFloatingView implements private DisplayFeedAction displayFeedAction; - // private Action pgenAction; - private Action collapseAllAction; private TreeEditor treeEditor; private Composite parent; + private Image inactiveImage = null; + + private Image activeImage = null; + + private Image pressedImage = null; + /** * @param parent */ @@ -175,6 +173,9 @@ public class CollaborationGroupView extends CaveFloatingView implements super.createPartControl(parent); this.parent = parent; this.parent.setLayout(new GridLayout()); + + createImages(); + // build the necessary actions for the view createActions(); @@ -186,6 +187,20 @@ public class CollaborationGroupView extends CaveFloatingView implements openConnection(); } + /** + * Create images. + */ + private void createImages() { + inactiveImage = AbstractUIPlugin.imageDescriptorFromPlugin( + PlatformUI.PLUGIN_ID, "$nl$/icons/full/dtool16/clear_co.gif") + .createImage(); + activeImage = AbstractUIPlugin.imageDescriptorFromPlugin( + PlatformUI.PLUGIN_ID, "$nl$/icons/full/etool16/clear_co.gif") + .createImage(); + pressedImage = new Image(Display.getCurrent(), activeImage, + SWT.IMAGE_GRAY); + } + private void openConnection() { CollaborationConnection connection = CollaborationConnection .getConnection(); @@ -221,6 +236,10 @@ public class CollaborationGroupView extends CaveFloatingView implements connection.getContactsManager().removeLocalGroupListener(this); } super.dispose(); + + inactiveImage.dispose(); + activeImage.dispose(); + pressedImage.dispose(); } /** @@ -554,14 +573,6 @@ public class CollaborationGroupView extends CaveFloatingView implements // only create the button if the text widget doesn't support one // natively - final Image inactiveImage = AbstractUIPlugin.imageDescriptorFromPlugin( - PlatformUI.PLUGIN_ID, "$nl$/icons/full/dtool16/clear_co.gif") - .createImage(); - final Image activeImage = AbstractUIPlugin.imageDescriptorFromPlugin( - PlatformUI.PLUGIN_ID, "$nl$/icons/full/etool16/clear_co.gif") - .createImage(); - final Image pressedImage = new Image(Display.getCurrent(), activeImage, - SWT.IMAGE_GRAY); final Label clearButton = new Label(comp, SWT.NONE); clearButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); From db84abd5177e46da8de59064ca23a2b931ea5854 Mon Sep 17 00:00:00 2001 From: Benjamin Phillippe Date: Mon, 21 Oct 2013 14:47:14 -0500 Subject: [PATCH 07/12] Issue #1538 Made http timeouts configurable on registry service http connections Change-Id: I2f91b713475027a3e514d0fd98605fc83bdac447 Former-commit-id: dd57ea1cd4dfbb447c38a8653185e6c8b747e63e [formerly dd57ea1cd4dfbb447c38a8653185e6c8b747e63e [formerly cf9f51098a2778f747984940a764ab5089afd231]] Former-commit-id: 2c39b78dedaa7f4bc31ea00390bb3710a2720cf4 Former-commit-id: 16b21fe41c8962f7d14a78bf305134063744d353 --- ...ytheon.uf.common.registry.ebxml.properties | 2 ++ .../services/RegistrySOAPServices.java | 21 +++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/edexOsgi/com.raytheon.uf.common.registry.ebxml/resources/com.raytheon.uf.common.registry.ebxml.properties b/edexOsgi/com.raytheon.uf.common.registry.ebxml/resources/com.raytheon.uf.common.registry.ebxml.properties index e69de29bb2..5876a0679e 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.ebxml/resources/com.raytheon.uf.common.registry.ebxml.properties +++ b/edexOsgi/com.raytheon.uf.common.registry.ebxml/resources/com.raytheon.uf.common.registry.ebxml.properties @@ -0,0 +1,2 @@ +ebxml-http-receive-timeout=40000 +ebxml-http-connection-timeout=30000 \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/services/RegistrySOAPServices.java b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/services/RegistrySOAPServices.java index 3f548c5855..e8128662f7 100644 --- a/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/services/RegistrySOAPServices.java +++ b/edexOsgi/com.raytheon.uf.common.registry.ebxml/src/com/raytheon/uf/common/registry/services/RegistrySOAPServices.java @@ -114,8 +114,25 @@ public class RegistrySOAPServices { static { proxyConfig = getProxyConfiguration(); httpClientPolicy = new HTTPClientPolicy(); - httpClientPolicy.setReceiveTimeout(15000); - httpClientPolicy.setConnectionTimeout(10000); + + try { + httpClientPolicy.setReceiveTimeout(Long.parseLong(System + .getProperty("ebxml-http-receive-timeout"))); + } catch (NumberFormatException e) { + statusHandler + .error("ebxml-http-receive-timeout not specified. Using default value of 1 minute", + e); + httpClientPolicy.setReceiveTimeout(60000); + } + try { + httpClientPolicy.setConnectionTimeout(Long.parseLong(System + .getProperty("ebxml-http-connection-timeout"))); + } catch (NumberFormatException e) { + statusHandler + .error("ebxml-http-connection-timeout not specified. Using default value of 10 seconds", + e); + httpClientPolicy.setReceiveTimeout(10000); + } httpClientPolicy.setConnection(ConnectionType.KEEP_ALIVE); httpClientPolicy.setMaxRetransmits(5); if (proxyConfig != null) { From 3eec43afdb76899ec548564a8b36dca97406e671 Mon Sep 17 00:00:00 2001 From: Benjamin Phillippe Date: Mon, 21 Oct 2013 14:34:41 -0500 Subject: [PATCH 08/12] Issue #1682 Delta script for ebxml registry query changes Change-Id: I84a3007a3c23697c333e5862d8fd4a4aba9f23a2 Former-commit-id: 0c56d5e859e28807170b4e95c81236f011868241 [formerly 0c56d5e859e28807170b4e95c81236f011868241 [formerly 9b6a0ce7404017dcd29cd0a14f0dba5d30e480b1]] Former-commit-id: 02dc390b98f0744140fd62b3fc973df6ae700927 Former-commit-id: 99b1cee6445089e878049cfb54f7c741f25dad7b --- .../registryQueryUpdate/updateQueries.sh | 5 ++++ .../registryQueryUpdate/updateQueriesSql.sql | 26 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 deltaScripts/14.2.1/registryQueryUpdate/updateQueries.sh create mode 100644 deltaScripts/14.2.1/registryQueryUpdate/updateQueriesSql.sql diff --git a/deltaScripts/14.2.1/registryQueryUpdate/updateQueries.sh b/deltaScripts/14.2.1/registryQueryUpdate/updateQueries.sh new file mode 100644 index 0000000000..63f1ee0688 --- /dev/null +++ b/deltaScripts/14.2.1/registryQueryUpdate/updateQueries.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +PSQL=/awips2/psql/bin/psql +DIR=`dirname $0` +${PSQL} -U awips -d metadata -f ${DIR}/updateQueriesSql.sql diff --git a/deltaScripts/14.2.1/registryQueryUpdate/updateQueriesSql.sql b/deltaScripts/14.2.1/registryQueryUpdate/updateQueriesSql.sql new file mode 100644 index 0000000000..c03c6ff67f --- /dev/null +++ b/deltaScripts/14.2.1/registryQueryUpdate/updateQueriesSql.sql @@ -0,0 +1,26 @@ +delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:QueryLanguage:SPARQL'; +delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:QueryLanguage:SPARQL'; + +delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:QueryLanguage:SQL-92'; +delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:QueryLanguage:SQL-92'; + +delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:QueryLanguage:XQuery'; +delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:QueryLanguage:XQuery'; + +delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:QueryLanguage:EJBQL'; +delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:QueryLanguage:EJBQL'; + +INSERT INTO ebxml.classificationnode (id,lid,objecttype,owner,versionname,code,parent,path) VALUES +('urn:oasis:names:tc:ebxml-regrep:QueryLanguage:HQL','urn:oasis:names:tc:ebxml-regrep:QueryLanguage:HQL', +'urn:oasis:names:tc:ebxml-regrep:ObjectType:RegistryObject:ClassificationNode','NCF','1','HQL', +'urn:oasis:names:tc:ebxml-regrep:classificationScheme:QueryLanguage','/urn:oasis:names:tc:ebxml-regrep:classificationScheme:QueryLanguage/HQL'); +INSERT INTO ebxml.taxonomyelementtype_classificationnode(taxonomyelementtype_id,classificationnode_id) VALUES('urn:oasis:names:tc:ebxml-regrep:classificationScheme:QueryLanguage','urn:oasis:names:tc:ebxml-regrep:QueryLanguage:HQL'); + +delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:query:ExportObject'; +delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:query:ExportObject'; + +delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:query:FindAllMyObjects'; +delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:query:FindAllMyObjects'; + +delete from ebxml.taxonomyelementtype_classificationnode where classificationnode_id='urn:oasis:names:tc:ebxml-regrep:query:ExtrinsicObjectQuery'; +delete from ebxml.classificationnode where id= 'urn:oasis:names:tc:ebxml-regrep:query:ExtrinsicObjectQuery'; From 4cc5c62aefdddf0a7f3655311579cc7737ec0142 Mon Sep 17 00:00:00 2001 From: Nate Jensen Date: Wed, 23 Oct 2013 11:40:13 -0500 Subject: [PATCH 09/12] Issue #2361 once again try to remove more common ISerializableObject Change-Id: I149fa1009b2d85b2c2f5e9247515eecb835dad09 Former-commit-id: 40d8e42b8772988e9089555a36065b3578489886 [formerly 40d8e42b8772988e9089555a36065b3578489886 [formerly 05585a1d0f9fdab55c8ad2ce83d8e979450521ba]] Former-commit-id: 4b80a31f227ddfce5223134eb20278748a514922 Former-commit-id: f782d20320befdcedbb74b705b953ca34da0a3c5 --- .../warning/gis/GeospatialDataGenerator.java | 60 ++-- ...f.common.serialization.ISerializableObject | 3 - .../acarssounding/ACARSSoundingLayer.java | 47 +-- .../acarssounding/ACARSSoundingRecord.java | 62 +--- .../acarssounding/tools/Airports.java | 18 +- ...f.common.serialization.ISerializableObject | 1 - .../binlightning/BinLightningRecord.java | 22 +- ...f.common.serialization.ISerializableObject | 1 - ...f.common.serialization.ISerializableObject | 2 - .../uf/common/dataplugin/bufrua/UAObs.java | 269 +----------------- .../common/dataplugin/bufrua/UAObsLevel.java | 18 +- ...f.common.serialization.ISerializableObject | 9 - .../dataplugin/gfe/config/ProjectionData.java | 29 +- .../gfe/db/objects/GridLocation.java | 24 +- .../gfe/db/objects/GridParmInfo.java | 6 +- .../gfe/db/objects/ParmStorageInfo.java | 5 +- .../gfe/db/objects/TimeConstraints.java | 5 +- ...f.common.serialization.ISerializableObject | 2 - .../goessounding/GOESSoundingLevel.java | 14 +- ...f.common.serialization.ISerializableObject | 2 - .../poessounding/POESSoundingLevel.java | 12 +- ...f.common.serialization.ISerializableObject | 1 - .../tcs/TropicalCycloneSummary.java | 22 +- ...f.common.serialization.ISerializableObject | 3 - .../uf/common/dataplugin/vaa/VAALocation.java | 91 +++--- .../uf/common/dataplugin/vaa/VAARecord.java | 28 +- .../uf/common/dataplugin/vaa/VAASubPart.java | 83 +++--- ...f.common.serialization.ISerializableObject | 8 - .../warning/config/DialogConfiguration.java | 33 ++- .../warning/config/WarngenConfiguration.java | 17 +- .../warning/gis/GeospatialFactory.java | 17 +- .../warning/gis/GeospatialMetadata.java | 3 +- .../warning/gis/GeospatialTime.java | 3 +- .../warning/gis/GeospatialTimeSet.java | 3 +- ...f.common.serialization.ISerializableObject | 5 - ...f.common.serialization.ISerializableObject | 2 - .../edex/plugin/mesowest/MESOWestFilter.java | 49 +--- .../mesowest/common/MESOWestRecord.java | 35 +-- 38 files changed, 237 insertions(+), 777 deletions(-) delete mode 100644 edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject delete mode 100644 edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject delete mode 100644 edexOsgi/com.raytheon.uf.common.dataplugin.bufrhdw/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject delete mode 100644 edexOsgi/com.raytheon.uf.common.dataplugin.bufrua/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject delete mode 100644 edexOsgi/com.raytheon.uf.common.dataplugin.gfe/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject delete mode 100644 edexOsgi/com.raytheon.uf.common.dataplugin.goessounding/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject delete mode 100644 edexOsgi/com.raytheon.uf.common.dataplugin.poessounding/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject delete mode 100644 edexOsgi/com.raytheon.uf.common.dataplugin.tcs/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject delete mode 100644 edexOsgi/com.raytheon.uf.common.dataplugin.vaa/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject delete mode 100644 edexOsgi/com.raytheon.uf.common.dataplugin.warning/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject delete mode 100644 edexOsgi/com.raytheon.uf.common.gridcoverage/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject delete mode 100644 edexOsgi/com.raytheon.uf.edex.plugin.mesowest/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject diff --git a/edexOsgi/com.raytheon.edex.plugin.warning/src/com/raytheon/edex/plugin/warning/gis/GeospatialDataGenerator.java b/edexOsgi/com.raytheon.edex.plugin.warning/src/com/raytheon/edex/plugin/warning/gis/GeospatialDataGenerator.java index 771a099b24..4410294e69 100644 --- a/edexOsgi/com.raytheon.edex.plugin.warning/src/com/raytheon/edex/plugin/warning/gis/GeospatialDataGenerator.java +++ b/edexOsgi/com.raytheon.edex.plugin.warning/src/com/raytheon/edex/plugin/warning/gis/GeospatialDataGenerator.java @@ -58,6 +58,7 @@ import com.raytheon.uf.common.localization.PathManagerFactory; import com.raytheon.uf.common.localization.exception.LocalizationException; import com.raytheon.uf.common.serialization.SerializationException; import com.raytheon.uf.common.serialization.SerializationUtil; +import com.raytheon.uf.common.serialization.SingleTypeJAXBManager; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; @@ -81,7 +82,8 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory; import com.vividsolutions.jts.simplify.TopologyPreservingSimplifier; /** - * TODO Add Description + * Saves off geospatial data from the maps database using the warngen + * configurations to improve performance of various operations in warngen. * *
  * 
@@ -93,6 +95,7 @@ import com.vividsolutions.jts.simplify.TopologyPreservingSimplifier;
  * Mar 29, 2012  #14691    Qinglu Lin  Added returned value of getFeArea() of 
  *                                     AreaConfiguration to areaFields List.
  * May  7, 2013  15690     Qinglu Lin  Added convertToMultiPolygon() and updated queryGeospatialData().
+ * Oct 22, 2013  2361      njensen     Use JAXBManager for XML
  * 
* * @author rjpeter @@ -100,9 +103,13 @@ import com.vividsolutions.jts.simplify.TopologyPreservingSimplifier; */ public class GeospatialDataGenerator { + private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(GeospatialDataGenerator.class); + private static final SingleTypeJAXBManager jaxb = SingleTypeJAXBManager + .createWithoutException(GeospatialTimeSet.class); + public static void generateUniqueGeospatialMetadataGeometries() { String mySite = SiteUtil.getSite(); DialogConfiguration dialogConfig = null; @@ -394,23 +401,27 @@ public class GeospatialDataGenerator { // clip against County Warning Area if (!areaSource.equalsIgnoreCase(WarningConstants.MARINE)) { String cwaSource = "cwa"; - List cwaAreaFields = new ArrayList(Arrays.asList("wfo", "gid")); + List cwaAreaFields = new ArrayList(Arrays.asList( + "wfo", "gid")); HashMap cwaMap = new HashMap( 2); cwaMap.put("wfo", new RequestConstraint(site, ConstraintType.LIKE)); - SpatialQueryResult[] cwaFeatures = SpatialQueryFactory.create().query( - cwaSource, cwaAreaFields.toArray(new String[cwaAreaFields.size()]), - null, cwaMap, SearchMode.WITHIN); + SpatialQueryResult[] cwaFeatures = SpatialQueryFactory.create() + .query(cwaSource, + cwaAreaFields.toArray(new String[cwaAreaFields + .size()]), null, cwaMap, SearchMode.WITHIN); Geometry multiPolygon = null; Geometry clippedGeom = null; for (int i = 0; i < features.length; i++) { multiPolygon = null; for (int j = 0; j < cwaFeatures.length; j++) { - clippedGeom = features[i].geometry.intersection(cwaFeatures[j].geometry); + clippedGeom = features[i].geometry + .intersection(cwaFeatures[j].geometry); if (clippedGeom instanceof GeometryCollection) { - GeometryCollection gc = (GeometryCollection)clippedGeom; + GeometryCollection gc = (GeometryCollection) clippedGeom; if (multiPolygon != null) - multiPolygon = multiPolygon.union(convertToMultiPolygon(gc)); + multiPolygon = multiPolygon + .union(convertToMultiPolygon(gc)); else multiPolygon = convertToMultiPolygon(gc); } @@ -440,7 +451,8 @@ public class GeospatialDataGenerator { /** * Convert a GeometryCollection to a MultiPolygon. - * @param gc + * + * @param gc */ private static MultiPolygon convertToMultiPolygon(GeometryCollection gc) { GeometryCollectionIterator iter = new GeometryCollectionIterator(gc); @@ -451,11 +463,11 @@ public class GeospatialDataGenerator { Object o = iter.next(); if (o instanceof MultiPolygon) { if (mp == null) - mp = (MultiPolygon)o; + mp = (MultiPolygon) o; else - mp = (MultiPolygon)mp.union((MultiPolygon)o); + mp = (MultiPolygon) mp.union((MultiPolygon) o); } else if (o instanceof Polygon) { - polygons.add((Polygon)o); + polygons.add((Polygon) o); } else if (o instanceof LineString || o instanceof Point) { LinearRing lr = null; Coordinate[] coords = null; @@ -463,12 +475,12 @@ public class GeospatialDataGenerator { Coordinate[] cs = ((LineString) o).getCoordinates(); if (cs.length < 4) { coords = new Coordinate[4]; - for (int j = 0; j< cs.length; j++) + for (int j = 0; j < cs.length; j++) coords[j] = new Coordinate(cs[j]); for (int j = cs.length; j < 4; j++) - coords[j] = new Coordinate(cs[3-j]); + coords[j] = new Coordinate(cs[3 - j]); } else { - coords = new Coordinate[cs.length+1]; + coords = new Coordinate[cs.length + 1]; for (int j = 0; j < cs.length; j++) coords[j] = new Coordinate(cs[j]); coords[cs.length] = new Coordinate(cs[0]); @@ -476,14 +488,15 @@ public class GeospatialDataGenerator { } else { coords = new Coordinate[4]; for (int i = 0; i < 4; i++) - coords[i] = ((Point)o).getCoordinate(); + coords[i] = ((Point) o).getCoordinate(); } - lr = (((Geometry)o).getFactory()).createLinearRing(coords); + lr = (((Geometry) o).getFactory()).createLinearRing(coords); Polygon poly = (new GeometryFactory()).createPolygon(lr, null); - polygons.add((Polygon)poly); + polygons.add((Polygon) poly); } else { statusHandler.handle(Priority.WARN, - "Unprocessed Geometry object: " + o.getClass().getName()); + "Unprocessed Geometry object: " + + o.getClass().getName()); } } if (mp == null && polygons.size() == 0) @@ -491,7 +504,8 @@ public class GeospatialDataGenerator { if (polygons.size() > 0) { Polygon[] p = polygons.toArray(new Polygon[0]); if (mp != null) - mp = (MultiPolygon)mp.union(new MultiPolygon(p, gc.getFactory())); + mp = (MultiPolygon) mp.union(new MultiPolygon(p, gc + .getFactory())); else mp = new MultiPolygon(p, gc.getFactory()); } @@ -560,7 +574,7 @@ public class GeospatialDataGenerator { .query(timezonePathcastTable, new String[] { timezonePathcastField }, hull, null, false, SearchMode.INTERSECTS); - + rval = new GeospatialData[timeZoneResults.length]; for (int i = 0; i < timeZoneResults.length; i++) { SpatialQueryResult result = timeZoneResults[i]; @@ -569,7 +583,7 @@ public class GeospatialDataGenerator { data.attributes = result.attributes; rval[i] = data; } - + // set time zone and area field if (timeZoneResults.length == 1) { SpatialQueryResult tz = timeZoneResults[0]; @@ -651,7 +665,7 @@ public class GeospatialDataGenerator { GeospatialTimeSet set = new GeospatialTimeSet(); set.setData(new ArrayList(times.values())); - String xml = SerializationUtil.marshalToXml(set); + String xml = jaxb.marshalToXml(set); lf = pathMgr.getLocalizationFile(context, GeospatialFactory.METADATA_FILE); diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject deleted file mode 100644 index 1aeec0c629..0000000000 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ /dev/null @@ -1,3 +0,0 @@ -com.raytheon.uf.common.dataplugin.acarssounding.ACARSSoundingRecord -com.raytheon.uf.common.dataplugin.acarssounding.ACARSSoundingLayer -com.raytheon.uf.common.dataplugin.acarssounding.tools.Airports \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/src/com/raytheon/uf/common/dataplugin/acarssounding/ACARSSoundingLayer.java b/edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/src/com/raytheon/uf/common/dataplugin/acarssounding/ACARSSoundingLayer.java index 524c0121f4..cc6b7e7fce 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/src/com/raytheon/uf/common/dataplugin/acarssounding/ACARSSoundingLayer.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/src/com/raytheon/uf/common/dataplugin/acarssounding/ACARSSoundingLayer.java @@ -30,22 +30,17 @@ import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; import com.raytheon.uf.common.geospatial.ISpatialEnabled; import com.raytheon.uf.common.geospatial.ISpatialObject; import com.raytheon.uf.common.pointdata.spatial.AircraftObsLocation; -import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.Point; /** - * TODO Add Description + * Layer for an ACARS Sounding * *
  * 
@@ -53,6 +48,7 @@ import com.vividsolutions.jts.geom.Point;
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
  * Apr 30, 2009            jkorman     Initial creation
+ * Oct 22, 2013 2361       njensen     Remove XML annotations
  * 
  * 
* @@ -62,10 +58,8 @@ import com.vividsolutions.jts.geom.Point; @Entity @Table(name = "acarssoundinglayer") -@XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize -public class ACARSSoundingLayer implements Serializable, ISerializableObject, - ISpatialEnabled { +public class ACARSSoundingLayer implements Serializable, ISpatialEnabled { private static final long serialVersionUID = 1L; @@ -81,103 +75,86 @@ public class ACARSSoundingLayer implements Serializable, ISerializableObject, // Time of the observation. @Column @DynamicSerializeElement - @XmlAttribute private Calendar timeObs; @Column(length = 32) @DynamicSerializeElement - @XmlElement private String tailNumber; @Embedded - @XmlElement @DynamicSerializeElement private AircraftObsLocation location; // Flight phase @Column @DynamicSerializeElement - @XmlElement private Integer flightPhase; // Observation air temperature in degrees Kelvin. @Column @DynamicSerializeElement - @XmlElement private Double temp; // Observation dewpoint temperature in degrees Kelvin. // Decimal(5,2) @Column @DynamicSerializeElement - @XmlElement private Double dwpt; // Relative Humidity in percent. Decimal(5,2) @Column @DynamicSerializeElement - @XmlElement private Double humidity; // Mixing ratio in Kg/Kg @Column @DynamicSerializeElement - @XmlElement private Double mixingRatio; // Observation wind direction in angular degrees. Integer @Column @DynamicSerializeElement - @XmlElement private Integer windDirection; // Observation wind speed in meters per second. // Decimal(5,2) @Column @DynamicSerializeElement - @XmlElement private Double windSpeed; // Base height of reported icing. @Column @DynamicSerializeElement - @XmlElement private Integer iceBaseHgt; // Top height of reported icing. @Column @DynamicSerializeElement - @XmlElement private Integer iceTopHgt; // Intensity of reported icing. @Column @DynamicSerializeElement - @XmlElement private Integer icing; // Base height of reported turbulence. @Column @DynamicSerializeElement - @XmlElement private Integer turbBaseHgt; // Top height of reported turbulence. @Column @DynamicSerializeElement - @XmlElement private Integer turbTopHgt; // Intensity of reported turbulence. @Column @DynamicSerializeElement - @XmlElement private Integer turbulence; // Indicated or calculated pressure. @Column @DynamicSerializeElement - @XmlElement private Double pressure; /** @@ -608,29 +585,27 @@ public class ACARSSoundingLayer implements Serializable, ISerializableObject, return false; return true; } - - public static final void main(String [] args) { - + + public static final void main(String[] args) { + ACARSSoundingLayer layerA = new ACARSSoundingLayer(); AircraftObsLocation locA = new AircraftObsLocation(); locA.setLocation(40.2, -101.5); locA.setFlightLevel(1052); layerA.setLocation(locA); layerA.setTailNumber("ABCDEF"); - + ACARSSoundingLayer layerB = new ACARSSoundingLayer(); AircraftObsLocation locB = new AircraftObsLocation(); locB.setLocation(40.2, -101.5); locB.setFlightLevel(1052); layerB.setLocation(locB); layerB.setTailNumber("ABCDEF"); - + System.out.println(layerA.hashCode()); - + System.out.println(layerB.hashCode()); - + } - - - + } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/src/com/raytheon/uf/common/dataplugin/acarssounding/ACARSSoundingRecord.java b/edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/src/com/raytheon/uf/common/dataplugin/acarssounding/ACARSSoundingRecord.java index 54f4ed92a9..b4cba89404 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/src/com/raytheon/uf/common/dataplugin/acarssounding/ACARSSoundingRecord.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/src/com/raytheon/uf/common/dataplugin/acarssounding/ACARSSoundingRecord.java @@ -20,8 +20,6 @@ package com.raytheon.uf.common.dataplugin.acarssounding; import java.util.Calendar; -import java.util.Collection; -import java.util.HashMap; import java.util.HashSet; import java.util.Set; @@ -39,15 +37,9 @@ import javax.persistence.OneToMany; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.UniqueConstraint; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; import org.hibernate.annotations.Index; -import com.raytheon.uf.common.dataplugin.IDecoderGettable; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.annotations.DataURI; import com.raytheon.uf.common.geospatial.ISpatialEnabled; @@ -71,6 +63,7 @@ import com.vividsolutions.jts.geom.Geometry; * May 07, 2013 1869 bsteffen Remove dataURI column from * PluginDataObject. * Aug 30, 2013 2298 rjpeter Make getPluginName abstract + * Oct 22, 2013 2361 njensen Remove XML annotations and IDecoderGettable * * * @@ -86,61 +79,46 @@ import com.vividsolutions.jts.geom.Geometry; */ @org.hibernate.annotations.Table(appliesTo = "acarssounding", indexes = { @Index(name = "acarssounding_refTimeIndex", columnNames = { "refTime", "forecastTime" }) }) -@XmlRootElement -@XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize public class ACARSSoundingRecord extends PluginDataObject implements - ISpatialEnabled, IDecoderGettable { + ISpatialEnabled { private static final long serialVersionUID = 1L; public static final Unit LOCATION_UNIT = NonSI.DEGREE_ANGLE; - private static final HashMap PARM_MAP = new HashMap(); - static { - PARM_MAP.put("NLAT", STA_LAT); - PARM_MAP.put("NLON", STA_LON); - } - // Time of the observation. @Column @DataURI(position = 1, embedded = true) @DynamicSerializeElement - @XmlAttribute private Calendar timeObs; @Embedded @DataURI(position = 2, embedded = true) - @XmlElement @DynamicSerializeElement private SurfaceObsLocation location; @Column(length = 32) @DynamicSerializeElement - @XmlElement private String tailNumber; // Flight phase (A[scending] D[escending]) @Column(length = 1) @DynamicSerializeElement - @XmlElement private String phase = null; // oldest observation time in this sounding @Column @DynamicSerializeElement - @XmlElement private Long oldestTime = Long.MAX_VALUE; // newest observation time in this sounding @Column @DynamicSerializeElement - @XmlElement private Long newestTime = Long.MIN_VALUE; // The level data for this observation. @OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.EAGER) - @XmlElement @DynamicSerializeElement private Set levels; @@ -345,42 +323,6 @@ public class ACARSSoundingRecord extends PluginDataObject implements } } - /** - * This class does not implement IDecoderGettable so return null. - * - * @return Always null for this class. - */ - @Override - public IDecoderGettable getDecoderGettable() { - return null; - } - - @Override - public Amount getValue(String pName) { - Amount a = null; - if ("NLAT".equals(pName)) { - a = new Amount(getLatitude(), LOCATION_UNIT); - } else if ("NLON".equals(pName)) { - a = new Amount(getLongitude(), LOCATION_UNIT); - } - return a; - } - - @Override - public Collection getValues(String paramName) { - return null; - } - - @Override - public String getString(String paramName) { - return null; - } - - @Override - public String[] getStrings(String paramName) { - return null; - } - @Override @Column @Access(AccessType.PROPERTY) diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/src/com/raytheon/uf/common/dataplugin/acarssounding/tools/Airports.java b/edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/src/com/raytheon/uf/common/dataplugin/acarssounding/tools/Airports.java index f90531526d..b988a11b11 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/src/com/raytheon/uf/common/dataplugin/acarssounding/tools/Airports.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.acarssounding/src/com/raytheon/uf/common/dataplugin/acarssounding/tools/Airports.java @@ -32,13 +32,11 @@ import javax.xml.bind.annotation.XmlRootElement; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.SerializationException; -import com.raytheon.uf.common.serialization.SerializationUtil; +import com.raytheon.uf.common.serialization.SingleTypeJAXBManager; import com.raytheon.uf.edex.decodertools.core.LatLonPoint; /** - * TODO Add Description + * Container for a list of airports read from an XML file * *
  * 
@@ -46,6 +44,7 @@ import com.raytheon.uf.edex.decodertools.core.LatLonPoint;
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
  * Apr 16, 2009            jkorman     Initial creation
+ * Oct 22, 2013 2361       njensen     Use JAXBManager for XML
  * 
  * 
* @@ -55,7 +54,7 @@ import com.raytheon.uf.edex.decodertools.core.LatLonPoint; @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) -public class Airports implements ISerializableObject { +public class Airports { private Log logger = LogFactory.getLog(getClass()); @@ -175,13 +174,14 @@ public class Airports implements ISerializableObject { Airports airports = null; try { - airports = (Airports) SerializationUtil - .jaxbUnmarshalFromXmlFile(filePath + File.separator - + fileName); + SingleTypeJAXBManager jaxb = new SingleTypeJAXBManager( + Airports.class); + airports = jaxb.unmarshalFromXmlFile(filePath + File.separator + + fileName); logger.info(String.format("%4d airports read from config.", airports.getAirport().size())); - } catch (SerializationException e) { + } catch (Exception e) { logger.error("Error unmarshaling airports ", e); } airports.createMapping(); diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject deleted file mode 100644 index 4a7fc5d8ae..0000000000 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ /dev/null @@ -1 +0,0 @@ -com.raytheon.uf.common.dataplugin.binlightning.BinLightningRecord \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/src/com/raytheon/uf/common/dataplugin/binlightning/BinLightningRecord.java b/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/src/com/raytheon/uf/common/dataplugin/binlightning/BinLightningRecord.java index 4f649f7b34..645dad3fa0 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/src/com/raytheon/uf/common/dataplugin/binlightning/BinLightningRecord.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.binlightning/src/com/raytheon/uf/common/dataplugin/binlightning/BinLightningRecord.java @@ -29,14 +29,9 @@ import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.Transient; import javax.persistence.UniqueConstraint; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlRootElement; import org.hibernate.annotations.Index; -import com.raytheon.uf.common.dataplugin.IDecoderGettable; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.annotations.DataURI; import com.raytheon.uf.common.dataplugin.binlightning.impl.LightningStrikePoint; @@ -83,6 +78,7 @@ import com.raytheon.uf.edex.decodertools.time.TimeTools; * May 07, 2013 1869 bsteffen Remove dataURI column from * PluginDataObject. * Aug 30, 2013 2298 rjpeter Make getPluginName abstract + * Oct 22, 2013 2361 njensen Removed XML annotations * * * @@ -98,9 +94,7 @@ import com.raytheon.uf.edex.decodertools.time.TimeTools; */ @org.hibernate.annotations.Table(appliesTo = BinLightningRecord.PLUGIN_NAME, indexes = { @Index(name = "binlightning_refTimeIndex", columnNames = { "refTime", "forecastTime" }) }) -@XmlRootElement @DynamicSerialize -@XmlAccessorType(XmlAccessType.NONE) public class BinLightningRecord extends PersistablePluginDataObject implements IPersistable { @@ -151,20 +145,17 @@ public class BinLightningRecord extends PersistablePluginDataObject implements @DataURI(position = 1) @Column @DynamicSerializeElement - @XmlAttribute private Calendar startTime; // Persisted value - Latest strike time in the collection. @DataURI(position = 2) @Column @DynamicSerializeElement - @XmlAttribute private Calendar stopTime; // JJG - source of lightning data @Column(length = 5) @DataURI(position = 3) - @XmlAttribute @DynamicSerializeElement private String lightSource; @@ -448,17 +439,6 @@ public class BinLightningRecord extends PersistablePluginDataObject implements this.lightSource = lightSource; } - /** - * Get the IDecoderGettable reference for this record. - * - * @return The IDecoderGettable reference for this record. Null for this - * class. - */ - @Override - public IDecoderGettable getDecoderGettable() { - return null; - } - /** * Sets the data arrays from the store. * diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.bufrhdw/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.uf.common.dataplugin.bufrhdw/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject deleted file mode 100644 index eeda105da7..0000000000 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.bufrhdw/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ /dev/null @@ -1 +0,0 @@ -com.raytheon.uf.common.dataplugin.bufrhdw.BufrHDWObs \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.bufrua/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.uf.common.dataplugin.bufrua/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject deleted file mode 100644 index 04aaf6ed76..0000000000 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.bufrua/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ /dev/null @@ -1,2 +0,0 @@ -com.raytheon.uf.common.dataplugin.bufrua.UAObs -com.raytheon.uf.common.dataplugin.bufrua.UAObsLevel diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.bufrua/src/com/raytheon/uf/common/dataplugin/bufrua/UAObs.java b/edexOsgi/com.raytheon.uf.common.dataplugin.bufrua/src/com/raytheon/uf/common/dataplugin/bufrua/UAObs.java index afc74a7de2..09c4ef931e 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.bufrua/src/com/raytheon/uf/common/dataplugin/bufrua/UAObs.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.bufrua/src/com/raytheon/uf/common/dataplugin/bufrua/UAObs.java @@ -20,21 +20,10 @@ package com.raytheon.uf.common.dataplugin.bufrua; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import javax.measure.quantity.Angle; -import javax.measure.quantity.Length; -import javax.measure.quantity.Temperature; -import javax.measure.quantity.Velocity; -import javax.measure.unit.NonSI; -import javax.measure.unit.SI; -import javax.measure.unit.Unit; import javax.persistence.Access; import javax.persistence.AccessType; import javax.persistence.Column; @@ -44,15 +33,9 @@ import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.Transient; import javax.persistence.UniqueConstraint; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; import org.hibernate.annotations.Index; -import com.raytheon.uf.common.dataplugin.IDecoderGettable; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.annotations.DataURI; import com.raytheon.uf.common.dataplugin.persist.IPersistable; @@ -63,7 +46,6 @@ import com.raytheon.uf.common.pointdata.PointDataView; import com.raytheon.uf.common.pointdata.spatial.SurfaceObsLocation; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; -import com.raytheon.uf.edex.decodertools.core.IDecoderConstants; import com.vividsolutions.jts.geom.Geometry; /** @@ -95,6 +77,7 @@ import com.vividsolutions.jts.geom.Geometry; * Jul 19, 2013 1992 bsteffen Remove redundant time columns from * bufrua. * Aug 30, 2013 2298 rjpeter Make getPluginName abstract + * Oct 22, 2013 2361 njensen Remove XML annotations and IDecoderGettable * * * @@ -110,11 +93,9 @@ import com.vividsolutions.jts.geom.Geometry; */ @org.hibernate.annotations.Table(appliesTo = UAObs.PLUGIN_NAME, indexes = { @Index(name = "bufrua_refTimeIndex", columnNames = { "refTime", "forecastTime" }) }) -@XmlRootElement -@XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize public class UAObs extends PersistablePluginDataObject implements - ISpatialEnabled, IDecoderGettable, IPointData, IPersistable { + ISpatialEnabled, IPointData, IPersistable { private static final long serialVersionUID = 1L; @@ -139,33 +120,6 @@ public class UAObs extends PersistablePluginDataObject implements public static final String PLUGIN_NAME = "bufrua"; - public static final Unit DISTANCE_UNIT = SI.METER; - - public static final Unit TEMPERATURE_UNIT = SI.KELVIN; - - public static final Unit WIND_SPEED_UNIT = SI.METERS_PER_SECOND; - - public static final Unit WIND_DIR_UNIT = NonSI.DEGREE_ANGLE; - - public static final Unit LOCATION_UNIT = NonSI.DEGREE_ANGLE; - - private static final HashMap PARM_MAP = new HashMap(); - static { - PARM_MAP.put("GH", UA_GEOHGT); - PARM_MAP.put("Px", UA_PRESSURE); - - PARM_MAP.put("T", SFC_TEMP); - PARM_MAP.put("DpT", SFC_DWPT); - - PARM_MAP.put("WS", SFC_WNDSPD); - PARM_MAP.put("WD", SFC_WNDDIR); - - PARM_MAP.put("NLAT", STA_LAT); - PARM_MAP.put("NLON", STA_LON); - } - - public static final String UA_PARAM_PTRN = ".*:PRESS=\\d{2,4}"; - // Non persisted value. Hold the last requested parameter name. @Transient private String parameterName = null; @@ -177,20 +131,17 @@ public class UAObs extends PersistablePluginDataObject implements // The observation report type. @DataURI(position = 1) @Column - @XmlAttribute @DynamicSerializeElement private Integer reportType; @Embedded @DataURI(position = 4, embedded = true) - @XmlElement @DynamicSerializeElement private SurfaceObsLocation location; // Correction indicator from wmo header @DataURI(position = 2) @Column - @XmlAttribute @DynamicSerializeElement private String corIndicator; @@ -201,48 +152,40 @@ public class UAObs extends PersistablePluginDataObject implements // Text of the WMO header @DataURI(position = 3) @Column - @XmlAttribute @DynamicSerializeElement private String wmoHeader; // Station pressure in Pascals. @Column - @XmlAttribute @DynamicSerializeElement private Integer pressure_station; // The total cloud cover in 1/8s coverage. @Column - @XmlAttribute @DynamicSerializeElement private Integer totalCloudCover; // The platform directio in angular degrees. @Column - @XmlAttribute @DynamicSerializeElement private Integer platformDirection; // The platform movement in meters per second. @Column - @XmlAttribute @DynamicSerializeElement private Double platformMovement; // ICAO of station if known. @Column - @XmlAttribute @DynamicSerializeElement private String stationName; // The level data for this observation. @Transient - @XmlElement @DynamicSerializeElement private List levels; @Column(insertable = false, updatable = false) - @XmlAttribute @DynamicSerializeElement private Integer idx; @@ -543,16 +486,6 @@ public class UAObs extends PersistablePluginDataObject implements identifier = dataURI; } - /** - * Get the IDecoderGettable reference for this record. - * - * @return The IDecoderGettable reference for this record. - */ - @Override - public IDecoderGettable getDecoderGettable() { - return this; - } - /** * */ @@ -569,203 +502,6 @@ public class UAObs extends PersistablePluginDataObject implements this.pointDataView = pointDataView; } - /** - * Get the value of a parameter that is represented as a String. - * - * @param paramName - * The name of the parameter value to retrieve. - * @return The String value of the parameter. If the parameter is unknown, a - * null reference is returned. - */ - @Override - public String getString(String paramName) { - if ("STA".matches(paramName)) { - return this.getStationId(); - } - return null; - } - - /** - * Get the value and units of a named parameter within this observation. The - * parameter name may include level information for these observation data. - * The format for parameter is: - * - *
-     *    "parameterName" may be one of 
-     *        "GH"  geopotential height
-     *        "Px"  pressure
-     *        "T"   temperature
-     *        "DpT" dewpoint
-     *        "WS"  wind speed
-     *        "WD"  wind direction
-     *    followed by a level specification ":PRESS=xxxx" where xxxx is a level
-     *    in hPa (millibars). To retrieve the temperature from the 850hPa level
-     *    use the following getValue("T:PRESS=850");
-     *    
-     *    Some data is specific to the observation, latitude/longitude for
-     *    example. These data may be retrieved using the parameter minus any level
-     *    information as follows
-     *    "NLAT"  station latitude
-     *    "NLON"  station longitude
-     * 
- * - * If the sounding data defines a surface level, and a request for a level - * below surface is requested, a null value is returned. - * - * @param paramName - * The name of the parameter value to retrieve. - * @return An Amount with value and units. If the parameter is unknown, a - * null reference is returned. - */ - @Override - public Amount getValue(String paramName) { - Amount a = null; - - if (parseParameter(paramName)) { - String pName = PARM_MAP.get(parameterName); - if ((pName != null) && (levels != null) && (levels.size() > 0)) { - - UAObsLevel obsLevel = getLevel(levelId); - if (obsLevel != null) { - Integer iValue = null; - Double dValue = null; - if (UA_GEOHGT.equals(pName)) { - iValue = obsLevel.getGeoHeight(); - if (iValue != null) { - a = new Amount(iValue, DISTANCE_UNIT); - } - } else if (SFC_TEMP.equals(pName)) { - dValue = obsLevel.getTemp(); - if (dValue != null) { - a = new Amount(dValue, TEMPERATURE_UNIT); - } - } else if (SFC_DWPT.equals(pName)) { - dValue = obsLevel.getDwpt(); - if (dValue != null) { - a = new Amount(dValue, TEMPERATURE_UNIT); - } - } else if (SFC_WNDSPD.equals(pName)) { - dValue = obsLevel.getWindSpeed(); - if (dValue != null) { - a = new Amount(dValue, WIND_SPEED_UNIT); - } - } else if (SFC_WNDDIR.equals(pName)) { - iValue = obsLevel.getWindDirection(); - if (iValue != null) { - a = new Amount(iValue, WIND_DIR_UNIT); - } - } - } - } - } else { - // Assume we are trying to get an observation attribute. - String pName = PARM_MAP.get(paramName); - if (STA_LAT.equals(pName)) { - a = new Amount(this.getLatitude(), LOCATION_UNIT); - } else if (STA_LON.equals(pName)) { - a = new Amount(this.getLongitude(), LOCATION_UNIT); - } - } - return a; - } - - /** - * Get the value of a parameter that is represented as a String. - * - * @param paramName - * The name of the parameter value to retrieve. - * @return The String value of the parameter. If the parameter is unknown, a - * null reference is returned. - */ - @Override - public Collection getValues(String paramName) { - return null; - } - - /** - * Determine if the parameter is a level request, and parse out the pressure - * level and parameter name if so. - * - * @param parameter - * The parameter string to parse. - * @return This is a level parameter. - */ - private boolean parseParameter(String parameter) { - boolean goodParse = false; - Pattern p = Pattern.compile(UA_PARAM_PTRN); - Matcher m = p.matcher(parameter); - if (m.find()) { - int start = parameter.indexOf(":PRESS="); - if (start > 0) { - parameterName = parameter.substring(0, start); - start += ":PRESS=".length(); - levelId = Integer.parseInt(parameter.substring(start)); - } - goodParse = true; - } - return goodParse; - } - - /** - * Get a specified pressure level data if it exists. If the specified level - * is below the declared surface pressure a null reference is returned. - * - * @param level - * A pressure level to get. - * @return The requested level, if found, null reference if not. - */ - private UAObsLevel getLevel(Integer level) { - UAObsLevel retValue = null; - if (level != null) { - level = level * 100; - for (UAObsLevel l : levels) { - if (IDecoderConstants.MANPRE_LEVEL.equals(l.getVertSig()) - || IDecoderConstants.SIGPRE_LEVEL - .equals(l.getVertSig())) { - - if (level.equals(l.getPressure())) { - retValue = l; - break; - } - } - } - } - if (retValue != null) { - UAObsLevel sfc = getSurfaceLevel(); - if (sfc != null) { - if (LayerTools.isLowerThan(sfc, retValue)) { - retValue = null; - } - } - } - return retValue; - } - - /** - * Get the defined surface level. If a surface level cannot be found, then - * return null. - * - * @return The surface level found, or null. - */ - private UAObsLevel getSurfaceLevel() { - UAObsLevel retValue = null; - if (levels != null) { - for (UAObsLevel level : levels) { - if (IDecoderConstants.SFC_LEVEL.equals(level.getVertSig())) { - retValue = level; - break; - } - } - } - return retValue; - } - - @Override - public String[] getStrings(String paramName) { - // TODO Auto-generated method stub - return null; - } - @Override public SurfaceObsLocation getSpatialObject() { return location; @@ -850,7 +586,6 @@ public class UAObs extends PersistablePluginDataObject implements return wmoHeader; } - @Override @Column @Access(AccessType.PROPERTY) diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.bufrua/src/com/raytheon/uf/common/dataplugin/bufrua/UAObsLevel.java b/edexOsgi/com.raytheon.uf.common.dataplugin.bufrua/src/com/raytheon/uf/common/dataplugin/bufrua/UAObsLevel.java index 2c2fbf5945..533e285222 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.bufrua/src/com/raytheon/uf/common/dataplugin/bufrua/UAObsLevel.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.bufrua/src/com/raytheon/uf/common/dataplugin/bufrua/UAObsLevel.java @@ -21,11 +21,6 @@ package com.raytheon.uf.common.dataplugin.bufrua; import java.io.Serializable; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; - -import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @@ -42,14 +37,14 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * ------------ ---------- ----------- -------------------------- * 20071127 382 jkorman Initial Coding. * 20080630 1215 jkorman Implemented Serializable. + * 20131022 2361 njensen Remove XML annotations * * * @author jkorman * @version 1.0 */ -@XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize -public class UAObsLevel implements Serializable, ISerializableObject { +public class UAObsLevel implements Serializable { private static final long serialVersionUID = 1L; @@ -63,50 +58,41 @@ public class UAObsLevel implements Serializable, ISerializableObject { // 5 Significant level, temperature and/or relative humidity // 6 Significant level, wind // All 7 Missing value - @XmlAttribute @DynamicSerializeElement private Integer vertSig = null; // Observation pressure in Pascals - @XmlAttribute @DynamicSerializeElement private Integer pressure = null; // Observation geopotential height in meters. - @XmlAttribute @DynamicSerializeElement private Integer geoHeight = null; // Observation dry air temperature in degrees Kelvin. - @XmlAttribute @DynamicSerializeElement private Double temp = null; // Observation dewpoint temperature in degrees Kelvin. - @XmlAttribute @DynamicSerializeElement private Double dwpt = null; // Observation wind direction in angular degrees. Integer - @XmlAttribute @DynamicSerializeElement private Integer windDirection = null; // Observation wind speed in meters per second. // Decimal(5,2) - @XmlAttribute @DynamicSerializeElement private Double windSpeed = null; // Observation 1 KM below level wind shear in meters per second. // Decimal(5,2) - @XmlAttribute @DynamicSerializeElement private Double loShear = null; // Observation 1 KM above level wind shear in meters per second. // Decimal(5,2) - @XmlAttribute @DynamicSerializeElement private Double hiShear = null; diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject deleted file mode 100644 index f61426db78..0000000000 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ /dev/null @@ -1,9 +0,0 @@ -com.raytheon.uf.common.dataplugin.gfe.config.ProjectionData -com.raytheon.uf.common.dataplugin.gfe.db.objects.DatabaseID -com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord -com.raytheon.uf.common.dataplugin.gfe.db.objects.GridLocation -com.raytheon.uf.common.dataplugin.gfe.db.objects.GridParmInfo -com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmID -com.raytheon.uf.common.dataplugin.gfe.db.objects.ParmStorageInfo -com.raytheon.uf.common.dataplugin.gfe.server.lock.Lock -com.raytheon.uf.common.dataplugin.gfe.GridDataHistory \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/config/ProjectionData.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/config/ProjectionData.java index e9c51e89da..2d0b1203b0 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/config/ProjectionData.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/config/ProjectionData.java @@ -27,11 +27,6 @@ import javax.persistence.Embeddable; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.Transient; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import org.geotools.coverage.grid.GeneralGridEnvelope; import org.geotools.coverage.grid.GridGeometry2D; @@ -44,9 +39,6 @@ import org.opengis.referencing.datum.PixelInCell; import org.opengis.referencing.operation.MathTransform; import com.raytheon.uf.common.geospatial.MapUtil; -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.adapters.CoordAdapter; -import com.raytheon.uf.common.serialization.adapters.PointAdapter; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.raytheon.uf.common.status.IUFStatusHandler; @@ -65,6 +57,7 @@ import com.vividsolutions.jts.geom.Coordinate; * 04/24/13 #1935 randerso Fixed date line spanning issue * 08/06/13 #1571 randerso Added hibernate annotations * Removed constructor with int for ProjectionType + * 10/22/13 #2361 njensen Remove XML annotations * * * @@ -72,9 +65,8 @@ import com.vividsolutions.jts.geom.Coordinate; * @version 1.0 */ @Embeddable -@XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize -public class ProjectionData implements ISerializableObject { +public class ProjectionData { private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(ProjectionData.class); @@ -101,68 +93,51 @@ public class ProjectionData implements ISerializableObject { }; @Column(length = 32, nullable = false) - @XmlAttribute @DynamicSerializeElement private String projectionID; @Column(length = 20, nullable = false) @Enumerated(EnumType.STRING) - @XmlAttribute @DynamicSerializeElement private ProjectionType projectionType; @Column(nullable = false) - @XmlElement - @XmlJavaTypeAdapter(value = CoordAdapter.class) @DynamicSerializeElement private Coordinate latLonLL; @Column(nullable = false) - @XmlElement - @XmlJavaTypeAdapter(value = CoordAdapter.class) @DynamicSerializeElement private Coordinate latLonUR; @Column(nullable = false) - @XmlElement - @XmlJavaTypeAdapter(value = CoordAdapter.class) @DynamicSerializeElement private Coordinate latLonOrigin; @Column(nullable = false) - @XmlAttribute @DynamicSerializeElement private double stdParallelOne; @Column(nullable = false) - @XmlAttribute @DynamicSerializeElement private double stdParallelTwo; @Column(nullable = false) - @XmlElement - @XmlJavaTypeAdapter(value = PointAdapter.class) @DynamicSerializeElement private Point gridPointLL; @Column(nullable = false) - @XmlElement - @XmlJavaTypeAdapter(value = PointAdapter.class) @DynamicSerializeElement private Point gridPointUR; @Column(nullable = false) - @XmlAttribute @DynamicSerializeElement private double latIntersect; @Column(nullable = false) - @XmlAttribute @DynamicSerializeElement private double lonCenter; @Column(nullable = false) - @XmlAttribute @DynamicSerializeElement private double lonOrigin; diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/GridLocation.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/GridLocation.java index c62feb51ed..f55048c570 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/GridLocation.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/GridLocation.java @@ -36,11 +36,6 @@ import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.Transient; import javax.persistence.UniqueConstraint; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import jep.INumpyable; @@ -73,9 +68,6 @@ import com.raytheon.uf.common.geospatial.CRSCache; import com.raytheon.uf.common.geospatial.IGridGeometryProvider; import com.raytheon.uf.common.geospatial.ISpatialObject; import com.raytheon.uf.common.geospatial.MapUtil; -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.adapters.CoordAdapter; -import com.raytheon.uf.common.serialization.adapters.GeometryAdapter; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.raytheon.uf.common.status.IUFStatusHandler; @@ -106,6 +98,7 @@ import com.vividsolutions.jts.simplify.TopologyPreservingSimplifier; * 08/06/13 #1571 randerso Added hibernate annotations, javadoc cleanup, * made init method public for use in GFEDao * 09/30/13 #2333 mschenke Added method to construct from {@link IGridGeometryProvider} + * 10/22/13 #2361 njensen Remove XML annotations * * * @@ -115,10 +108,9 @@ import com.vividsolutions.jts.simplify.TopologyPreservingSimplifier; */ @Entity @Table(name = "gfe_gridlocation", uniqueConstraints = { @UniqueConstraint(columnNames = { "dbId_id" }) }) -@XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize public class GridLocation extends PersistableDataObject implements - ISpatialObject, ISerializableObject { + ISpatialObject { private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(GridLocation.class); @@ -177,24 +169,20 @@ public class GridLocation extends PersistableDataObject implements private DatabaseID dbId; @Column(length = 8, nullable = false) - @XmlAttribute @DynamicSerializeElement private String siteId; /** Number of points along the x-axis */ @Column(nullable = false) - @XmlAttribute @DynamicSerializeElement protected Integer nx; /** Number of points along the y-axis */ @Column(nullable = false) - @XmlAttribute @DynamicSerializeElement protected Integer ny; @Column(length = 32, nullable = false) - @XmlAttribute @DynamicSerializeElement private String timeZone; @@ -202,30 +190,22 @@ public class GridLocation extends PersistableDataObject implements private Coordinate gridCellSize; @Embedded - @XmlElement @DynamicSerializeElement private ProjectionData projection; @Column(nullable = false) - @XmlElement - @XmlJavaTypeAdapter(value = CoordAdapter.class) @DynamicSerializeElement private Coordinate origin; @Column(nullable = false) - @XmlElement - @XmlJavaTypeAdapter(value = CoordAdapter.class) @DynamicSerializeElement private Coordinate extent; @Transient - @XmlElement - @XmlJavaTypeAdapter(value = GeometryAdapter.class) @DynamicSerializeElement private Polygon geometry; @Transient - @XmlElement @DynamicSerializeElement private String crsWKT; diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/GridParmInfo.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/GridParmInfo.java index 43f3fd00c3..b5452b72ac 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/GridParmInfo.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/GridParmInfo.java @@ -45,7 +45,6 @@ import org.hibernate.annotations.OnDeleteAction; import com.raytheon.uf.common.dataplugin.gfe.db.objects.GFERecord.GridType; import com.raytheon.uf.common.dataplugin.gfe.discrete.DiscreteKey; -import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.raytheon.uf.common.status.IUFStatusHandler; @@ -67,6 +66,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * added isValid method to match A1 * 04/02/2013 #1774 randerso Improved error message in validCheck * 08/06/13 #1571 randerso Added hibernate annotations, javadoc cleanup + * 10/22/2013 #2361 njensen Remove ISerializableObject * * * @@ -76,9 +76,11 @@ import com.raytheon.uf.common.status.UFStatus.Priority; @Embeddable @DynamicSerialize -public class GridParmInfo implements Cloneable, ISerializableObject { +public class GridParmInfo implements Cloneable { + private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(GridParmInfo.class); + static { // TODO: is this the right place for these? diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/ParmStorageInfo.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/ParmStorageInfo.java index 193da9a784..8fc4a079f9 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/ParmStorageInfo.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/ParmStorageInfo.java @@ -31,8 +31,6 @@ import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.UniqueConstraint; -import com.raytheon.uf.common.serialization.ISerializableObject; - /** * Derived class that consolidates storage info for a Parm. * @@ -44,6 +42,7 @@ import com.raytheon.uf.common.serialization.ISerializableObject; * 08/05/2013 #1571 randerso Moved to com.raytheon.uf.common.dataplugin * Added GridParmInfo as a field. * Added hibernate annotations + * 10/22/2013 #2361 njensen Remove ISerializableObject * * * @@ -53,7 +52,7 @@ import com.raytheon.uf.common.serialization.ISerializableObject; @Entity @Table(name = "gfe_parminfo", uniqueConstraints = { @UniqueConstraint(columnNames = { "parmId_id" }) }) -public class ParmStorageInfo implements ISerializableObject { +public class ParmStorageInfo { /** * Auto-generated surrogate key diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/TimeConstraints.java b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/TimeConstraints.java index 9b984825d8..9e1387efcb 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/TimeConstraints.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.gfe/src/com/raytheon/uf/common/dataplugin/gfe/db/objects/TimeConstraints.java @@ -27,7 +27,6 @@ import javax.persistence.Column; import javax.persistence.Embeddable; import com.raytheon.uf.common.dataplugin.gfe.serialize.TimeConstraintsAdapter; -import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeTypeAdapter; @@ -47,6 +46,7 @@ import com.raytheon.uf.common.time.util.TimeUtil; * 03/20/2013 #1774 randerso Added isValid method, use TimeUtil constants, * added serialization adapter, removed setters. * 08/06/13 #1571 randerso Added hibernate annotations, javadoc cleanup + * 10/22/2013 #2361 njensen Remove ISerializableObject * * * @@ -57,7 +57,8 @@ import com.raytheon.uf.common.time.util.TimeUtil; @Embeddable @DynamicSerialize @DynamicSerializeTypeAdapter(factory = TimeConstraintsAdapter.class) -public class TimeConstraints implements ISerializableObject { +public class TimeConstraints { + private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(TimeConstraints.class); diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.goessounding/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.uf.common.dataplugin.goessounding/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject deleted file mode 100644 index efef19c8b4..0000000000 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.goessounding/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ /dev/null @@ -1,2 +0,0 @@ -com.raytheon.uf.common.dataplugin.goessounding.GOESSounding -com.raytheon.uf.common.dataplugin.goessounding.GOESSoundingLevel \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.goessounding/src/com/raytheon/uf/common/dataplugin/goessounding/GOESSoundingLevel.java b/edexOsgi/com.raytheon.uf.common.dataplugin.goessounding/src/com/raytheon/uf/common/dataplugin/goessounding/GOESSoundingLevel.java index d184e87a61..0e68c26727 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.goessounding/src/com/raytheon/uf/common/dataplugin/goessounding/GOESSoundingLevel.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.goessounding/src/com/raytheon/uf/common/dataplugin/goessounding/GOESSoundingLevel.java @@ -22,11 +22,7 @@ package com.raytheon.uf.common.dataplugin.goessounding; import java.io.Serializable; import javax.persistence.Column; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @@ -37,7 +33,8 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * SOFTWARE HISTORY * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- - * 20080414 1077 jkorman Initial implementation. + * 20080414 1077 jkorman Initial implementation.' + * 20132022 2361 njensen Remove XML annotations * * * @@ -45,28 +42,23 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * @version 1.0 */ @DynamicSerialize -@XmlAccessorType(XmlAccessType.NONE) -public class GOESSoundingLevel implements Serializable, ISerializableObject { +public class GOESSoundingLevel implements Serializable { private static final long serialVersionUID = 1L; @Column - @XmlAttribute @DynamicSerializeElement private Integer pressure; @Column - @XmlAttribute @DynamicSerializeElement private Double temperature; @Column - @XmlAttribute @DynamicSerializeElement private Double dewpoint; @Column - @XmlAttribute @DynamicSerializeElement private Integer height; diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.poessounding/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.uf.common.dataplugin.poessounding/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject deleted file mode 100644 index 23a813ba5d..0000000000 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.poessounding/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ /dev/null @@ -1,2 +0,0 @@ -com.raytheon.uf.common.dataplugin.poessounding.POESSounding -com.raytheon.uf.common.dataplugin.poessounding.POESSoundingLevel \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.poessounding/src/com/raytheon/uf/common/dataplugin/poessounding/POESSoundingLevel.java b/edexOsgi/com.raytheon.uf.common.dataplugin.poessounding/src/com/raytheon/uf/common/dataplugin/poessounding/POESSoundingLevel.java index 9e6fd7031c..e33f2dd8e1 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.poessounding/src/com/raytheon/uf/common/dataplugin/poessounding/POESSoundingLevel.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.poessounding/src/com/raytheon/uf/common/dataplugin/poessounding/POESSoundingLevel.java @@ -21,11 +21,6 @@ package com.raytheon.uf.common.dataplugin.poessounding; import java.io.Serializable; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; - -import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; @@ -37,6 +32,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * Date Ticket# Engineer Description * ------------ ---------- ----------- -------------------------- * 20080303 1026 jkorman Initial implementation. + * 20131022 2361 njensen Remove XML annotations * * * @@ -44,20 +40,16 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; * @version 1.0 */ @DynamicSerialize -@XmlAccessorType(XmlAccessType.NONE) -public class POESSoundingLevel implements Serializable, ISerializableObject { +public class POESSoundingLevel implements Serializable { private static final long serialVersionUID = 1L; - @XmlAttribute @DynamicSerializeElement private Integer pressure; - @XmlAttribute @DynamicSerializeElement private Double temperature; - @XmlAttribute @DynamicSerializeElement private Double mixingRatio; diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.tcs/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.uf.common.dataplugin.tcs/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject deleted file mode 100644 index 3ba4da8d0c..0000000000 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.tcs/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ /dev/null @@ -1 +0,0 @@ -com.raytheon.uf.common.dataplugin.tcs.TropicalCycloneSummary \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.tcs/src/com/raytheon/uf/common/dataplugin/tcs/TropicalCycloneSummary.java b/edexOsgi/com.raytheon.uf.common.dataplugin.tcs/src/com/raytheon/uf/common/dataplugin/tcs/TropicalCycloneSummary.java index 89ae09e699..8d5816ff6e 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.tcs/src/com/raytheon/uf/common/dataplugin/tcs/TropicalCycloneSummary.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.tcs/src/com/raytheon/uf/common/dataplugin/tcs/TropicalCycloneSummary.java @@ -31,14 +31,9 @@ import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.Transient; import javax.persistence.UniqueConstraint; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; import org.hibernate.annotations.Index; -import com.raytheon.uf.common.dataplugin.IDecoderGettable; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.annotations.DataURI; import com.raytheon.uf.common.dataplugin.persist.PersistablePluginDataObject; @@ -65,6 +60,7 @@ import com.vividsolutions.jts.geom.Geometry; * May 07, 2013 1869 bsteffen Remove dataURI column from * PluginDataObject. * Aug 30, 2013 2298 rjpeter Make getPluginName abstract + * Oct 22, 2013 2361 njensen Remove XML annotations * * * @@ -80,8 +76,6 @@ import com.vividsolutions.jts.geom.Geometry; */ @org.hibernate.annotations.Table(appliesTo = "tcs", indexes = { @Index(name = "tcs_refTimeIndex", columnNames = { "refTime", "forecastTime" }) }) -@XmlRootElement -@XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize public class TropicalCycloneSummary extends PersistablePluginDataObject implements ISpatialEnabled, IPointData { @@ -94,11 +88,9 @@ public class TropicalCycloneSummary extends PersistablePluginDataObject // Text of the WMO header @Transient - @XmlElement @DynamicSerializeElement private String wmoHeader = ""; - @XmlElement @DynamicSerializeElement @Column @DataURI(position = 1) @@ -106,36 +98,29 @@ public class TropicalCycloneSummary extends PersistablePluginDataObject @Embedded @DataURI(position = 2, embedded = true) - @XmlElement @DynamicSerializeElement private SurfaceObsLocation location; - @XmlElement @DynamicSerializeElement @Transient protected String name; - @XmlElement @DynamicSerializeElement @Transient private boolean tropical; - @XmlElement @DynamicSerializeElement @Transient private String displayTime; - @XmlElement @DynamicSerializeElement @Transient private int pressure; - @XmlElement @DynamicSerializeElement @Transient protected int windSpeed; - @XmlElement @DynamicSerializeElement @Transient protected ArrayList radiusList; @@ -199,11 +184,6 @@ public class TropicalCycloneSummary extends PersistablePluginDataObject identifier = dataURI; } - @Override - public IDecoderGettable getDecoderGettable() { - return null; - } - @Override public SurfaceObsLocation getSpatialObject() { return location; diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.vaa/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.uf.common.dataplugin.vaa/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject deleted file mode 100644 index 6c10e4593a..0000000000 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.vaa/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ /dev/null @@ -1,3 +0,0 @@ -com.raytheon.uf.common.dataplugin.vaa.VAARecord -com.raytheon.uf.common.dataplugin.vaa.VAASubPart -com.raytheon.uf.common.dataplugin.vaa.VAALocation \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.vaa/src/com/raytheon/uf/common/dataplugin/vaa/VAALocation.java b/edexOsgi/com.raytheon.uf.common.dataplugin.vaa/src/com/raytheon/uf/common/dataplugin/vaa/VAALocation.java index f773da1e6a..2dd1df4aab 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.vaa/src/com/raytheon/uf/common/dataplugin/vaa/VAALocation.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.vaa/src/com/raytheon/uf/common/dataplugin/vaa/VAALocation.java @@ -28,64 +28,56 @@ import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; /** - * TODO Add Description + * Location for a VAARecord * *
- *
+ * 
  * SOFTWARE HISTORY
- *
+ * 
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
  * Nov 17, 2009            jkorman     Initial creation
- *
+ * Oct 22, 2013 2361       njensen     Remove XML annotations
+ * 
  * 
- * + * * @author jkorman - * @version 1.0 + * @version 1.0 */ @Entity -@Table(name="vaa_location") -@XmlAccessorType(XmlAccessType.NONE) +@Table(name = "vaa_location") @DynamicSerialize -public class VAALocation implements Serializable, ISerializableObject { +public class VAALocation implements Serializable { private static final long serialVersionUID = 1L; - + @Id @GeneratedValue private Integer recordId = null; - // + // @ManyToOne - @JoinColumn(name="parentId", nullable=false) + @JoinColumn(name = "parentId", nullable = false) private VAASubPart parentId; - // Point latitude @Column - @XmlElement @DynamicSerializeElement private double latitude; // Point longitude @Column - @XmlElement @DynamicSerializeElement - private double longitude; - + private double longitude; + // Position index. These points are kept in a set. Order // is not preserved. @Column - @XmlElement @DynamicSerializeElement private Integer index; @@ -95,50 +87,52 @@ public class VAALocation implements Serializable, ISerializableObject { public VAALocation() { // Empty constructor for bean operations } - + /** * * @param lat * @param lon * @param index */ - public VAALocation(double lat, double lon,int index, VAASubPart parent) { + public VAALocation(double lat, double lon, int index, VAASubPart parent) { latitude = lat; longitude = lon; this.index = index; parentId = parent; } - + /** * Get the record id. - * + * * @return The recordId. If not set returns null. */ - public Integer getRecordId() { + public Integer getRecordId() { return recordId; } - /** - * Set the record id. - * @param record - */ - public void setRecordId(Integer recordId) { + /** + * Set the record id. + * + * @param record + */ + public void setRecordId(Integer recordId) { this.recordId = recordId; } - /** - * @return the parentID - */ - public VAASubPart getParentId() { - return parentId; - } + /** + * @return the parentID + */ + public VAASubPart getParentId() { + return parentId; + } - /** - * @param parentID the parentID to set - */ - public void setParentId(VAASubPart parent) { - this.parentId = parent; - } + /** + * @param parentID + * the parentID to set + */ + public void setParentId(VAASubPart parent) { + this.parentId = parent; + } /** * @return the latitude @@ -148,7 +142,8 @@ public class VAALocation implements Serializable, ISerializableObject { } /** - * @param latitude the latitude to set + * @param latitude + * the latitude to set */ public void setLatitude(double latitude) { this.latitude = latitude; @@ -162,7 +157,8 @@ public class VAALocation implements Serializable, ISerializableObject { } /** - * @param longitude the longitude to set + * @param longitude + * the longitude to set */ public void setLongitude(double longitude) { this.longitude = longitude; @@ -176,7 +172,8 @@ public class VAALocation implements Serializable, ISerializableObject { } /** - * @param index the index to set + * @param index + * the index to set */ public void setIndex(Integer index) { this.index = index; diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.vaa/src/com/raytheon/uf/common/dataplugin/vaa/VAARecord.java b/edexOsgi/com.raytheon.uf.common.dataplugin.vaa/src/com/raytheon/uf/common/dataplugin/vaa/VAARecord.java index b3d62641c8..39da6ebbf4 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.vaa/src/com/raytheon/uf/common/dataplugin/vaa/VAARecord.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.vaa/src/com/raytheon/uf/common/dataplugin/vaa/VAARecord.java @@ -33,14 +33,9 @@ import javax.persistence.OneToMany; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.UniqueConstraint; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; import org.hibernate.annotations.Index; -import com.raytheon.uf.common.dataplugin.IDecoderGettable; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.annotations.DataURI; import com.raytheon.uf.common.geospatial.ISpatialEnabled; @@ -50,7 +45,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.vividsolutions.jts.geom.Geometry; /** - * + * Record for Volcanic Ash Advisory * *
  * 
@@ -64,8 +59,8 @@ import com.vividsolutions.jts.geom.Geometry;
  * Apr 12, 2013 1857       bgonzale    Added SequenceGenerator annotation.
  * May 07, 2013 1869       bsteffen    Remove dataURI column from
  * Aug 30, 2013 2298       rjpeter     Make getPluginName abstract
- * 
  *                                     PluginDataObject.
+ * Oct 22, 2013 2361       njensen     Remove XML annotations
  * 
  * 
* @@ -82,8 +77,6 @@ import com.vividsolutions.jts.geom.Geometry; */ @org.hibernate.annotations.Table(appliesTo = "vaa", indexes = { @Index(name = "vaa_refTimeIndex", columnNames = { "refTime", "forecastTime" }) }) -@XmlRootElement -@XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize public class VAARecord extends PluginDataObject implements ISpatialEnabled { @@ -91,7 +84,6 @@ public class VAARecord extends PluginDataObject implements ISpatialEnabled { @Embedded @DataURI(position = 1, embedded = true) - @XmlElement @DynamicSerializeElement private SurfaceObsLocation location; @@ -100,7 +92,6 @@ public class VAARecord extends PluginDataObject implements ISpatialEnabled { */ @Column(length = 8) @DataURI(position = 2) - @XmlElement @DynamicSerializeElement private String recordType; @@ -109,19 +100,16 @@ public class VAARecord extends PluginDataObject implements ISpatialEnabled { */ @Column(length = 16) @DataURI(position = 3) - @XmlElement @DynamicSerializeElement private String advisoryNumber; // Correction indicator from wmo header @DataURI(position = 4) @Column(length = 8) - @XmlElement @DynamicSerializeElement private String corIndicator; @Column(length = 32) - @XmlElement @DynamicSerializeElement private String centerId; @@ -129,7 +117,6 @@ public class VAARecord extends PluginDataObject implements ISpatialEnabled { * */ @Column(length = 2048) - @XmlElement @DynamicSerializeElement private String message; @@ -137,7 +124,6 @@ public class VAARecord extends PluginDataObject implements ISpatialEnabled { * */ @Column(length = 512) - @XmlElement @DynamicSerializeElement private String anal00Hr; @@ -145,7 +131,6 @@ public class VAARecord extends PluginDataObject implements ISpatialEnabled { * */ @Column(length = 512) - @XmlElement @DynamicSerializeElement private String fcst06Hr; @@ -153,7 +138,6 @@ public class VAARecord extends PluginDataObject implements ISpatialEnabled { * */ @Column(length = 512) - @XmlElement @DynamicSerializeElement private String fcst12Hr; @@ -161,18 +145,15 @@ public class VAARecord extends PluginDataObject implements ISpatialEnabled { * */ @Column(length = 512) - @XmlElement @DynamicSerializeElement private String fcst18Hr; // Text of the WMO header @Column(length = 64) - @XmlElement @DynamicSerializeElement private String wmoHeader = ""; @DynamicSerializeElement - @XmlElement @OneToMany(cascade = CascadeType.ALL, mappedBy = "parentId", fetch = FetchType.EAGER) private Set subParts = new HashSet(); @@ -236,11 +217,6 @@ public class VAARecord extends PluginDataObject implements ISpatialEnabled { this.wmoHeader = wmoHeader; } - @Override - public IDecoderGettable getDecoderGettable() { - return null; - } - @Override public SurfaceObsLocation getSpatialObject() { return location; diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.vaa/src/com/raytheon/uf/common/dataplugin/vaa/VAASubPart.java b/edexOsgi/com.raytheon.uf.common.dataplugin.vaa/src/com/raytheon/uf/common/dataplugin/vaa/VAASubPart.java index 316e355e72..a023c8b509 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.vaa/src/com/raytheon/uf/common/dataplugin/vaa/VAASubPart.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.vaa/src/com/raytheon/uf/common/dataplugin/vaa/VAASubPart.java @@ -33,72 +33,62 @@ import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import com.raytheon.uf.common.serialization.ISerializableObject; import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; /** - * TODO Add Description + * SubPart of a VAARecord * *
- *
+ * 
  * SOFTWARE HISTORY
- *
+ * 
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
  * Nov 17, 2009            jkorman     Initial creation
- *
+ * Oct 22, 2013 2361       njensen     Remove XML annotations
+ * 
  * 
- * + * * @author jkorman - * @version 1.0 + * @version 1.0 */ @Entity -@Table(name="vaa_subpart") -@XmlAccessorType(XmlAccessType.NONE) +@Table(name = "vaa_subpart") @DynamicSerialize -public class VAASubPart implements Serializable, ISerializableObject { +public class VAASubPart implements Serializable { private static final long serialVersionUID = 1L; - + @Id @GeneratedValue private Integer recordId = null; - // The record this object belongs to + // The record this object belongs to @ManyToOne - @JoinColumn(name="parentId", nullable=false) + @JoinColumn(name = "parentId", nullable = false) private VAARecord parentId; - + @Column(length = 32) - @XmlElement @DynamicSerializeElement - private String subText; - + private String subText; + /** - * Shape of ash area - * "LINE" : - * "AREA" - * + * Shape of ash area "LINE" : "AREA" + * */ @Column(length = 8) - @XmlElement @DynamicSerializeElement - private String shapeType; - - /** + private String shapeType; + + /** * Vertex locations */ @DynamicSerializeElement - @XmlElement @OneToMany(cascade = CascadeType.ALL, mappedBy = "parentId", fetch = FetchType.EAGER) private Set locations = new HashSet(); - /** * @return the parentID */ @@ -107,7 +97,8 @@ public class VAASubPart implements Serializable, ISerializableObject { } /** - * @param parentID the parentID to set + * @param parentID + * the parentID to set */ public void setParentId(VAARecord parentID) { this.parentId = parentID; @@ -115,21 +106,22 @@ public class VAASubPart implements Serializable, ISerializableObject { /** * Get the record id. - * + * * @return The recordId. If not set returns null. */ - public Integer getRecordId() { + public Integer getRecordId() { return recordId; } - /** - * Set the record id. - * @param record - */ + /** + * Set the record id. + * + * @param record + */ public void setRecordId(Integer recordId) { this.recordId = recordId; } - + /** * @return the subText */ @@ -138,7 +130,8 @@ public class VAASubPart implements Serializable, ISerializableObject { } /** - * @param subText the subText to set + * @param subText + * the subText to set */ public void setSubText(String subText) { this.subText = subText; @@ -152,17 +145,18 @@ public class VAASubPart implements Serializable, ISerializableObject { } /** - * @param shapeType the shapeType to set + * @param shapeType + * the shapeType to set */ public void setShapeType(String shapeType) { this.shapeType = shapeType; } public void addVertex(double lat, double lon, int index) { - if(locations == null) { + if (locations == null) { locations = new HashSet(); } - locations.add(new VAALocation(lat,lon,index,this)); + locations.add(new VAALocation(lat, lon, index, this)); } /** @@ -173,10 +167,11 @@ public class VAASubPart implements Serializable, ISerializableObject { } /** - * @param locations the locations to set + * @param locations + * the locations to set */ public void setLocations(Set locations) { - for(VAALocation loc : locations) { + for (VAALocation loc : locations) { loc.setParentId(this); } this.locations = locations; diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject deleted file mode 100644 index 04a1422726..0000000000 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject +++ /dev/null @@ -1,8 +0,0 @@ -com.raytheon.uf.common.dataplugin.warning.AbstractWarningRecord -com.raytheon.uf.common.dataplugin.warning.WarningRecord -com.raytheon.uf.common.dataplugin.warning.PracticeWarningRecord -com.raytheon.uf.common.dataplugin.warning.config.WarngenConfiguration -com.raytheon.uf.common.dataplugin.warning.config.DialogConfiguration -com.raytheon.uf.common.dataplugin.warning.gis.GeospatialMetadata -com.raytheon.uf.common.dataplugin.warning.gis.GeospatialTime -com.raytheon.uf.common.dataplugin.warning.gis.GeospatialTimeSet \ No newline at end of file diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/DialogConfiguration.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/DialogConfiguration.java index 5b42c2e530..e0d2d4826e 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/DialogConfiguration.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/DialogConfiguration.java @@ -10,12 +10,33 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import com.raytheon.uf.common.dataplugin.warning.util.FileUtil; -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.SerializationUtil; +import com.raytheon.uf.common.serialization.SingleTypeJAXBManager; + +/** + * + * Configuration for warngen dialog + * + *
+ * 
+ *    SOFTWARE HISTORY
+ *   
+ *    Date         Ticket#     Engineer    Description
+ *    ------------ ----------  ----------- --------------------------
+ *    --/--/----                           Initial creation
+ *    10/22/2013   2361        njensen     Use JAXBManager for XML
+ * 
+ * 
+ * + * + */ @XmlAccessorType(XmlAccessType.NONE) @XmlRootElement(name = "configuration") -public class DialogConfiguration implements ISerializableObject { +public class DialogConfiguration { + + private static final SingleTypeJAXBManager jaxb = SingleTypeJAXBManager + .createWithoutException(DialogConfiguration.class); + @XmlElement private String warngenOfficeShort; @@ -39,14 +60,14 @@ public class DialogConfiguration implements ISerializableObject { @XmlElement private long followupListRefeshDelay; - + @XmlElement private GridSpacing gridSpacing; public static DialogConfiguration loadDialogConfig(String localSite) throws FileNotFoundException, IOException, JAXBException { String xml = FileUtil.open("config.xml", localSite); - return (DialogConfiguration) SerializationUtil.unmarshalFromXml(xml); + return (DialogConfiguration) jaxb.unmarshalFromXml(xml); } public String getWarngenOfficeShort() { @@ -120,5 +141,5 @@ public class DialogConfiguration implements ISerializableObject { public void setGridSpacing(GridSpacing gridSpacing) { this.gridSpacing = gridSpacing; } - + } diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/WarngenConfiguration.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/WarngenConfiguration.java index 948179a85f..e85909ace0 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/WarngenConfiguration.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/config/WarngenConfiguration.java @@ -41,8 +41,7 @@ import javax.xml.bind.annotation.XmlRootElement; import com.raytheon.uf.common.dataplugin.warning.WarningRecord.WarningAction; import com.raytheon.uf.common.dataplugin.warning.config.AreaSourceConfiguration.AreaType; import com.raytheon.uf.common.dataplugin.warning.util.FileUtil; -import com.raytheon.uf.common.serialization.ISerializableObject; -import com.raytheon.uf.common.serialization.SerializationUtil; +import com.raytheon.uf.common.serialization.SingleTypeJAXBManager; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; import com.raytheon.uf.common.status.UFStatus.Priority; @@ -60,6 +59,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority; * Aug 26, 2008 #1502 bclement Added JAXB annotations * May 26, 2010 #4649 Qinglu Lin Made including TO.A and SV.A mandatory * Apr 24, 2013 1943 jsanchez Marked areaConfig as Deprecated. + * Oct 22, 2013 2361 njensen Removed ISerializableObject * * * @@ -68,11 +68,15 @@ import com.raytheon.uf.common.status.UFStatus.Priority; */ @XmlAccessorType(XmlAccessType.NONE) @XmlRootElement(name = "warngenConfig") -public class WarngenConfiguration implements ISerializableObject { +public class WarngenConfiguration { + private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(WarngenConfiguration.class); - private static Pattern p = Pattern + private static final SingleTypeJAXBManager jaxb = SingleTypeJAXBManager + .createWithoutException(WarngenConfiguration.class); + + private static final Pattern p = Pattern .compile("<\\s{0,}include\\s{1,}file\\s{0,}=\\s{0,}\"(.*)\"\\s{0,}/>"); @XmlElement @@ -178,7 +182,7 @@ public class WarngenConfiguration implements ISerializableObject { + " in template " + templateName, e); } - config = (WarngenConfiguration) SerializationUtil.unmarshalFromXml(xml); + config = (WarngenConfiguration) jaxb.unmarshalFromXml(xml); // Sets the lists of bullets and dam bullets if (config.getBulletActionGroups() != null) { @@ -204,7 +208,8 @@ public class WarngenConfiguration implements ISerializableObject { } // AreaConfiguration is deprecated. This is only meant for backwards - // compatibility while areaConfig is phased out with updated templates from the template team. + // compatibility while areaConfig is phased out with updated templates + // from the template team. if (config.getAreaConfig() != null) { ArrayList areaSources = null; diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialFactory.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialFactory.java index 14833b4abc..b1cd80e182 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialFactory.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialFactory.java @@ -38,6 +38,7 @@ import com.raytheon.uf.common.localization.PathManagerFactory; import com.raytheon.uf.common.localization.exception.LocalizationException; import com.raytheon.uf.common.serialization.SerializationException; import com.raytheon.uf.common.serialization.SerializationUtil; +import com.raytheon.uf.common.serialization.SingleTypeJAXBManager; import com.raytheon.uf.common.serialization.comm.RequestRouter; import com.raytheon.uf.common.status.IUFStatusHandler; import com.raytheon.uf.common.status.UFStatus; @@ -45,7 +46,8 @@ import com.raytheon.uf.common.status.UFStatus.Priority; import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory; /** - * TODO Add Description + * Retrieves geospatial data from disk if present, otherwise forwards request to + * maps database * *
  * 
@@ -60,6 +62,7 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory;
  *                                     So, do not add the returned value of getFeAreaField() 
  *                                     to areaFields.
  * Jan  9, 2013   15600    Qinglu Lin  Execute "timezones = myTimeZones;" even if timezones != null.
+ * Oct 22, 2013   2361     njensen     Use JAXBManager for XML
  * 
  * 
* @@ -68,6 +71,7 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory; */ public class GeospatialFactory { + private static final transient IUFStatusHandler statusHandler = UFStatus .getHandler(GeospatialFactory.class); @@ -77,6 +81,9 @@ public class GeospatialFactory { private static GeospatialData[] timezones; + private static SingleTypeJAXBManager jaxb = SingleTypeJAXBManager + .createWithoutException(GeospatialTimeSet.class); + public static GeospatialData[] getGeoSpatialList(String site, GeospatialMetadata metaData) throws SpatialException { Map lastRunTimeMap = loadLastRunGeoTimeSet(site); @@ -171,9 +178,7 @@ public class GeospatialFactory { METADATA_FILE); if (lf.exists()) { try { - rval = ((GeospatialTimeSet) SerializationUtil - .jaxbUnmarshalFromInputStream(lf.openInputStream())) - .getDataAsMap(); + rval = jaxb.unmarshalFromXmlFile(lf.getFile()).getDataAsMap(); } catch (Exception e) { statusHandler .handle(Priority.WARN, @@ -248,8 +253,8 @@ public class GeospatialFactory { if (lf.exists()) { byte[] data = lf.read(); - return (GeospatialDataSet) SerializationUtil - .transformFromThrift(data); + return SerializationUtil.transformFromThrift( + GeospatialDataSet.class, data); } else { System.out.println("Attempted to load: " + lf.getName() + " for site " + site + ", but file does not exist."); diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialMetadata.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialMetadata.java index 36aecb10cf..364006ba1e 100644 --- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialMetadata.java +++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialMetadata.java @@ -30,7 +30,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerialize; import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; /** - * TODO Add Description + * Geospatial data for a warngen configuration * *
  * 
@@ -48,6 +48,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
 @XmlAccessorType(XmlAccessType.NONE)
 @DynamicSerialize
 public class GeospatialMetadata {
+
     @XmlAttribute
     @DynamicSerializeElement
     private String areaSource;
diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialTime.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialTime.java
index 6952176980..1a11dfb91e 100644
--- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialTime.java
+++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialTime.java
@@ -25,7 +25,8 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 
 /**
- * TODO Add Description
+ * Wrapper for GeospatialConfiguration representing last time a the geometry
+ * data was created for a warngen configuration
  * 
  * 
  * 
diff --git a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialTimeSet.java b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialTimeSet.java
index d7bfe76a4d..3f86c2ffd0 100644
--- a/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialTimeSet.java
+++ b/edexOsgi/com.raytheon.uf.common.dataplugin.warning/src/com/raytheon/uf/common/dataplugin/warning/gis/GeospatialTimeSet.java
@@ -29,7 +29,8 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 
 /**
- * TODO Add Description
+ * Collection of GeospatialTime representing a set of generated geospatial data
+ * for warngen configurations
  * 
  * 
  * 
diff --git a/edexOsgi/com.raytheon.uf.common.gridcoverage/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.uf.common.gridcoverage/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject
deleted file mode 100644
index 417b02f0b1..0000000000
--- a/edexOsgi/com.raytheon.uf.common.gridcoverage/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject
+++ /dev/null
@@ -1,5 +0,0 @@
-com.raytheon.uf.common.gridcoverage.LatLonGridCoverage
-com.raytheon.uf.common.gridcoverage.MercatorGridCoverage
-com.raytheon.uf.common.gridcoverage.PolarStereoGridCoverage
-com.raytheon.uf.common.gridcoverage.LambertConformalGridCoverage
-com.raytheon.uf.common.gridcoverage.StereographicGridCoverage
\ No newline at end of file
diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.mesowest/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject b/edexOsgi/com.raytheon.uf.edex.plugin.mesowest/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject
deleted file mode 100644
index dc4d446881..0000000000
--- a/edexOsgi/com.raytheon.uf.edex.plugin.mesowest/META-INF/services/com.raytheon.uf.common.serialization.ISerializableObject
+++ /dev/null
@@ -1,2 +0,0 @@
-com.raytheon.uf.edex.plugin.mesowest.common.MESOWestRecord
-com.raytheon.uf.edex.plugin.mesowest.MESOWestFilter
\ No newline at end of file
diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.mesowest/src/com/raytheon/uf/edex/plugin/mesowest/MESOWestFilter.java b/edexOsgi/com.raytheon.uf.edex.plugin.mesowest/src/com/raytheon/uf/edex/plugin/mesowest/MESOWestFilter.java
index 8f4bf1979e..e3c0f8d9db 100644
--- a/edexOsgi/com.raytheon.uf.edex.plugin.mesowest/src/com/raytheon/uf/edex/plugin/mesowest/MESOWestFilter.java
+++ b/edexOsgi/com.raytheon.uf.edex.plugin.mesowest/src/com/raytheon/uf/edex/plugin/mesowest/MESOWestFilter.java
@@ -24,10 +24,6 @@ import static com.raytheon.uf.common.localization.LocalizationContext.Localizati
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
 import java.util.List;
 
 import javax.xml.bind.JAXBContext;
@@ -45,14 +41,15 @@ import com.raytheon.uf.common.dataplugin.PluginDataObject;
 import com.raytheon.uf.common.localization.IPathManager;
 import com.raytheon.uf.common.localization.LocalizationContext;
 import com.raytheon.uf.common.localization.PathManagerFactory;
-import com.raytheon.uf.common.serialization.SerializationUtil;
+import com.raytheon.uf.common.serialization.JAXBManager;
 import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
 import com.raytheon.uf.edex.decodertools.core.filterimpl.AbstractFilterElement;
 import com.raytheon.uf.edex.decodertools.core.filterimpl.AbstractObsFilter;
+import com.raytheon.uf.edex.decodertools.core.filterimpl.PluginDataObjectFilter;
 import com.raytheon.uf.edex.decodertools.core.filterimpl.RectFilterElement;
 
 /**
- * 
+ * A filter for mesowest data that is configured through XML.
  * 
  * 
  * 
@@ -61,6 +58,8 @@ import com.raytheon.uf.edex.decodertools.core.filterimpl.RectFilterElement;
  * Date         Ticket#    Engineer    Description
  * ------------ ---------- ----------- --------------------------
  * Mar 23, 2009            jkorman     Initial creation
+ * Oct 22, 2013 2361       njensen     Use JAXBManager for XML
+ * 
  * 
  * 
* @@ -88,22 +87,14 @@ public class MESOWestFilter extends AbstractObsFilter { File siteDir = manager.getFile(siteContext, ""); if (siteDir.exists()) { - File srcFile = new File(siteDir, FILTER_CONFIG); - - byte[] data = new byte[(int) srcFile.length()]; - - InputStream stream = getInputStream(srcFile); try { - stream.read(data); - stream.close(); - - AbstractObsFilter filter = (AbstractObsFilter) SerializationUtil - .unmarshalFromXml(new String(data)); - - setFilterElements(filter.getFilterElements()); - setFilterName(filter.getFilterName()); - } catch (IOException e) { - logger.error("Unable to read filter config", e); + File srcFile = new File(siteDir, FILTER_CONFIG); + JAXBManager jaxb = new JAXBManager(MESOWestFilter.class, + PluginDataObjectFilter.class); + AbstractObsFilter filter = jaxb.unmarshalFromXmlFile( + AbstractObsFilter.class, srcFile); + this.setFilterElements(filter.getFilterElements()); + this.setFilterName(filter.getFilterName()); } catch (JAXBException e) { logger.error("Unable to unmarshall filter config", e); } @@ -218,20 +209,4 @@ public class MESOWestFilter extends AbstractObsFilter { } } - /** - * - * @param file - * @return - */ - private static FileInputStream getInputStream(File file) { - FileInputStream fis = null; - - try { - fis = new FileInputStream(file); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - return fis; - } - } diff --git a/edexOsgi/com.raytheon.uf.edex.plugin.mesowest/src/com/raytheon/uf/edex/plugin/mesowest/common/MESOWestRecord.java b/edexOsgi/com.raytheon.uf.edex.plugin.mesowest/src/com/raytheon/uf/edex/plugin/mesowest/common/MESOWestRecord.java index 04a4dfc50b..83bef6ec7f 100644 --- a/edexOsgi/com.raytheon.uf.edex.plugin.mesowest/src/com/raytheon/uf/edex/plugin/mesowest/common/MESOWestRecord.java +++ b/edexOsgi/com.raytheon.uf.edex.plugin.mesowest/src/com/raytheon/uf/edex/plugin/mesowest/common/MESOWestRecord.java @@ -39,11 +39,6 @@ import javax.persistence.Entity; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.UniqueConstraint; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; import com.raytheon.uf.common.dataplugin.IDecoderGettable; import com.raytheon.uf.common.dataplugin.PluginDataObject; @@ -55,7 +50,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement; import com.vividsolutions.jts.geom.Geometry; /** - * + * Record for mesowest data * *
  * 
@@ -68,6 +63,7 @@ import com.vividsolutions.jts.geom.Geometry;
  * May 07, 2013 1869       bsteffen    Remove dataURI column from
  *                                     PluginDataObject.
  * Aug 30, 2013 2298       rjpeter     Make getPluginName abstract
+ * Oct 22, 2013 2361       njensen     Remove XML annotations
  * 
  * 
* @@ -77,8 +73,6 @@ import com.vividsolutions.jts.geom.Geometry; @Entity @SequenceGenerator(initialValue = 1, name = PluginDataObject.ID_GEN, sequenceName = "mesowestseq") @Table(name = "mesowest", uniqueConstraints = { @UniqueConstraint(columnNames = { "dataURI" }) }) -@XmlRootElement -@XmlAccessorType(XmlAccessType.NONE) @DynamicSerialize public class MESOWestRecord extends PluginDataObject implements ISpatialEnabled, IDecoderGettable { @@ -117,152 +111,127 @@ public class MESOWestRecord extends PluginDataObject implements } @DataURI(position = 1) - @XmlElement @DynamicSerializeElement private String networkType; // Time of the observation. @DataURI(position = 2) - @XmlAttribute @DynamicSerializeElement private Calendar timeObs; @Embedded @DataURI(position = 3, embedded = true) - @XmlElement @DynamicSerializeElement private SurfaceObsLocation location; // Observation air temperature in degrees Kelvin. @Column @DynamicSerializeElement - @XmlElement private Double temp; // Observation dewpoint temperature in degrees Kelvin. @Column @DynamicSerializeElement - @XmlElement private Double dwpt; // 24 Hour maximum temperature in degrees Kelvin. @Column @DynamicSerializeElement - @XmlElement private Double maxT24; // 24 Hour minimum temperature in degrees Kelvin. @Column @DynamicSerializeElement - @XmlElement private Double minT24; // Relative Humidity in percent. @Column @DynamicSerializeElement - @XmlElement private Double humidity; // Observation wind direction in angular degrees. Integer @Column @DynamicSerializeElement - @XmlElement private Double windDirection; // Observation wind speed in meters per second. @Column @DynamicSerializeElement - @XmlElement private Double windSpeed; // Observation wind gust in meters per second. @Column @DynamicSerializeElement - @XmlElement private Double windGust; // Observation pressure in Pa. @Column @DynamicSerializeElement - @XmlElement private Double pressure; // Observation pressure in Pa. @Column @DynamicSerializeElement - @XmlElement private Double seaLevelPressure; // Observation pressure in Pa. @Column @DynamicSerializeElement - @XmlElement private Double altimeter; // Observation precip in mm. @Column @DynamicSerializeElement - @XmlElement private Double precip; // 1 minute precip in inches. @Column @DynamicSerializeElement - @XmlElement private Double precip_01M; // 5 minute precip in inches. @Column @DynamicSerializeElement - @XmlElement private Double precip_05M; // 10 minute precip in inches. @Column @DynamicSerializeElement - @XmlElement private Double precip_10M; // 15 minute precip in inches. @Column @DynamicSerializeElement - @XmlElement private Double precip_15M; // 30 minute precip in inches. @Column @DynamicSerializeElement - @XmlElement private Double precip_30M; // 1 hour precip in inches. @Column @DynamicSerializeElement - @XmlElement private Double precip_01H; // 3 hour precip in inches. @Column @DynamicSerializeElement - @XmlElement private Double precip_03H; // 6 hour precip in inches. @Column @DynamicSerializeElement - @XmlElement private Double precip_06H; // 24 hour precip in inches. @Column @DynamicSerializeElement - @XmlElement private Double precip_24H; // Raw observation text @Column @DynamicSerializeElement - @XmlElement private String obsText; /** From e36fef6dbaebe01b203485d1f9db39abfbcd0c6f Mon Sep 17 00:00:00 2001 From: Nate Jensen Date: Wed, 23 Oct 2013 14:01:19 -0500 Subject: [PATCH 10/12] Issue #2359 better email addresses Former-commit-id: a609706b5ec35e48959397393ff2e229b711829f [formerly a609706b5ec35e48959397393ff2e229b711829f [formerly 03be0960bfbbd8072166bc0a06e4100538dbc7ca]] Former-commit-id: b56c67a8fb6f4e02a48515d6e9d93295e174ebdd Former-commit-id: cf4f6c3d4bf1b40a7c0e7dd2e36c4a5a84d02910 --- javaUtilities/com.raytheon.uf.logsrv/config.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/javaUtilities/com.raytheon.uf.logsrv/config.xml b/javaUtilities/com.raytheon.uf.logsrv/config.xml index bc353200bb..8d94e77092 100644 --- a/javaUtilities/com.raytheon.uf.logsrv/config.xml +++ b/javaUtilities/com.raytheon.uf.logsrv/config.xml @@ -5,7 +5,7 @@ Nathan.Jensen@raytheon.com mk2-msg10.raymail.ray.com 143 - - Nathan.Jensen@raytheon.com + awipsctl@list.app.ray.com, awipstest@list.app.ray.com, david_j_hladky@raytheon.com + 01:30 \ No newline at end of file From 12e742544082e9dd7e9aa498dc80b44d1e785f45 Mon Sep 17 00:00:00 2001 From: Bryan Kowal Date: Wed, 23 Oct 2013 13:19:43 -0500 Subject: [PATCH 11/12] Issue #2476 - recompiled jep for Linux Former-commit-id: a3cfae35103d93070ae25528204d0d25aa318caa [formerly a3cfae35103d93070ae25528204d0d25aa318caa [formerly b33a29abbb89d392b7bba2862db4b3d06b2c24a5]] Former-commit-id: 9fe5429068de79de97b692f5c4e22ba62470bec1 Former-commit-id: 46f5db6284ea568cc1feae5d0ba34597366fd783 --- cots/org.jep.linux32/libjep.so | Bin 1800937 -> 1803722 bytes cots/org.jep.linux64/libjep.so | Bin 2104290 -> 2104098 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/cots/org.jep.linux32/libjep.so b/cots/org.jep.linux32/libjep.so index fd81c353667d452d70a458315f6be3ded54018d2..310f818ec8263ac4c02751abfbac23405ab62a93 100644 GIT binary patch delta 501764 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 z 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

`Pxt&n3HvQ^YB_7>B=q$PH@ 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%0A9iA{?03LDi-p7#v|8&zLI<{@f6DU|FV?+Oo6%7 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 U{b}@up*4y2uD%8RhUJ$2KP0=Ip#T5? delta 498900 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