package com.isti.traceview.data;
import java.io.File;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.apache.log4j.Logger;
/**
* <p>
* This class provides space and api for work with dump trace files.
* </p>
* <p>
* TraceView has two-stage mode for handling with very big data sets. On first stage library parse
* files, then loads traces one-by-one and dumps it in temporary storage. On the second stage,
* dumped traces load very fast and don't require random access memory for row trace data keeping -
* dumped data used as disk cache.
* </p>
*
* @author Max Kokoulin
*/
public class TemporaryStorage {
private static final Logger logger = Logger.getLogger(TemporaryStorage.class);
private String tempdir = null;
private Set<File> files = null;
/**
* @param tempdir
* directory path to use as temporary files storage
*/
public TemporaryStorage(String tempdir) {
File[] dir;
this.tempdir = tempdir;
files = new HashSet<File>();
File f = new File(tempdir);
if (f.isDirectory()) {
dir = f.listFiles();
if (dir.length > 0) {
for (int i = 0; i < dir.length; i++) {
if (!dir[i].isDirectory()) {
if (SourceFile.getExtension(dir[i]).equals("sac")) {
// deletes all SAC files which stored in previous sessions by full seed
// reader
dir[i].delete();
} else if (SourceFile.getExtension(dir[i]).equals("ser")) {
files.add(dir[i]);
logger.debug("Tepmorary file added: " + dir[i].getName());
}
}
}
}
}
Runtime.getRuntime().addShutdownHook(new ClearTempShutDownHook());
}
/**
* @return a Set of strings listing full paths to temp files
*/
public Set<String> getAllTempFiles() {
Set<String> ret = new HashSet<String>();
for (File file: files) {
if (SourceFile.matchFilters(getFileNetwork(file), getFileStation(file), getFileLocation(file), getFileChannel(file))) {
ret.add(tempdir + File.separator + file.getName());
}
}
return ret;
}
public String getTempDir() {
return tempdir;
}
public void addTempFile(File file) {
files.add(file);
}
public void delTempFile(File file) {
files.remove(file);
file.delete();
try {
new File(getDataFileName(file.getName())).delete();
} catch (Exception e) {
// do nothing
logger.error("Exception:", e);
}
file = null;
}
/**
* Deletes temporary files with given extension. If extension omitted, deletes all temp files.
*
*/
public void delAllTempFiles() {
Iterator<File> it = files.iterator();
while (it.hasNext()) {
File file = it.next();
it.remove();
file.delete(); // deleting serial file
try { // deleting datafile, if exist
new File(tempdir + File.separator + getDataFileName(file.getName())).delete();
} catch (Exception e) {
logger.error("Exception:", e);
}
file = null;
}
}
public static String getDataFileName(String serialFileName) {
return serialFileName.substring(0, serialFileName.indexOf(".SER")) + ".DATA";
}
/**
* @param channel
* trace
* @return Name of file to serialize given trace
*/
public String getSerialFileName(Channel channel) {
return getTempDir() + File.separator + channel.getNetworkName() + "." + channel.getStation().getName() + "." + channel.getLocationName()
+ "." + channel.getChannelName();
}
private String getFileNetwork(File file) {
String[] parts = file.getName().split("\\.");
return parts[0];
}
private String getFileStation(File file) {
String[] parts = file.getName().split("\\.");
return parts[1];
}
private String getFileLocation(File file) {
String[] parts = file.getName().split("\\.");
return parts[2];
}
private String getFileChannel(File file) {
String[] parts = file.getName().split("\\.");
return parts[3];
}
/**
* Clears temporary storage area after program shutdown.
*
* @author Max
*/
class ClearTempShutDownHook extends Thread {
public void run() {
File[] dir;
File f = new File(tempdir);
if (f.isDirectory()) {
dir = f.listFiles();
if (dir.length > 0) {
for (int i = 0; i < dir.length; i++) {
if (!dir[i].isDirectory()) {
if (SourceFile.getExtension(dir[i]).equals("sac")) {
// deletes all SAC files which stored in this session by full seed
// reader
dir[i].delete();
}
}
}
}
}
}
}
}
/*
* class TempChannel { private String channelName; private String station; private String
* locationName; private String networkName; private File tempFile; private Set<String> datafiles; }
*/