Worldwind public release 0.2.1
[worldwind-tracker.git] / gov / nasa / worldwind / formats / rpf / RpfFrameFilenameUtil.java
blob346918fdcd64721eeb912c738890230601e2ee7a
1 /*
2 Copyright (C) 2001, 2006 United States Government as represented by
3 the Administrator of the National Aeronautics and Space Administration.
4 All Rights Reserved.
5 */
6 package gov.nasa.worldwind.formats.rpf;
8 import gov.nasa.worldwind.*;
10 import static java.util.logging.Level.*;
12 /**
13 * @author dcollins
14 * @version $Id: RpfFrameFilenameUtil.java 1894 2007-05-29 00:15:15Z dcollins $
16 public class RpfFrameFilenameUtil
18 /* [Section 30.6, MIL-C-89038] */
19 /* [Section A.3.6, MIL-PRF-89041A] */
20 private static final char[] BASE34_ALPHABET =
21 {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
22 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
23 private static final char[] filenameArray = new char[12];
25 /* [Section 30.6, MIL-C-89038] */
26 /* [Section A.3.6, MIL-PRF-89041A] */
27 private static char[] base34ValueOf(int i, char[] dest, int offset, int count)
29 if (dest == null || dest.length < count)
30 dest = new char[count];
31 for (int digit = count + offset - 1; digit >= offset; digit--)
33 dest[digit] = BASE34_ALPHABET[i % 34];
34 i /= 34;
36 return dest;
39 public static String filenameFor(RpfFrameProperties frameProperties)
41 if (frameProperties == null)
43 String message = WorldWind.retrieveErrMsg("nullValue.RpfFramePropertiesIsNull");
44 WorldWind.logger().log(FINE, message);
45 throw new IllegalArgumentException(message);
47 filenameFor(frameProperties, filenameArray);
48 return new String(filenameArray, 0, 12);
51 /* [Section 30.6, MIL-C-89038] */
52 /* [Section A.3.6, MIL-PRF-89041A] */
53 private static void filenameFor(RpfFrameProperties frameProperties, char[] dest)
55 int frameChars;
56 int versionChars;
57 if (frameProperties.dataSeries.rpfDataType.compareToIgnoreCase("CADRG") == 0)
59 frameChars = 5;
60 versionChars = 2;
62 else if (frameProperties.dataSeries.rpfDataType.compareToIgnoreCase("CIB") == 0)
64 frameChars = 6;
65 versionChars = 1;
67 else
69 String message = WorldWind.retrieveErrMsg("RpfFrameFilenameUtil.UnknownRpfDataType")
70 + frameProperties.dataSeries.rpfDataType;
71 WorldWind.logger().log(FINE, message);
72 throw new IllegalArgumentException(message);
74 base34ValueOf(frameProperties.frameNumber, dest, 0, frameChars);
75 base34ValueOf(frameProperties.version, dest, frameChars, versionChars);
76 dest[7] = frameProperties.producer.id;
77 dest[8] = '.';
78 frameProperties.dataSeries.seriesCode.getChars(0, 2, dest, 9);
79 dest[11] = frameProperties.zone.zoneCode;
82 private static boolean isBase34(char[] src, int offset, int count)
84 for (int digit = offset; digit < offset + count; digit++)
86 char charUpper = Character.toUpperCase(src[digit]);
87 if (!(charUpper >= '0' && charUpper <= '9')
88 && !(charUpper >= 'A' && charUpper <= 'H')
89 && !(charUpper >= 'J' && charUpper <= 'N')
90 && !(charUpper >= 'P' && charUpper <= 'Z'))
91 return false;
93 return true;
96 /* [Section 30.6, MIL-C-89038] */
97 /* [Section A.3.6, MIL-PRF-89041A] */
98 private static int parseBase34(char[] src, int offset, int count)
100 int i = 0;
101 for (int digit = offset; digit < offset + count; digit++)
103 int index;
104 char charUpper = Character.toUpperCase(src[digit]);
105 if (charUpper >= '0' && charUpper <= '9')
106 index = charUpper - '0';
107 else if (charUpper >= 'A' && charUpper <= 'H')
108 index = 10 + charUpper - 'A';
109 else if (charUpper >= 'J' && charUpper <= 'N')
110 index = 18 + charUpper - 'J';
111 else if (charUpper >= 'P' && charUpper <= 'Z')
112 index = 23 + charUpper - 'P';
113 else
115 String message = WorldWind.retrieveErrMsg("RpfFrameFilenameUtil.Base34Error");
116 WorldWind.logger().log(FINE, message);
117 throw new IllegalArgumentException(message);
119 i = (i * 34) + index;
121 return i;
124 public static boolean isRpfFilename(String filename)
126 if (filename == null)
128 String message = WorldWind.retrieveErrMsg("nullValue.StringIsNull");
129 WorldWind.logger().log(FINE, message);
130 throw new IllegalArgumentException(message);
133 if (filename.length() != 12)
134 return false;
135 filename.getChars(0, 12, filenameArray, 0);
137 if (!isBase34(filenameArray, 0, 7))
138 return false;
139 if (!RpfProducer.isProducerId(filenameArray[7]))
140 return false;
141 if ('.' != filenameArray[8])
142 return false;
143 String seriesCode = filename.substring(9, 11);
144 if (!RpfDataSeries.isDataSeriesCode(seriesCode))
145 return false;
146 if (!RpfZone.isZoneCode(filenameArray[11]))
147 return false;
149 return true;
152 /* [Section 30.6, MIL-C-89038] */
153 /* [Section A.3.6, MIL-PRF-89041A] */
154 public static RpfFrameProperties parseFilename(String filename)
156 if (filename == null)
158 String message = WorldWind.retrieveErrMsg("nullValue.StringIsNull");
159 WorldWind.logger().log(FINE, message);
160 throw new IllegalArgumentException(message);
162 if (filename.length() != 12)
164 String message = WorldWind.retrieveErrMsg("RpfFrameFilenameUtil.BadFilenameLength") + filename;
165 WorldWind.logger().log(FINE, message);
166 throw new RpfFrameFilenameFormatException(message);
168 filename.getChars(0, 12, filenameArray, 0);
170 RpfProducer producer;
171 RpfDataSeries dataSeries;
172 RpfZone zone;
175 producer = RpfProducer.producerFor(filenameArray[7]);
176 dataSeries = RpfDataSeries.dataSeriesFor(filename.substring(9, 11));
177 zone = RpfZone.zoneFor(filenameArray[11]);
179 catch (EnumConstantNotPresentException e)
181 String message = WorldWind.retrieveErrMsg("RpfFrameFilenameUtil.EnumNotFound");
182 WorldWind.logger().log(FINE, message);
183 throw new RpfFrameFilenameFormatException(message, e);
186 int frameChars;
187 int versionChars;
188 if (dataSeries.rpfDataType.compareToIgnoreCase("CADRG") == 0)
190 frameChars = 5;
191 versionChars = 2;
193 else if (dataSeries.rpfDataType.compareToIgnoreCase("CIB") == 0)
195 frameChars = 6;
196 versionChars = 1;
198 else
200 String message = WorldWind.retrieveErrMsg("RpfFrameFilenameUtil.UnknownRpfDataType")
201 + dataSeries.rpfDataType;
202 WorldWind.logger().log(FINE, message);
203 throw new IllegalArgumentException(message);
206 int frameNumber;
207 int version;
210 frameNumber = parseBase34(filenameArray, 0, frameChars);
211 version = parseBase34(filenameArray, frameChars, versionChars);
213 catch (IllegalArgumentException e)
215 String message = WorldWind.retrieveErrMsg("RpfFrameFilenameUtil.IntegerNotParsed");
216 WorldWind.logger().log(FINE, message);
217 throw new RpfFrameFilenameFormatException(message, e);
220 return new RpfFrameProperties(zone, frameNumber, dataSeries, producer, version);