001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/io/dbaseapi/DBFHeader.java $
002
003 /*---------------- FILE HEADER ------------------------------------------
004
005 This file is part of deegree.
006 Copyright (C) 2001-2008 by:
007 EXSE, Department of Geography, University of Bonn
008 http://www.giub.uni-bonn.de/deegree/
009 lat/lon GmbH
010 http://www.lat-lon.de
011
012 This library is free software; you can redistribute it and/or
013 modify it under the terms of the GNU Lesser General Public
014 License as published by the Free Software Foundation; either
015 version 2.1 of the License, or (at your option) any later version.
016
017 This library is distributed in the hope that it will be useful,
018 but WITHOUT ANY WARRANTY; without even the implied warranty of
019 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
020 Lesser General Public License for more details.
021
022 You should have received a copy of the GNU Lesser General Public
023 License along with this library; if not, write to the Free Software
024 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
025
026 Contact:
027
028 Andreas Poth
029 lat/lon GmbH
030 Aennchenstr. 19
031 53115 Bonn
032 Germany
033 E-Mail: poth@lat-lon.de
034
035 Prof. Dr. Klaus Greve
036 Department of Geography
037 University of Bonn
038 Meckenheimer Allee 166
039 53115 Bonn
040 Germany
041 E-Mail: greve@giub.uni-bonn.de
042
043
044 ---------------------------------------------------------------------------*/
045
046 package org.deegree.io.dbaseapi;
047
048 import org.deegree.model.spatialschema.ByteUtils;
049
050
051
052 /**
053 * Class representing the header of a dBase III/IV file
054 *
055 * @version 03.05.2000
056 * @author Andreas Poth
057 */
058 public class DBFHeader {
059
060 private byte[] header = null;
061
062 /**
063 * constructor
064 * retrieves number of fields
065 */
066 public DBFHeader(FieldDescriptor[] fieldDesc) throws DBaseException {
067
068 try {
069 // allocate memory for the header
070 header = new byte[32 + fieldDesc.length * 32 + 1];
071
072 // set file type
073 header[0] = 3;
074
075 // set date YYMMDD
076 header[1] = 0;
077 header[2] = 1;
078 header[3] = 1;
079
080 //number of records in the dBase file
081 ByteUtils.writeLEInt(header,4,0);
082
083 // write number of bytes in the header
084 ByteUtils.writeLEShort(header,8,header.length);
085
086 // set field descriptors and calculate length of the data section
087 int sum = 0;
088 for (int i = 0; i < fieldDesc.length; i++) {
089 setField( i, fieldDesc[i] );
090 byte[] data = fieldDesc[i].getFieldDescriptor();
091 sum += data[16];
092 data = null;
093 }
094
095 sum++;
096
097 // write number of bytes in the record (data section)
098 ByteUtils.writeLEShort(header,10,sum);
099
100 // set field terminator
101 header[header.length-1] = 0x0D;
102 } catch (Exception e) {
103 e.printStackTrace();
104 throw new DBaseException( e.getMessage() );
105 }
106
107 }
108
109 /**
110 * method: public void setField(int index, FieldDescriptor fd)
111 * puts a field on the header byte array
112 */
113 private void setField(int index, FieldDescriptor fd) {
114
115 // get field descriptor data
116 byte[] fddata = fd.getFieldDescriptor();
117
118 // put field descriptor data on header byte array
119 for (int i = 0; i < 32; i++) {
120 header[32 + (index * 32) + i] = fddata[i];
121 }
122
123 }
124
125 /**
126 * method: public byte[] getHeader() throws DBaseException
127 * returns the header as a byte array
128 *
129 */
130 public byte[] getHeader() {
131 return header;
132 }
133
134 }