package jeql.command.io.kml;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import jeql.api.error.ExecutionException;
import jeql.io.InputSource;
import jeql.util.StringUtil;
public class KMLFileSource {
private String srcName;
public KMLFileSource(String srcName) {
this.srcName = srcName;
}
public String getSourceName()
{
return srcName;
}
public Reader createReader()
{
InputStream stream;
try {
if (StringUtil.endsWithIgnoreCase(srcName, ".kmz")) {
stream = createKMZStreamUnchecked();
}
else {
stream = createStreamUnchecked();
}
}
catch (Exception ex) {
throw new ExecutionException(ex);
}
return new InputStreamReader(stream);
}
private InputStream createStreamUnchecked() throws Exception {
// TODO: handle protocols in case-insensitive way
// TODO: add more protocol checks (or pattern?)
if (StringUtil.startsWithIgnoreCase(srcName, InputSource.PROTOCOL_HTTP)) {
URL url = new URL(srcName);
return url.openStream();
}
// default: assume srcName refers to file
return new FileInputStream(srcName);
}
private InputStream createKMZStreamUnchecked() throws Exception
{
InputStream baseStream = createStreamUnchecked();
ZipInputStream zipStream = new ZipInputStream(baseStream);
ZipEntry entry = null;
while (true)
{
entry = zipStream.getNextEntry();
if (entry == null)
break;
return zipStream;
}
return null;
}
}