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 }