001/*
002 * $Id: EnviInfo.java,v 1.4 2011/03/24 16:06:32 davep Exp $
003 *
004 * This file is part of McIDAS-V
005 *
006 * Copyright 2007-2011
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 */
030package edu.wisc.ssec.mcidasv.data;
031
032import java.io.BufferedReader;
033import java.io.File;
034import java.io.FileReader;
035import java.util.ArrayList;
036import java.util.Hashtable;
037import java.util.List;
038
039public class EnviInfo extends HeaderInfo {
040
041        /** The url */
042        private String dataFile = "";
043        private boolean isEnvi = false;
044
045        /**
046         * Ctor for xml encoding
047         */
048        public EnviInfo() {}
049
050        /**
051         * CTOR
052         *
053         * @param filename The filename
054         */
055        public EnviInfo(File thisFile) {
056                this(thisFile.getAbsolutePath());
057        }
058        
059        /**
060         * CTOR
061         *
062         * @param filename The filename
063         */
064        public EnviInfo(String filename) {
065                super(filename);
066                this.dataFile = filename.replace(".hdr", ".img");
067        }
068
069        /**
070         * Is the file an ENVI header file?
071         */
072        public boolean isEnviHeader() {
073                parseHeader();
074                return isEnvi;
075        }
076
077        /**
078         * Can we find a matching ENVI data file?
079         */
080        public boolean hasEnviData() {
081                File testFile = new File(dataFile);
082                if (testFile.exists()) return true;
083                else return false;
084        }
085
086        /**
087         * Is this a navigation header file?
088         */
089        public boolean isNavHeader() {
090                parseHeader();
091                List bandNames = (List)getParameter(BANDNAMES, new ArrayList());
092                if (bandNames == null) return false;
093                if (bandNames.contains("Latitude") && bandNames.contains("Longitude")) return true;
094                return false;
095        }
096
097        /**
098         * Which band/file is latitude?
099         */
100        public int getLatBandNum() {
101                parseHeader();
102                List bandNames = (List)getParameter(BANDNAMES, new ArrayList());
103                for (int i=0; i<bandNames.size(); i++) {
104                        if (bandNames.get(i).equals("Latitude")) return i+1;
105                }
106                return -1;
107        }
108        public String getLatBandFile() {
109                parseHeader();
110                List bandFiles = (List)getParameter(BANDFILES, new ArrayList());
111                int bandNum = getLatBandNum();
112                if (bandNum < 0) return "";
113                return (String)(bandFiles.get(bandNum-1));
114        }
115
116        /**
117         * Which band/file is longitude?
118         */
119        public int getLonBandNum() {
120                parseHeader();
121                List bandNames = (List)getParameter(BANDNAMES, new ArrayList());
122                for (int i=0; i<bandNames.size(); i++) {
123                        if (bandNames.get(i).equals("Longitude")) return i+1;
124                }
125                return -1;
126        }
127        public String getLonBandFile() {
128                parseHeader();
129                List bandFiles = (List)getParameter(BANDFILES, new ArrayList());
130                int bandNum = getLonBandNum();
131                if (bandNum < 0) return "";
132                return (String)(bandFiles.get(bandNum-1));
133        }
134
135        /**
136         * Return a FlatField representing the data
137         */
138//      public FlatField getDataField() {
139//
140//      }
141
142        /**
143         * Return a Gridded2DSet representing navigation
144         */
145//      public Gridded2DSet getNavField() {
146//
147//      }
148
149        /**
150         * Parse a potential ENVI header file
151         */
152        protected void parseHeader() {
153                if (haveParsed()) return;
154                if (!doesExist()) {
155                        isEnvi = false;
156                        return;
157                }
158
159                try {
160                        BufferedReader br = new BufferedReader(new FileReader(getFilename()));
161                        String line;
162                        String parameter = "";
163                        String value = "";
164                        boolean inValue = false;
165
166                        List bandNames = new ArrayList();
167                        List bandFiles = new ArrayList();
168
169                        while ((line = br.readLine()) != null) {
170                                if (line.trim().equals("ENVI")) {
171                                        isEnvi = true;
172                                        continue;
173                                }
174                                if (!isEnvi) break;
175
176                                int indexOfEquals = line.indexOf("=");
177                                int indexOfOpen = line.indexOf("{");
178                                int indexOfClose = line.indexOf("}");
179                                if (indexOfEquals >= 0) {
180                                        parameter = line.substring(0, indexOfEquals).trim();
181                                        value = "";
182                                        inValue = false;
183                                }
184                                if (indexOfOpen >= 0) {
185                                        if (indexOfClose >= 0) {
186                                                value += line.substring(indexOfOpen+1, indexOfClose).trim();
187                                                inValue = false;
188                                        }
189                                        else {
190                                                value += line.substring(indexOfOpen+1).trim();
191                                                inValue = true;
192                                                continue;
193                                        }
194                                }
195                                else if (inValue) {
196                                        if (indexOfClose >= 0) {
197                                                value += line.substring(0, indexOfClose).trim();
198                                                inValue = false;
199                                        }
200                                        else {
201                                                value += line.trim();
202                                                continue;
203                                        }
204                                }
205                                else {
206                                        value += line.substring(indexOfEquals+1).trim();
207                                }
208
209                                if (parameter.equals("")) continue;
210
211                                if (parameter.equals("description")) {
212                                        setParameter(DESCRIPTION, value);
213                                }
214                                else if (parameter.equals("samples")) {
215                                        setParameter(ELEMENTS, Integer.parseInt(value));
216                                }
217                                else if (parameter.equals("lines")) {
218                                        setParameter(LINES, Integer.parseInt(value));
219                                }
220                                else if (parameter.equals("header offset")) {
221                                        setParameter(OFFSET, Integer.parseInt(value));
222                                }
223                                else if (parameter.equals("data type")) {
224                                        setParameter(DATATYPE, Integer.parseInt(value));
225                                }
226                                else if (parameter.equals("data ignore value") ||
227                                                parameter.equals("bad value")) {
228                                        setParameter(MISSINGVALUE, Float.parseFloat(value));                            
229                                }
230                                else if (parameter.equals("interleave")) {
231                                        setParameter(INTERLEAVE, value.toUpperCase());
232                                }
233                                else if (parameter.equals("byte order")) {
234                                        boolean bigEndian = false;
235                                        if (value.equals("1")) bigEndian = true;
236                                        setParameter(BIGENDIAN, bigEndian);
237                                }
238                                else if (parameter.equals("bands")) {
239                                        if (bandNames.size() <= 0 && bandFiles.size() <= 0) {
240                                                int bandCount = Integer.parseInt(value);
241                                                for (int i=0; i<bandCount; i++) {
242                                                        bandNames.add("Band " + i+1);
243                                                        bandFiles.add(dataFile);
244                                                }
245                                                setParameter(BANDNAMES, bandNames);
246                                                setParameter(BANDFILES, bandFiles);
247                                        }
248                                }
249                                else if (parameter.equals("band names")) {
250                                        bandNames = new ArrayList();
251                                        bandFiles = new ArrayList();
252                                        String[] bandNamesSplit = value.split(",");
253                                        for (int i=0; i<bandNamesSplit.length; i++) {
254                                                bandNames.add(bandNamesSplit[i].trim());
255                                                bandFiles.add(dataFile);
256                                        }
257                                        setParameter(BANDNAMES, bandNames);
258                                        setParameter(BANDFILES, bandFiles);
259                                }
260
261                        }
262                        br.close();
263                }
264                catch (Exception e) {
265                        e.printStackTrace();
266                }
267
268        }
269
270}