Worldwind public release 0.2.1
[worldwind-tracker.git] / gov / nasa / worldwind / formats / nitfs / NitfsMessage.java
blob30be39c6ce5a33ecad4b1c3f7267f7b4a1cab60c
1 package gov.nasa.worldwind.formats.nitfs;
3 import gov.nasa.worldwind.*;
4 import gov.nasa.worldwind.formats.rpf.*;
6 import java.io.*;
7 import java.text.*;
8 /*
9 Copyright (C) 2001, 2007 United States Government
10 as represented by the Administrator of the
11 National Aeronautics and Space Administration.
12 All Rights Reserved.
15 /**
16 * @author Lado Garakanidze
17 * @version $Id: NitfsMessage Apr 4, 2007 4:11:55 PM lado
19 public class NitfsMessage
21 private java.nio.ByteBuffer buffer;
22 private NitfsFileHeader fileHeader;
23 private java.util.ArrayList<NitfsSegment> segments = new java.util.ArrayList<NitfsSegment>();
26 public NitfsSegment getSegment( NitfsSegmentType segmentType )
28 for(NitfsSegment seg : segments)
30 if(null != seg && seg.segmentType.equals(segmentType))
31 return seg;
33 return null;
36 public NitfsFileHeader getNitfsFileHeader()
38 return this.fileHeader;
41 private NitfsMessage(java.nio.ByteBuffer buffer)
43 this.buffer = buffer;
44 this.fileHeader = new NitfsFileHeader(buffer);
46 // read ALL description groups and segments
47 this.readSegments();
50 private void readSegments()
52 int saveOffset = this.buffer.position();
53 int nextSegmentOffset = this.fileHeader.getHeaderLength();
55 // parse Image Description Group
56 nextSegmentOffset = parseSegment(NitfsSegmentType.ImageSegment, nextSegmentOffset);
57 // parse Graphic/Symbol Description Group
58 nextSegmentOffset = parseSegment(NitfsSegmentType.SymbolSegment, nextSegmentOffset);
59 // parse Label Description Group
60 nextSegmentOffset = parseSegment(NitfsSegmentType.LabelSegment, nextSegmentOffset);
61 // parse Text Description Group
62 nextSegmentOffset = parseSegment(NitfsSegmentType.TextSegment, nextSegmentOffset);
63 // parse Data Extension Description Group
64 nextSegmentOffset = parseSegment(NitfsSegmentType.DataExtensionSegment, nextSegmentOffset);
65 // parse Reserved Extension Description Group
66 nextSegmentOffset = parseSegment(NitfsSegmentType.ReservedExtensionSegment, nextSegmentOffset);
67 // parse User Defined Header Description (UDHD) Group
68 NitfsUserDefinedHeaderSegment userHeaderSeg = new RpfUserDefinedHeaderSegment(this.buffer);
69 this.segments.add( userHeaderSeg );
70 nextSegmentOffset += userHeaderSeg.headerLength + userHeaderSeg.dataLength;
71 // parse Extended Header Description Group
72 nextSegmentOffset = parseSegment(NitfsSegmentType.ExtendedHeaderSegment, nextSegmentOffset);
74 // let's read each header
75 for(NitfsSegment segment : segments)
79 // String segId = NitfsUtil.getString(buffer, segment.headerStartOffset, 2);
80 // System.out.println("Segment type=" + segment.segmentType + ", id=" + segId);
84 private int parseSegment(NitfsSegmentType segType, int nextSegmentOffset)
86 int headerLengthSize = segType.getHeaderLengthSize();
87 int dataLengthSize = segType.getDataLengthSize();
89 int numOfSegments = Integer.parseInt(NitfsUtil.getString(this.buffer, 3));
90 for (int i = 0; i < numOfSegments; i++)
92 int segHeaderLength = Integer.parseInt(NitfsUtil.getString(this.buffer, headerLengthSize));
93 int seqDataLength = Integer.parseInt(NitfsUtil.getString(this.buffer, dataLengthSize));
95 int saveOffset = this.buffer.position(); // pass buffer to NitfsSegment to parse their headers' contents
96 NitfsSegment segment;
97 switch (segType)
99 case ImageSegment:
100 segment = new NitfsImageSegment(this.buffer, nextSegmentOffset, segHeaderLength,
101 nextSegmentOffset + segHeaderLength, seqDataLength);
102 break;
103 case SymbolSegment:
104 segment = new NitfsSymbolSegment(this.buffer, nextSegmentOffset, segHeaderLength,
105 nextSegmentOffset + segHeaderLength, seqDataLength);
106 break;
107 case LabelSegment:
108 segment = new NitfsLabelSegment(this.buffer, nextSegmentOffset, segHeaderLength,
109 nextSegmentOffset + segHeaderLength, seqDataLength);
110 break;
111 case TextSegment:
112 segment = new NitfsTextSegment(this.buffer, nextSegmentOffset, segHeaderLength,
113 nextSegmentOffset + segHeaderLength, seqDataLength);
114 break;
115 case DataExtensionSegment:
116 segment = new NitfsDataExtensionSegment(this.buffer, nextSegmentOffset, segHeaderLength,
117 nextSegmentOffset + segHeaderLength, seqDataLength);
118 break;
119 case ReservedExtensionSegment:
120 segment = new NitfsReservedExtensionSegment(this.buffer, nextSegmentOffset, segHeaderLength,
121 nextSegmentOffset + segHeaderLength, seqDataLength);
122 break;
123 case UserDefinedHeaderSegment:
124 segment = new RpfUserDefinedHeaderSegment(this.buffer);
125 break;
126 case ExtendedHeaderSegment: // // throw exception - wrong parser for ExtendedHeaderSegment
127 segment = new NitfsExtendedHeaderSegment(this.buffer, nextSegmentOffset, segHeaderLength,
128 nextSegmentOffset + segHeaderLength, seqDataLength);
129 break;
131 default:
132 throw new NitfsRuntimeException("NitfsReader.UnknownOrUnsupportedSegment", segType.toString());
135 this.segments.add(segment);
137 nextSegmentOffset += segHeaderLength + seqDataLength;
138 buffer.position(saveOffset); // restore offset
140 return nextSegmentOffset;
143 public static NitfsMessage load(java.io.File file) throws java.io.IOException
145 validateImageFile(file);
147 java.nio.ByteBuffer roBuffer = NitfsUtil.readEntireFile(file).asReadOnlyBuffer();
149 // check if it is a NITFS format file (NITF or NSIF - for NATO Secondary Imagery Format)
150 String fmtId = NitfsUtil.getString(roBuffer, 0, 4);
151 if( 0 != "NITF".compareTo(fmtId) && 0 != "NSIF".compareTo(fmtId))
153 roBuffer = null;
154 throw new NitfsRuntimeException("NitfsReader.UnknownOrUnsupportedNitfsFormat", file.getCanonicalPath());
157 return new NitfsMessage(roBuffer);
160 private static void validateImageFile(java.io.File file)
161 throws IOException, IllegalArgumentException, NitfsRuntimeException
163 if (null == file)
165 String message = WorldWind.retrieveErrMsg("nullValue.FileIsNull");
166 WorldWind.logger().log(java.util.logging.Level.FINE, message);
167 throw new IllegalArgumentException(message);
169 if (!file.exists() || !file.canRead())
170 throw new NitfsRuntimeException("NitfsReader.NoFileOrNoPermission", file.getCanonicalPath());
173 public static void main(String args[])
175 String testImageFilename = "/depot/WorldWindJ/utils/gdal/020g222a.i42";
177 if(Configuration.isWindowsOS())
178 testImageFilename = "C:\\depot\\WorldWindJ\\utils\\gdal\\020g222a.i42";
182 long startTime = System.currentTimeMillis();
184 NitfsMessage img = NitfsMessage.load(new File(testImageFilename));
186 System.out.println(MessageFormat.format("Image loaded in {0} mSec", (System.currentTimeMillis() - startTime)));
188 System.out.println(img.fileHeader.getHeaderLength());
189 System.out.println(img.fileHeader.getVersion());
190 System.out.println(img.fileHeader.getComplexityLevel());
191 System.out.println(img.fileHeader.getSpecialType());
192 System.out.println(img.fileHeader.getOriginationStationId());
193 System.out.println(img.fileHeader.getDateTime());
194 System.out.println(img.fileHeader.getTitle());
195 System.out.println(img.fileHeader.getFSCLAS());
197 System.out.println("HeaderLength=" + img.fileHeader.getHeaderLength());
198 System.out.println("Total FileLength=" + img.fileHeader.getFileLength());
200 // System.out.println();
202 catch (Exception e)
204 System.out.println(e.getMessage());
205 e.printStackTrace();