001/*
002 * $Id: HeaderInfo.java,v 1.5 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.File;
033import java.util.ArrayList;
034import java.util.Hashtable;
035import java.util.List;
036
037public class HeaderInfo {
038
039        // Enumerate some constants
040        public static final int kFormatUnknown = -1;
041        public static final int kFormatASCII = 0;
042        public static final int kFormat1ByteUInt = 1;
043        public static final int kFormat2ByteSInt = 2;
044        public static final int kFormat4ByteSInt = 3;
045        public static final int kFormat4ByteFloat = 4;
046        public static final int kFormat8ByteDouble = 5;
047        public static final int kFormat2x8Byte = 9;
048        public static final int kFormat2ByteUInt = 12;
049        public static final int kFormatImage = 8080;
050        
051        public static final int kNavigationUnknown = -1;
052        public static final int kNavigationBounds = 1;
053        public static final int kNavigationFiles = 2;
054        
055        public static final String kInterleaveSequential = "BSQ";
056        public static final String kInterleaveByLine = "BIL";
057        public static final String kInterleaveByPixel = "BIP";
058
059        public static final String DESCRIPTION = "description";
060        public static final String ELEMENTS = "elements";
061        public static final String LINES = "lines";
062        public static final String UNIT = "unit";
063        public static final String OFFSET = "offset";
064        public static final String DATATYPE = "dataType";
065        public static final String MISSINGVALUE = "missingValue";
066        public static final String BANDNAMES = "bandNames";
067        public static final String BANDFILES = "bandFiles";
068        public static final String INTERLEAVE = "interleave";
069        public static final String BYTEORDER = "byteOrder";
070        public static final String BIGENDIAN = "bigEndian";
071        public static final String NAVBOUNDS = "navBounds";
072        public static final String NAVFILES = "navFiles";
073
074        /** The url */
075        private String headerFile = "";
076        private Hashtable parameters = new Hashtable();
077
078        /**
079         * Ctor for xml encoding
080         */
081        public HeaderInfo() {}
082
083        /**
084         * CTOR
085         *
086         * @param filename The filename
087         */
088        public HeaderInfo(File thisFile) {
089                this(thisFile.getAbsolutePath());
090        }
091        
092        /**
093         * CTOR
094         *
095         * @param filename The filename
096         */
097        public HeaderInfo(String filename) {
098                setFilename(filename);
099        }
100        
101        /**
102         * Set the filename we are working with
103         */
104        public void setFilename(String filename) {
105                parameters = new Hashtable();
106                headerFile = filename;
107        }
108        
109        /**
110         * Get the filename we are working with
111         */
112        public String getFilename() {
113                return headerFile;
114        }
115        
116        /**
117         * Get the number of bands this header knows about
118         */
119        public int getBandCount() {
120                if (!haveParsed()) {
121                        parseHeader();
122                }
123                List bandNames = getParameter(BANDNAMES, new ArrayList());
124                return bandNames.size();
125        }
126                
127        /**
128         * Return the matching header parameter if available, default value if not available
129         */
130        public String getParameter(String parameter, String defaultValue) {
131                parseHeader();
132                Object hashedValue = parameters.get(parameter);
133                if (hashedValue == null || !(hashedValue instanceof String)) return defaultValue;
134                return (String)hashedValue;
135        }
136        public Integer getParameter(String parameter, Integer defaultValue) {
137                parseHeader();
138                Object hashedValue = parameters.get(parameter);
139                if (hashedValue == null || !(hashedValue instanceof Integer)) return defaultValue;
140                return (Integer)hashedValue;
141        }
142        public Float getParameter(String parameter, Float defaultValue) {
143                parseHeader();
144                Object hashedValue = parameters.get(parameter);
145                if (hashedValue == null || !(hashedValue instanceof Float)) return defaultValue;
146                return (Float)hashedValue;
147        }
148        public Boolean getParameter(String parameter, Boolean defaultValue) {
149                parseHeader();
150                Object hashedValue = parameters.get(parameter);
151                if (hashedValue == null || !(hashedValue instanceof Boolean)) return defaultValue;
152                return (Boolean)hashedValue;
153        }
154        public List getParameter(String parameter, List defaultValue) {
155                parseHeader();
156                Object hashedValue = parameters.get(parameter);
157                if (hashedValue == null || !(hashedValue instanceof List)) return defaultValue;
158                return (List)hashedValue;
159        }
160        
161        /**
162         * Set a parsed parameter value
163         */
164        public void setParameter(String parameter, Object value) {
165                parameters.put(parameter, value);
166        }
167        
168        /**
169         * Have we already parsed once?
170         */
171        public boolean haveParsed() {
172                return parameters.size() > 0;
173        }
174        
175        /**
176         * Does the file we are pointing to even exist?
177         */
178        public boolean doesExist() {
179                File checkFile = new File(headerFile);
180                return checkFile.exists();
181        }
182        
183        /**
184         * Override this when extending for a specific header type
185         */
186        protected void parseHeader() {}
187        
188}