package org.rr.commons.mufs; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.Date; import org.apache.commons.io.IOUtils; import org.rr.commons.io.HttpInputStream; public class URLResourceHandler extends AResourceHandler { URL url; ArrayList<InputStream> inStream = new ArrayList<>(2); ArrayList<OutputStream> outStream = new ArrayList<>(2); URLResourceHandler() { super(); } private URLResourceHandler(URL url) { this.url = url; } @Override public boolean isValidResource(String resource) { if(resource != null && (resource.startsWith("http://") || resource.startsWith("https://"))) { try { new URL(resource); return true; } catch (Exception e) { } } return false; } @Override public IResourceHandler createInstance(String resource) throws IOException { return new URLResourceHandler(new URL(resource)); } @Override public String getResourceString() { return url.toString(); } @Override public ResourceHandlerInputStream getContentInputStream() throws IOException { ResourceHandlerInputStream result; if(url.getProtocol().equals("http")) { result = new ResourceHandlerInputStream(this, new HttpInputStream(url)); } else { URLConnection connection = url.openConnection(); if(connection instanceof HttpURLConnection) { ((HttpURLConnection) connection).setConnectTimeout(10 * 1000); //10 sec timeout ((HttpURLConnection) connection).setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)"); } connection.connect(); InputStream inputStream = connection.getInputStream(); result = new ResourceHandlerInputStream(this, inputStream); inStream.add(inputStream); } return result; } @Override public OutputStream getContentOutputStream(boolean append) throws IOException { URLConnection openConnection = this.url.openConnection(); OutputStream outputStream = openConnection.getOutputStream(); this.outStream.add(outputStream); return outputStream; } @Override public boolean exists() { return true; } @Override public IResourceHandler getParentResource() { return null; } @Override public void writeStringContent(String content, String codepage) throws IOException { IOUtils.write(content.getBytes(codepage), this.getContentOutputStream(false)); } @Override public boolean mkdirs() throws IOException { return false; } @Override public void delete() throws IOException { } @Override public boolean moveToTrash() throws IOException { return ResourceHandlerUtils.moveToTrash(this); } @Override public boolean isDirectoryResource() { return false; } @Override public IResourceHandler[] listDirectoryResources(ResourceNameFilter filter) throws IOException { return new IResourceHandler[0]; } @Override public IResourceHandler[] listFileResources() throws IOException { return new IResourceHandler[0]; } @Override public String getName() { return new File(this.url.getFile()).getName(); } @Override public long size() { return 0; } @Override public Date getModifiedAt() { return new Date(); } @Override public void dispose() { while(!inStream.isEmpty()) { IOUtils.closeQuietly(inStream.remove(0)); } while(!outStream.isEmpty()) { IOUtils.closeQuietly(outStream.remove(0)); } } @Override public IResourceHandler addPathStatement(String statement) throws ResourceHandlerException { return null; } @Override public boolean isRemoteResource() { return false; } @Override public RESOURCE_HANDLER_USER_TYPES getType() { return RESOURCE_HANDLER_USER_TYPES.URL; } }