001    /*
002     * $Id: AxformInfo.java,v 1.8 2012/02/19 17:35:45 davep Exp $
003     *
004     * This file is part of McIDAS-V
005     *
006     * Copyright 2007-2012
007     * Space Science and Engineering Center (SSEC)
008     * University of Wisconsin - Madison
009     * 1225 W. Dayton Street, Madison, WI 53706, USA
010     * https://www.ssec.wisc.edu/mcidas
011     * 
012     * All Rights Reserved
013     * 
014     * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
015     * some McIDAS-V source code is based on IDV and VisAD source code.  
016     * 
017     * McIDAS-V is free software; you can redistribute it and/or modify
018     * it under the terms of the GNU Lesser Public License as published by
019     * the Free Software Foundation; either version 3 of the License, or
020     * (at your option) any later version.
021     * 
022     * McIDAS-V is distributed in the hope that it will be useful,
023     * but WITHOUT ANY WARRANTY; without even the implied warranty of
024     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
025     * GNU Lesser Public License for more details.
026     * 
027     * You should have received a copy of the GNU Lesser Public License
028     * along with this program.  If not, see http://www.gnu.org/licenses.
029     */
030    package edu.wisc.ssec.mcidasv.data;
031    
032    import java.io.BufferedReader;
033    import java.io.File;
034    import java.io.FileReader;
035    import java.util.ArrayList;
036    import java.util.Hashtable;
037    import java.util.List;
038    
039    public class AxformInfo extends HeaderInfo {
040    
041            /** The url */
042            private String dataFile = "";
043            private boolean isAxform = false;
044    
045            /**
046             * Ctor for xml encoding
047             */
048            public AxformInfo() {}
049    
050            /**
051             * CTOR
052             *
053             * @param filename The filename
054             */
055            public AxformInfo(File thisFile) {
056                    this(thisFile.getAbsolutePath());
057            }
058    
059            /**
060             * CTOR
061             *
062             * @param filename The filename
063             */
064            public AxformInfo(String filename) {
065                    super(filename);
066            }
067    
068            /**
069             * Is the file an AXFORM header file?
070             */
071            public boolean isAxformInfoHeader() {
072                    parseHeader();
073                    return isAxform;
074            }
075            
076            /**
077             * Which band/file is latitude?
078             */
079            public int getLatBandNum() {
080                    return 1;
081            }
082            public String getLatBandFile() {
083                    parseHeader();
084                    List bandFiles = (List)getParameter(NAVFILES, new ArrayList());
085                    if (bandFiles.size()!=2) return "";
086                    return (String)(bandFiles.get(0));
087            }
088    
089            /**
090             * Which band/file is longitude?
091             */
092            public int getLonBandNum() {
093                    return 1;
094            }
095            public String getLonBandFile() {
096                    parseHeader();
097                    List bandFiles = (List)getParameter(NAVFILES, new ArrayList());
098                    if (bandFiles.size()!=2) return "";
099                    return (String)(bandFiles.get(1));
100            }
101    
102            /**
103             * Parse a potential AXFORM header file
104             */
105            protected void parseHeader() {
106                    if (haveParsed()) return;
107                    if (!doesExist()) {
108                            isAxform = false;
109                            return;
110                    }
111    
112                    try {
113                            BufferedReader br = new BufferedReader(new FileReader(getFilename()));
114                            int lineNum = 0;
115                            String line;
116                            String description = "";
117                            boolean gotFiles = false;
118                            
119                            List bandNames = new ArrayList();
120                            List bandFiles = new ArrayList();
121                            
122                            String latFile = "";
123                            String lonFile = "";
124                            File thisFile = new File(getFilename());
125                            String parent = thisFile.getParent();
126                            if (parent==null) parent=".";
127    
128                            while ((line = br.readLine()) != null) {
129                                    lineNum++;
130                                    if (line.trim().equals("Space Science & Engineering Center")) {
131                                            isAxform = true;
132                                            continue;
133                                    }
134                                    if (!isAxform) break;
135    
136                                    if (line.length() < 80) {
137                                            if (lineNum > 15) gotFiles = true;
138                                            continue;
139                                    }
140    
141                                    // Process the description from lines 5 and 6
142                                    if (lineNum==5) {
143                                            description += line.substring(13, 41).trim();
144                                    }
145                                    else if (lineNum==6) {
146                                            description += " " + line.substring(14, 23).trim() +" " + line.substring(59, 71).trim();
147                                            setParameter(DESCRIPTION, description);
148                                    }
149    
150                                    // Process the file list starting at line 15
151                                    else if (lineNum>=15 && !gotFiles) {
152                                            String parameter = line.substring(0, 13).trim();
153                                            if (parameter.equals("Header")) {
154                                                    isAxform = true;
155                                            }
156                                            else if (parameter.equals("Latitude")) {
157                                                    latFile = parent + "/" + line.substring(66).trim();
158                                            }
159                                            else if (parameter.equals("Longitude")) {
160                                                    lonFile = parent + "/" + line.substring(66).trim();
161                                            }
162                                            else {
163                                                    setParameter(LINES, Integer.parseInt(line.substring(24, 31).trim()));
164                                                    setParameter(ELEMENTS, Integer.parseInt(line.substring(32, 40).trim()));
165                                                    setParameter(UNIT, parameter);
166                                                    String band = line.substring(19, 23).trim();
167                                                    String format = line.substring(41, 59).trim();
168                                                    System.out.println("looking at format line: " + format);
169                                                    if (format.indexOf("ASCII") >= 0) {
170                                                            setParameter(DATATYPE, kFormatASCII);
171                                                    }
172                                                    else if (format.indexOf("8 bit") >= 0) {
173                                                            setParameter(DATATYPE, kFormat1ByteUInt);
174                                                    }
175                                                    else if (format.indexOf("16 bit") >= 0) {
176                                                            setParameter(DATATYPE, kFormat2ByteSInt);
177                                                    }
178                                                    else if (format.indexOf("32 bit") >= 0) {
179                                                            setParameter(DATATYPE, kFormat4ByteSInt);
180                                                    }
181                                                    String filename = line.substring(66).trim();
182                                                    filename = parent + "/" + filename;
183                                                    bandFiles.add(filename);
184                                                    bandNames.add("Band " + band);
185                                            }
186                                    }
187    
188                                    // Look for the missing value, bail when you find it
189                                    else if (gotFiles) {
190                                            if (line.indexOf("Navigation files missing data value") >= 0) {
191                                                    setParameter(MISSINGVALUE, Float.parseFloat(line.substring(44, 80).trim()));                            
192                                                    break;
193                                            }
194                                    }
195    
196                                    setParameter(BANDNAMES, bandNames);
197                                    setParameter(BANDFILES, bandFiles);
198                                    
199                                    List latlonFiles = new ArrayList();
200                                    latlonFiles.add(latFile);
201                                    latlonFiles.add(lonFile);
202                                    setParameter(NAVFILES, latlonFiles);
203    
204                            }
205                            br.close();
206                    }
207                    catch (Exception e) {
208                            e.printStackTrace();
209                    }
210    
211            }
212    
213    }