package edu.sc.seis.sod.subsetter;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URI;
import java.net.URISyntaxException;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import edu.iris.Fissures.Location;
import edu.sc.seis.fissuresUtil.bag.AreaUtil;
import edu.sc.seis.fissuresUtil.display.configuration.DOMHelper;
import edu.sc.seis.sod.ConfigurationException;
import edu.sc.seis.sod.SodUtil;
import edu.sc.seis.sod.Start;
import edu.sc.seis.sod.UserConfigurationException;
public class AreaSubsetter {
public AreaSubsetter(Element config) throws ConfigurationException {
String fileLocation = DOMHelper.extractText(config, "polygonFile", "");
if (fileLocation.equals("")) {
NodeList children = config.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
Node node = children.item(i);
if (node instanceof Element) {
area = (edu.iris.Fissures.Area)SodUtil.load((Element)node, "");
break;
}
}
} else {
locationArray = extractPolygon(fileLocation);
}
}
public static Location[] extractPolygon(String fileLocation) throws ConfigurationException {
Location[] locs;
try {
locs = AreaUtil.loadPolygon(makeRelativeOrRecipeDirReader(fileLocation));
} catch(FileNotFoundException e) {
throw new UserConfigurationException(e.getMessage() + " as a polygon file.");
} catch(IOException e) {
throw new ConfigurationException("Problem reading from file " + fileLocation, e);
}
for (int i = 0; i < locs.length; i++) {
LatitudeRange.check(locs[i].latitude, fileLocation);
LongitudeRange.sanitize(locs[i].longitude, fileLocation);
}
return locs;
}
public static BufferedReader makeRelativeOrRecipeDirReader(String fileLocation) throws FileNotFoundException {
fileLocation = fileLocation.trim();
if (fileLocation.contains(":")) {
try {
URI uri = new URI(fileLocation);
if (uri.getScheme() != null && uri.isAbsolute()) {
return new BufferedReader(new InputStreamReader(uri.toURL().openStream()));
}
} catch(URISyntaxException e1) {
// not a uri, try as simple file
} catch(IOException e) {
// not a uri, try as simple file
}
}
File simpleLocation = new File(fileLocation);
Reader fileInput;
try {
fileInput = new FileReader(simpleLocation);
} catch(FileNotFoundException e) {
File inConfigDir = new File(new File(Start.getConfigFileName()).getParentFile(), fileLocation);
try {
fileInput = new FileReader(inConfigDir);
} catch(FileNotFoundException e2) {
throw new FileNotFoundException("Unable to find as URL or '" + simpleLocation + "' or '" + inConfigDir
+ "'");
}
}
return new BufferedReader(fileInput);
}
public boolean accept(Location loc) {
if (locationArray != null) {
return AreaUtil.inArea(locationArray, loc);
}
return AreaUtil.inArea(area, loc);
}
protected edu.iris.Fissures.Area area = null;
protected Location[] locationArray;
}