/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2003-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.data.vpf.io;
import java.util.Collections;
import java.util.List;
import org.geotools.data.vpf.ifc.DataTypesDefinition;
import org.geotools.data.vpf.ifc.VPFHeader;
/**
* This class contains definition of VPF standard table header according to
* specification found in: "Interface Standard for Vector Product Format."
* Objects of this type are immutable. Created: Thu Jan 02 22:50:59 2003
*
* @author <a href="mailto:kobit@users.fs.net">Artur Hefczyc</a>
*
*
* @source $URL$
* @version 1.0
*/
public class TableHeader implements VPFHeader, DataTypesDefinition {
/**
* Variable <code>length</code> keeps value of length of ASCII header
* string (i.e., the remaining information after this field)
*/
private int headerLength = -0;
/**
* Variable <code>byteOrder</code> keeps value of byte order in which
* table is written:
*
* <ul>
* <li>
* <b>L</b> - least-significant-first
* </li>
* <li>
* <b>M</b> - most-significant-first
* </li>
* </ul>
*/
private char byteOrder = LEAST_SIGNIF_FIRST;
/**
* Variable <code>description</code> keeps value of text description of the
* table's contents.
*/
private String description = null;
/**
* Variable <code>narrativeTable</code> keeps value of an optional
* narrative file which contains miscellaneous information about the
* table.
*/
private String narrativeTable = null;
/**
* Variable <code>columnDefs</code> keeps value of list of all column
* definitions found in table header. This list keeps objects of type
* <code>TableColumnDef</code> class.
*/
private List columnDefs = null;
/**
* Creates a new <code>TableHeader</code> instance.
*
* @param length an <code>int</code> value of table header length.
* @param byteOrder a <code>char</code> value byte order used in table
* file.
* @param description a <code>String</code> value text description of found
* in header of this table.
* @param narrativeTable a <code>String</code> value file name of narrative
* table.
* @param columnDefs a <code>List</code> value of all column definitions
* for this table.
*/
public TableHeader(int length, char byteOrder, String description,
String narrativeTable, List columnDefs) {
this.headerLength = length;
this.byteOrder = byteOrder;
this.description = description;
this.narrativeTable = narrativeTable;
this.columnDefs = columnDefs;
}
/**
* Method <code>toString</code> returns content of all fields values. Used
* only for test and debug purpose.
*
* @return a <code>String</code> value
*/
public String toString() {
String endLine = System.getProperty("line.separator");
StringBuffer buff = new StringBuffer();
buff.append(" length=" + headerLength + endLine);
buff.append(" byteOrder=" + byteOrder + endLine);
buff.append(" description=" + description + endLine);
buff.append(" narrativeTable=" + narrativeTable + endLine);
buff.append(" columnDefs:");
if (columnDefs == null) {
buff.append("null)");
} else {
for (int i = 0; i < columnDefs.size(); i++) {
buff.append(endLine + columnDefs.get(i).toString());
}
buff.append(endLine);
}
return buff.toString();
}
/**
* Gets the value of full length of ASCII header string including
* <code>headerLength</code> field.
*
* @return the value of headerLength
*/
public int getLength() {
return this.headerLength + 4;
}
/**
* Method <code><code>getRecordSize</code></code> is used to return size in
* bytes of records stored in this table. If table keeps variable length
* records <code>-1</code> should be returned.
*
* @return an <code><code>int</code></code> value
*/
public int getRecordSize() {
int size = 0;
for (int i = 0; i < columnDefs.size(); i++) {
TableColumnDef colDef = (TableColumnDef) columnDefs.get(i);
// System.out.println("Column def no. "+i+" column size: "+
// colDef.getColumnSize());
if (colDef.getColumnSize() < 0) {
return -1;
} else {
size += colDef.getColumnSize();
}
}
return size;
}
/**
* Gets the value of byteOrder variable. Byte order in which table is
* written:
*
* <ul>
* <li>
* <b>L</b> - least-significant-first
* </li>
* <li>
* <b>M</b> - most-significant-first
* </li>
* </ul>
*
*
* @return the value of byteOrder
*/
public char getByteOrder() {
return this.byteOrder;
}
/**
* Gets the value of the description of table content.
*
* @return the value of description
*/
public String getDescription() {
return this.description;
}
/**
* Gets the value of narrativeTable variable file name.
*
* @return the value of narrativeTable
*/
public String getNarrativeTable() {
return this.narrativeTable;
}
/**
* Gets the value of columnDefs variable keeping definitions of all columns
* in this table.
*
* @return the value of columnDefs
*/
public List getColumnDefs() {
return Collections.unmodifiableList(this.columnDefs);
}
}
// TableHeader