/* ****************************************************************************
* $Id: View8211.java,v 1.5 2005/08/04 18:12:00 dietrick Exp $
*
* Project: SDTS Translator
* Purpose: Example program dumping data in 8211 data to stdout.
* Author: Frank Warmerdam, warmerda@home.com
*
******************************************************************************
* Copyright (c) 1999, Frank Warmerdam
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
******************************************************************************
*/
package com.bbn.openmap.dataAccess.iso8211;
import java.io.IOException;
import java.util.Iterator;
import com.bbn.openmap.layer.vpf.MutableInt;
import com.bbn.openmap.util.Debug;
/**
* Class that uses the DDF* classes to read an 8211 file and print out the
* contents.
*/
public class View8211 {
protected boolean bFSPTHack = false;
protected String pszFilename = null;
public View8211(String filename, boolean fspt_repeating) {
pszFilename = filename;
bFSPTHack = fspt_repeating;
view();
}
protected void view() {
DDFModule oModule;
try {
oModule = new DDFModule(pszFilename);
if (bFSPTHack) {
DDFFieldDefinition poFSPT = oModule.findFieldDefn("FSPT");
if (poFSPT == null)
Debug.error("View8211: unable to find FSPT field to set repeating flag.");
else
poFSPT.setRepeating(true);
}
/* -------------------------------------------------------------------- */
/* Loop reading records till there are none left. */
/* -------------------------------------------------------------------- */
DDFRecord poRecord;
int iRecord = 1;
while ((poRecord = oModule.readRecord()) != null) {
Debug.output("Record " + (iRecord++) + "(" + poRecord.getDataSize() + " bytes)");
/* ------------------------------------------------------------ */
/* Loop over each field in this particular record. */
/* ------------------------------------------------------------ */
for (Iterator it = poRecord.iterator(); it != null && it.hasNext();) {
// Debug.output(((DDFField)it.next()).toString()));
viewRecordField(((DDFField) it.next()));
}
}
} catch (IOException ioe) {
Debug.error(ioe.getMessage());
ioe.printStackTrace();
}
}
/**
* Dump the contents of a field instance in a record.
*/
protected void viewRecordField(DDFField poField) {
DDFFieldDefinition poFieldDefn = poField.getFieldDefn();
// Report general information about the field.
Debug.output(" Field " + poFieldDefn.getName() + ": " + poFieldDefn.getDescription());
// Get pointer to this fields raw data. We will move through
// it consuming data as we report subfield values.
byte[] pachFieldData = poField.getData();
int nBytesRemaining = poField.getDataSize();
/* -------------------------------------------------------- */
/* Loop over the repeat count for this fields */
/* subfields. The repeat count will almost */
/* always be one. */
/* -------------------------------------------------------- */
for (int iRepeat = 0; iRepeat < poField.getRepeatCount(); iRepeat++) {
if (iRepeat > 0) {
Debug.output("Repeating (" + iRepeat + ")...");
}
/* -------------------------------------------------------- */
/* Loop over all the subfields of this field, advancing */
/* the data pointer as we consume data. */
/* -------------------------------------------------------- */
for (int iSF = 0; iSF < poFieldDefn.getSubfieldCount(); iSF++) {
DDFSubfieldDefinition poSFDefn = poFieldDefn.getSubfieldDefn(iSF);
int nBytesConsumed = viewSubfield(poSFDefn, pachFieldData, nBytesRemaining);
nBytesRemaining -= nBytesConsumed;
byte[] tempData = new byte[pachFieldData.length - nBytesConsumed];
System.arraycopy(pachFieldData, nBytesConsumed, tempData, 0, tempData.length);
pachFieldData = tempData;
}
}
}
protected int viewSubfield(DDFSubfieldDefinition poSFDefn, byte[] pachFieldData, int nBytesRemaining) {
MutableInt nBytesConsumed = new MutableInt();
DDFDataType ddfdt = poSFDefn.getType();
if (ddfdt == DDFDataType.DDFInt) {
Debug.output(" " + poSFDefn.getName() + " = "
+ poSFDefn.extractIntData(pachFieldData, nBytesRemaining, nBytesConsumed));
} else if (ddfdt == DDFDataType.DDFFloat) {
Debug.output(" " + poSFDefn.getName() + " = "
+ poSFDefn.extractFloatData(pachFieldData, nBytesRemaining, nBytesConsumed));
} else if (ddfdt == DDFDataType.DDFString) {
Debug.output(" " + poSFDefn.getName() + " = "
+ poSFDefn.extractStringData(pachFieldData, nBytesRemaining, nBytesConsumed));
} else if (ddfdt == DDFDataType.DDFBinaryString) {
poSFDefn.extractStringData(pachFieldData, nBytesRemaining, nBytesConsumed); // pabyBString
Debug.output(" " + poSFDefn.getName());
}
return nBytesConsumed.value;
}
public static void main(String[] argv) {
Debug.init();
String pszFilename = null;
boolean bFSPTHack = false;
for (int iArg = 0; iArg < argv.length; iArg++) {
if (argv[iArg].equals("-fspt_repeating")) {
bFSPTHack = true;
} else {
pszFilename = argv[iArg];
}
}
if (pszFilename == null) {
Debug.output("Usage: View8211 filename\n");
System.exit(1);
}
new View8211(pszFilename, bFSPTHack);
}
}