Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 package edu.tum.cs.ias.knowrob.utils;
00012
00013 import java.io.BufferedOutputStream;
00014 import java.io.BufferedReader;
00015 import java.io.File;
00016 import java.io.FileOutputStream;
00017 import java.io.IOException;
00018 import java.io.InputStream;
00019 import java.io.InputStreamReader;
00020 import java.io.OutputStream;
00021 import java.io.UnsupportedEncodingException;
00022 import java.net.URL;
00023 import java.net.URLConnection;
00024
00025 import org.apache.commons.net.ftp.FTPClient;
00026
00039 public class ResourceRetriever {
00040
00044 private static final String tmpPrefix = "knowrob_resource_";
00045
00051 public static String createTempDirectory() {
00052
00053 String tmpDir = System.getProperty("java.io.tmpdir");
00054
00055 File temp = new File(tmpDir, "temp" + Long.toString(System.nanoTime()));
00056
00057 if (!(temp.mkdir())) {
00058 System.err.println("Could not create temp directory: " + temp.getAbsolutePath());
00059 }
00060
00061 return temp.getAbsolutePath();
00062 }
00063
00071 public static String findPackage(String pkgname) {
00072
00073 try {
00074 String line;
00075 String cmd = "rospack find " + pkgname;
00076 Process p = Runtime.getRuntime().exec(cmd);
00077 BufferedReader errReader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
00078 while ((line = errReader.readLine()) != null) {
00079 System.err.println(line);
00080 }
00081 BufferedReader pathreader = new BufferedReader(new InputStreamReader(
00082 p.getInputStream(), "UTF-8"));
00083 if ((line = pathreader.readLine()) != null) {
00084 return line;
00085 }
00086 } catch (IOException e) {
00087 e.printStackTrace(System.err);
00088 }
00089 return null;
00090 }
00091
00104 private static File getTmpName(String url, String filename) {
00105 String hashName = MD5(url);
00106 if (hashName == null)
00107 return null;
00108
00109 int idx = filename.lastIndexOf('.');
00110 String ext = "";
00111 if (idx > 0)
00112 ext = filename.substring(idx);
00113
00114 String tmpDir = System.getProperty("java.io.tmpdir");
00115
00116 File f = new File(tmpDir, tmpPrefix + hashName + ext);
00117
00118 return f;
00119 }
00120
00128 private static String MD5(String md5) {
00129 try {
00130 java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
00131 byte[] array = md.digest(md5.getBytes("UTF-8"));
00132 StringBuffer sb = new StringBuffer();
00133 for (int i = 0; i < array.length; ++i) {
00134 sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1, 3));
00135 }
00136 return sb.toString();
00137 } catch (java.security.NoSuchAlgorithmException e) {
00138 System.err.println("ResourceRetriever NoSuchAlgorithmException Error: "
00139 + e.getMessage());
00140 } catch (UnsupportedEncodingException e) {
00141 System.err.println("ResourceRetriever UnsupportedEncodingException Error: "
00142 + e.getMessage());
00143 }
00144 return null;
00145 }
00146
00157 public static File retrieve(String url) {
00158 return retrieve(url, true);
00159 }
00160
00173 public static File retrieve(String url, boolean checkAlreadyRetrieved) {
00174 if (url.indexOf("://") <= 0) {
00175
00176 return new File(url);
00177 }
00178 int start = url.indexOf('/') + 2;
00179 int end = url.indexOf('/', start);
00180 String serverName = url.substring(start, end);
00181 if (url.startsWith("package://")) {
00182 String filePath = url.substring(end + 1);
00183 String pkgPath = findPackage(serverName);
00184 if (pkgPath == null)
00185 return null;
00186 return new File(pkgPath, filePath);
00187 } else if (url.startsWith("http://")) {
00188
00189 OutputStream out = null;
00190 URLConnection conn = null;
00191 InputStream in = null;
00192 String filename = url.substring(url.lastIndexOf('/') + 1);
00193
00194 File tmpPath = getTmpName(url, filename);
00195
00196 if (checkAlreadyRetrieved && tmpPath.exists()) {
00197 return tmpPath;
00198 }
00199
00200 try {
00201
00202 URL urlClass = new URL(url);
00203
00204 out = new BufferedOutputStream(new FileOutputStream(tmpPath));
00205 conn = urlClass.openConnection();
00206 in = conn.getInputStream();
00207
00208
00209 byte[] buffer = new byte[1024];
00210 int numRead;
00211 while ((numRead = in.read(buffer)) != -1) {
00212 out.write(buffer, 0, numRead);
00213 }
00214
00215 } catch (Exception exception) {
00216 exception.printStackTrace();
00217 } finally {
00218 try {
00219 if (in != null) {
00220 in.close();
00221 }
00222 if (out != null) {
00223 out.close();
00224 }
00225 } catch (IOException ioe) {
00226
00227 }
00228 }
00229 return tmpPath;
00230 } else if (url.startsWith("ftp://")) {
00231 FTPClient client = new FTPClient();
00232 OutputStream outStream = null;
00233 String filename = url.substring(url.lastIndexOf('/') + 1);
00234
00235 File tmpPath = getTmpName(url, filename);
00236
00237 if (checkAlreadyRetrieved && tmpPath.exists()) {
00238 System.out
00239 .println("Already retrieved: " + url + " to " + tmpPath.getAbsolutePath());
00240 return tmpPath;
00241 }
00242
00243 try {
00244
00245 client.connect(serverName);
00246 client.login("anonymous", "knowrob@example.com");
00247 String remoteFile = url.substring(end);
00248
00249 outStream = new FileOutputStream(tmpPath);
00250 client.retrieveFile(remoteFile, outStream);
00251
00252 } catch (IOException ioe) {
00253 System.out.println("ResourceRetriever: Error communicating with FTP server: "
00254 + serverName + "\n" + ioe.getMessage());
00255 } finally {
00256 try {
00257 outStream.close();
00258 } catch (IOException e1) {
00259
00260 }
00261 try {
00262 client.disconnect();
00263 } catch (IOException e) {
00264 System.out.println("ResourceRetriever: Problem disconnecting from FTP server: "
00265 + serverName + "\n" + e.getMessage());
00266 }
00267 }
00268 return tmpPath;
00269 }
00270 return null;
00271 }
00272 }