/*
* Copyright (C) 2015 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.ceos;
import org.esa.s1tbx.io.binary.BinaryDBReader;
import org.esa.s1tbx.io.binary.BinaryFileReader;
import org.esa.s1tbx.io.binary.BinaryRecord;
import org.esa.snap.core.datamodel.MetadataElement;
import org.esa.snap.core.util.StringUtils;
import org.jdom2.Document;
import java.io.IOException;
/**
* This class represents a volume directory file of a product.
*/
public class CEOSVolumeDirectoryFile {
private BinaryRecord volumeDescriptorRecord;
private FilePointerRecord[] filePointerRecords;
private BinaryRecord textRecord;
private final static String volume_desc_recordDefinitionFile = "volume_descriptor.xml";
private final static String filePointerDefinitionFile = "file_pointer_record.xml";
private final static String text_recordDefinitionFile = "text_record.xml";
private static Document volDescXML;
private static Document filePointerXML;
private static Document textRecXML;
public CEOSVolumeDirectoryFile(final BinaryFileReader binaryReader, final String mission) throws IOException {
if (volDescXML == null)
volDescXML = BinaryDBReader.loadDefinitionFile(mission, volume_desc_recordDefinitionFile);
volumeDescriptorRecord = new BinaryRecord(binaryReader, -1, volDescXML, volume_desc_recordDefinitionFile);
}
public void readFilePointersAndTextRecords(final BinaryFileReader binaryReader, final String mission) throws IOException {
try {
if (filePointerXML == null)
filePointerXML = BinaryDBReader.loadDefinitionFile(mission, filePointerDefinitionFile);
filePointerRecords = readFilePointers(volumeDescriptorRecord, filePointerXML, filePointerDefinitionFile);
} catch (Exception e) {
System.out.println("Error reading file pointer record: " + e.getMessage());
}
try {
if (textRecXML == null)
textRecXML = BinaryDBReader.loadDefinitionFile(mission, text_recordDefinitionFile);
textRecord = new BinaryRecord(binaryReader, -1, textRecXML, text_recordDefinitionFile);
} catch (Exception e) {
System.out.println("Error reading text record: " + e.getMessage());
}
}
public BinaryRecord getTextRecord() {
return textRecord;
}
public BinaryRecord getVolumeDescriptorRecord() {
return volumeDescriptorRecord;
}
public String getProductName() {
return getProductName(textRecord);
}
public String getProductType() {
return getProductType(textRecord);
}
public void assignMetadataTo(final MetadataElement rootElem) {
CeosHelper.addMetadata(rootElem, volumeDescriptorRecord, "Volume Descriptor");
CeosHelper.addMetadata(rootElem, textRecord, "Text Record");
int i = 1;
for (FilePointerRecord fp : filePointerRecords) {
CeosHelper.addMetadata(rootElem, fp, "File Pointer Record " + i++);
}
}
public static FilePointerRecord[] readFilePointers(final BinaryRecord vdr, final Document filePointerXML,
final String recName) throws IOException {
final int numFilePointers = vdr.getAttributeInt("Number of filepointer records");
final BinaryFileReader reader = vdr.getReader();
reader.seek(vdr.getRecordLength());
final FilePointerRecord[] filePointers = new FilePointerRecord[numFilePointers];
for (int i = 0; i < numFilePointers; i++) {
filePointers[i] = new FilePointerRecord(reader, filePointerXML, recName);
}
return filePointers;
}
public static String getProductName(final BinaryRecord textRecord) {
if (textRecord == null) return "unknown";
final String name = textRecord.getAttributeString("Product type specifier").trim().replace("PRODUCT:", "")
+ '-' + textRecord.getAttributeString("Scene identification").trim();
return StringUtils.createValidName(name.trim(), new char[]{'_', '-'}, '_');
}
public static String getProductType(final BinaryRecord textRecord) {
if (textRecord == null) return "unknown";
String type = textRecord.getAttributeString("Product type specifier").trim();
type = type.replace("PRODUCT:", "");
type = type.replace("JERS-1", "JERS1");
type = type.replace("JERS_1", "JERS1");
type = type.replace("ERS-1", "ERS1");
type = type.replace("ERS_1", "ERS1");
type = type.replace("ERS-2", "ERS2");
type = type.replace("ERS_2", "ERS2");
return type.trim();
}
}