/*
* Copyright (C) 2016 by Array Systems Computing Inc. http://www.array.ca
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option)
* any later version.
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, see http://www.gnu.org/licenses/
*/
package org.esa.s1tbx.io.gamma.header;
import org.esa.snap.core.datamodel.MetadataElement;
import org.esa.snap.core.datamodel.ProductData;
import org.esa.snap.core.util.StringUtils;
import org.esa.snap.engine_utilities.datamodel.AbstractMetadata;
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.ByteOrder;
import java.text.DateFormat;
import java.util.Map;
public class Header {
private static final String UNKNOWN_SENSOR_TYPE = "Unknown Sensor Type";
private final HeaderParser headerParser;
private final DateFormat dateFormat = ProductData.UTC.createDateFormat("yyyy-MM-dd-SSSSSSSS");
public Header(final BufferedReader reader) throws IOException {
headerParser = HeaderParser.parse(reader);
}
public ByteOrder getJavaByteOrder() {
if (getByteOrder() == 0) {
return ByteOrder.BIG_ENDIAN;
} else {
return ByteOrder.LITTLE_ENDIAN;
}
}
public String getName() {
return headerParser.getString(GammaConstants.HEADER_KEY_NAME, "");
}
public int getNumSamples() {
int val = headerParser.getInt(GammaConstants.HEADER_KEY_SAMPLES, 0);
if (val == 0) {
val = headerParser.getInt(GammaConstants.HEADER_KEY_SAMPLES1, 0);
}
if (val == 0) {
val = headerParser.getInt(GammaConstants.HEADER_KEY_WIDTH, 0);
}
if (val == 0) {
val = headerParser.getInt(GammaConstants.HEADER_KEY_NCOLUMNS);
}
return val;
}
public int getNumLines() {
int val = headerParser.getInt(GammaConstants.HEADER_KEY_LINES, 0);
if (val == 0) {
val = headerParser.getInt(GammaConstants.HEADER_KEY_LINES1, 0);
}
if (val == 0) {
val = headerParser.getInt(GammaConstants.HEADER_KEY_HEIGHT, 0);
}
if (val == 0) {
val = headerParser.getInt(GammaConstants.HEADER_KEY_NLINES);
}
return val;
}
public int getNumBands() {
return headerParser.getInt(GammaConstants.HEADER_KEY_BANDS, 0);
}
public int getHeaderOffset() {
return headerParser.getInt(GammaConstants.HEADER_KEY_HEADER_OFFSET, 0);
}
public String getDataType() {
return headerParser.getString(GammaConstants.HEADER_KEY_DATA_TYPE, "Unknown");
}
public String getSensorType() {
return headerParser.getString(GammaConstants.HEADER_KEY_SENSOR_TYPE, UNKNOWN_SENSOR_TYPE);
}
public int getByteOrder() {
return headerParser.getInt(GammaConstants.HEADER_KEY_BYTE_ORDER, 0);
}
public String[] getBandNames() {
return headerParser.getStrings(GammaConstants.HEADER_KEY_BAND_NAMES);
}
public String getDescription() {
return headerParser.getString(GammaConstants.HEADER_KEY_DESCRIPTION, null);
}
public double getRadarFrequency() {
return headerParser.getDouble(GammaConstants.HEADER_KEY_RADAR_FREQUENCY, 0);
}
public double getPRF() {
return headerParser.getDouble(GammaConstants.HEADER_KEY_PRF, 0);
}
public int getRangeLooks() {
return headerParser.getInt(GammaConstants.HEADER_KEY_RANGE_LOOKS, 1);
}
public int getAzimuthLooks() {
return headerParser.getInt(GammaConstants.HEADER_KEY_AZIMUTH_LOOKS, 1);
}
public double getLineTimeInterval() {
return headerParser.getDouble((GammaConstants.HEADER_KEY_LINE_TIME_INTERVAL), 0);
}
public ProductData.UTC getStartTime() {
String timeStr = null;
final String dateStr = headerParser.getString(GammaConstants.HEADER_KEY_DATE, null);
if (dateStr != null) {
String[] dateValues = StringUtils.split(dateStr, new char[]{' '}, true);
if (dateValues.length > 2) {
String year = dateValues[0];
String month = dateValues[1];
String day = dateValues[2];
double startTime = headerParser.getDouble(GammaConstants.HEADER_KEY_START_TIME);
timeStr = year + '-' + month + '-' + day + '-' + startTime;
}
}
return AbstractMetadata.parseUTC(timeStr, dateFormat);
}
public ProductData.UTC getEndTime() {
String timeStr = null;
final String dateStr = headerParser.getString(GammaConstants.HEADER_KEY_DATE, null);
if (dateStr != null) {
String[] dateValues = StringUtils.split(dateStr, new char[]{' '}, true);
if (dateValues.length > 2) {
String year = dateValues[0];
String month = dateValues[1];
String day = dateValues[2];
double endTime = headerParser.getDouble(GammaConstants.HEADER_KEY_END_TIME);
timeStr = year + '-' + month + '-' + day + '-' + endTime;
}
}
return AbstractMetadata.parseUTC(timeStr, dateFormat);
}
public MetadataElement getAsMetadata() {
MetadataElement headerElem = new MetadataElement("Header");
for (Map.Entry<String, String> entry : headerParser.getHeaderEntries()) {
// empty strings are not allowed
String value = entry.getValue().isEmpty() ? " " : entry.getValue();
headerElem.setAttributeString(entry.getKey(), value);
}
return headerElem;
}
}