/** * 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.edex.plugin.recco; import java.util.Calendar; import com.raytheon.edex.esb.Headers; import com.raytheon.edex.exception.DecoderException; import com.raytheon.edex.plugin.AbstractDecoder; import com.raytheon.edex.plugin.recco.common.RECCORecord; import com.raytheon.edex.plugin.recco.decoder.ReccoParser; import com.raytheon.uf.common.dataplugin.PluginDataObject; import com.raytheon.uf.common.dataplugin.PluginException; import com.raytheon.uf.common.pointdata.spatial.AircraftObsLocation; import com.raytheon.uf.common.time.DataTime; import com.raytheon.uf.edex.decodertools.core.IDecoderConstants; import com.raytheon.uf.edex.decodertools.core.IDecoderInput; import com.raytheon.uf.edex.decodertools.time.TimeTools; import com.raytheon.uf.edex.wmo.message.WMOHeader; /** * Decoder strategy for text aircraft RECCO observation data. Most common usage * is as follows. * SfcObsDecoder dec = new SfcObsDecoder(); * dec.setMessage(); * while(dec.hasNext()) * { * PluginDataObject r = dec.decode(); * // do something with record. * } * * * *
 * 
 * SOFTWARE HISTORY
 * 
 * Date         Ticket#    Engineer    Description
 * ------------ ---------- ----------- --------------------------
 * 20080103            384 jkorman     Initial Coding.
 * 11/25/08          #1684 chammack    Camel Refactor
 * 
* * @author jkorman * @version 1.0 */ public class RECCODecoder extends AbstractDecoder { // Name of the plugin controlling this decoder. private final String PLUGIN_NAME; private boolean removeNILs = true; /** * @param pluginName * Name that identifies this decoder. * @throws DecoderException */ public RECCODecoder(String pluginName) { PLUGIN_NAME = pluginName; } /** * Determine the removeNILs status. * * @return Should NIL reports be removed. */ public boolean isRemoveNILs() { return removeNILs; } /** * Set the removeNILs status. * * @param removeNILs * Should NIL reports be removed. */ public void setRemoveNILs(boolean removeNILs) { this.removeNILs = removeNILs; } /** * Get the next decoded data record. * * @return One record of decoded data. * @throws DecoderException * Thrown if no data is available. */ public PluginDataObject[] decode(IDecoderInput input, Headers headers) { PluginDataObject[] reports = null; String traceId = null; try { traceId = input.getProperty("traceId"); logger.debug(traceId + "- RECCODecoder.decode()"); RECCORecord report = populateRecord( new ReccoParser(input.getReport(), headers), input.getWmoHeader()); if (report != null) { report.setTraceId(traceId); report.setPluginName(PLUGIN_NAME); try { report.constructDataURI(); } catch (PluginException e) { throw new DecoderException("Unable to construct dataURI", e); } reports = new PluginDataObject[] { report }; } } catch (Exception e) { logger.error(traceId + "- Error in RECCODecoder", e); } finally { if (reports == null) { reports = new PluginDataObject[0]; } } return reports; } /** * @param parser * The reccon parser that contains the decoded data. * @return The populated record. */ private RECCORecord populateRecord(ReccoParser parser, WMOHeader wmoHeader) { RECCORecord record = null; AircraftObsLocation location = null; if (parser != null) { // If there is no obstime, don't bother going further. Calendar oTime = parser.getObservationTime(); if (oTime != null) { record = new RECCORecord(); location = new AircraftObsLocation(); record.setTimeObs(oTime); record.setRefHour(TimeTools.copyToNearestHour(oTime)); DataTime dataTime = new DataTime(oTime); record.setDataTime(dataTime); record.setWmoHeader(wmoHeader.getWmoHeader()); record.setReportData(parser.getReportData()); if ("222".equals(parser.getObsType())) { record.setReportType(IDecoderConstants.RECCO_MANOBS); } else if ("555".equals(parser.getObsType())) { record.setReportType(IDecoderConstants.RECCO_INTEROBS); } else if ("777".equals(parser.getObsType())) { record.setReportType(IDecoderConstants.RECCO_MANOBS); } location.setLatitude(parser.getLatitude()); location.setLongitude(parser.getLongitude()); location.setLocation(parser.getLatitude(), parser.getLongitude()); location.setFlightLevel(parser.getFlightLevel() .getFlightLevel()); record.setLocation(location); record.setTemp(parser.getTemperature()); record.setDwpt(parser.getDewpoint()); record.setWindDirection(parser.getWindDirection()); record.setWindSpeed(parser.getWindSpeed()); } } return record; } }