2 Copyright (C) 2001, 2006 United States Government as represented by
3 the Administrator of the National Aeronautics and Space Administration.
6 package gov
.nasa
.worldwind
.formats
.rpf
;
8 import gov
.nasa
.worldwind
.*;
10 import static java
.util
.logging
.Level
.*;
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];
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
)
57 if (frameProperties
.dataSeries
.rpfDataType
.compareToIgnoreCase("CADRG") == 0)
62 else if (frameProperties
.dataSeries
.rpfDataType
.compareToIgnoreCase("CIB") == 0)
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
;
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'))
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
)
101 for (int digit
= offset
; digit
< offset
+ count
; digit
++)
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';
115 String message
= WorldWind
.retrieveErrMsg("RpfFrameFilenameUtil.Base34Error");
116 WorldWind
.logger().log(FINE
, message
);
117 throw new IllegalArgumentException(message
);
119 i
= (i
* 34) + index
;
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)
135 filename
.getChars(0, 12, filenameArray
, 0);
137 if (!isBase34(filenameArray
, 0, 7))
139 if (!RpfProducer
.isProducerId(filenameArray
[7]))
141 if ('.' != filenameArray
[8])
143 String seriesCode
= filename
.substring(9, 11);
144 if (!RpfDataSeries
.isDataSeriesCode(seriesCode
))
146 if (!RpfZone
.isZoneCode(filenameArray
[11]))
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
;
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
);
188 if (dataSeries
.rpfDataType
.compareToIgnoreCase("CADRG") == 0)
193 else if (dataSeries
.rpfDataType
.compareToIgnoreCase("CIB") == 0)
200 String message
= WorldWind
.retrieveErrMsg("RpfFrameFilenameUtil.UnknownRpfDataType")
201 + dataSeries
.rpfDataType
;
202 WorldWind
.logger().log(FINE
, message
);
203 throw new IllegalArgumentException(message
);
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
);