package net.osmand.data.index; import static net.osmand.data.index.IndexConstants.BINARY_MAP_INDEX_EXT; import static net.osmand.data.index.IndexConstants.BINARY_MAP_INDEX_EXT_ZIP; import static net.osmand.data.index.IndexConstants.BINARY_MAP_VERSION; import static net.osmand.data.index.IndexConstants.VOICE_INDEX_EXT_ZIP; import static net.osmand.data.index.IndexConstants.VOICE_VERSION; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import net.osmand.LogUtil; import org.apache.commons.logging.Log; public class DownloaderIndexFromGoogleCode { private final static Log log = LogUtil.getLog(DownloaderIndexFromGoogleCode.class); /** * @param args * @throws URISyntaxException * @throws IOException */ public static void main(String[] args) throws URISyntaxException, IOException { Map<String, String> files = DownloaderIndexFromGoogleCode.getContent(new LinkedHashMap<String, String>(), BINARY_MAP_VERSION + BINARY_MAP_INDEX_EXT, BINARY_MAP_VERSION + BINARY_MAP_INDEX_EXT_ZIP, VOICE_VERSION + VOICE_INDEX_EXT_ZIP); for(String s : files.keySet()){ System.out.println(s + " " + files.get(s)); //$NON-NLS-1$ } // String odb = ""; //$NON-NLS-1$ // put your cookies and personal information for delete // String cookieHSID = ""; //$NON-NLS-1$ // String cookieSID = ""; //$NON-NLS-1$ // String pagegen = ""; //$NON-NLS-1$ // String token = ""; //$NON-NLS-1$ // // for(String odb : indexFiles.keySet()){ // System.out.println("DELETING " + odb); // deleteFileFromGoogleDownloads(odb, token, pagegen, cookieHSID,cookieSID); // } // System.out.println("DELETED " + indexFiles.size()); } private static Map<String, String> getContent(Map<String, String> files, String... ext) { BufferedReader reader = null; int num = 400; int start = 0; boolean downloadNext = true; while (downloadNext) { downloadNext = false; try { URL url = new URL( "http://code.google.com/p/osmand/downloads/list?num=" + num + "&start=" + start); //$NON-NLS-1$ //$NON-NLS-2$ reader = new BufferedReader(new InputStreamReader(url .openStream())); String s = null; String prevFile = null; while ((s = reader.readLine()) != null) { boolean hrefDownload = s.indexOf("files") != -1; //$NON-NLS-1$ if (hrefDownload || s.indexOf("{") != -1) { //$NON-NLS-1$ downloadNext |= hrefDownload; for (String extension : ext) { prevFile = getIndexFiles(files, s, prevFile, extension); } } } start += num + 1; } catch (MalformedURLException e) { log.error("Unexpected exception", e); //$NON-NLS-1$ } catch (IOException e) { log.error("Input/Output exception", e); //$NON-NLS-1$ } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { log.error("Error closing stream to url.", e); //$NON-NLS-1$ } } } } log.info("Loaded indexes:" + files.size()); //$NON-NLS-1$ return files; } private static String getIndexFiles(Map<String, String> files, String content, String prevFile, String ext){ int i = 0; int prevI = -1; if((i = content.indexOf(ext, i)) != -1) { if(prevI > i){ files.put(prevFile, null); prevI = i; } int j = i - 1; while (content.charAt(j) == '_' || Character.isLetterOrDigit(content.charAt(j)) || content.charAt(j) == '-') { j--; } if(content.substring(j + 1, i).endsWith("_")){ //$NON-NLS-1$ prevFile = content.substring(j + 1, i) + ext; } } if (prevFile != null && ((i = content.indexOf('{')) != -1)) { int j = content.indexOf('}'); if (j != -1 && j - i < 40) { // String description = content.substring(i, j + 1); files.put(prevFile, content); prevFile = null; } } return prevFile; } public static Map<String, String> getIndexFiles(Map<String, String> files, String... ext){ return getContent(files, ext); } public static URL getInputStreamToLoadIndex(String indexName) throws IOException{ URL url = new URL("http://osmand.googlecode.com/files/"+indexName); //$NON-NLS-1$ return url; } public static String deleteFileFromGoogleDownloads(String fileName, String token, String pagegen, String cookieHSID, String cookieSID) throws IOException { // prepare data Map<String, String> cookies = new HashMap<String, String>(); cookies.put("HSID", cookieHSID); //$NON-NLS-1$ cookies.put("SID", cookieSID); //$NON-NLS-1$ StringBuilder cookieString = new StringBuilder(); int size = cookies.size(); for (String c : cookies.keySet()) { size--; cookieString.append(c).append("=").append(cookies.get(c)); //$NON-NLS-1$ if (size > 0) { cookieString.append("; "); //$NON-NLS-1$ } } String urlText = "http://code.google.com/p/osmand/downloads/delete.do?name="+fileName; //$NON-NLS-1$ System.out.println(urlText); StringBuilder requestBody = new StringBuilder(); requestBody. append("token=").append(token). //$NON-NLS-1$ append("&pagegen=").append(pagegen). //$NON-NLS-1$ append("&filename=").append(fileName). //$NON-NLS-1$ append("&delete=Delete+download"); //$NON-NLS-1$ System.out.println(requestBody); // getting url URL url = new URL(urlText); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("Cookie", cookieString.toString()); //$NON-NLS-1$ connection.setConnectTimeout(15000); connection.setRequestMethod("POST"); //$NON-NLS-1$ connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //$NON-NLS-1$//$NON-NLS-2$ connection.setRequestProperty("Content-Length", requestBody.length()+""); //$NON-NLS-1$ //$NON-NLS-2$ connection.setDoInput(true); connection.setDoOutput(true); connection.connect(); OutputStream out = connection.getOutputStream(); if (requestBody != null) { BufferedWriter bwr = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"), 1024); //$NON-NLS-1$ bwr.write(requestBody.toString()); bwr.flush(); bwr.close(); } log.info("Response : " + connection.getResponseMessage()); //$NON-NLS-1$ // populate return fields. StringBuilder responseBody = new StringBuilder(); InputStream i = connection.getInputStream(); if (i != null) { BufferedReader in = new BufferedReader(new InputStreamReader(i, "UTF-8"), 256); //$NON-NLS-1$ String s; boolean f = true; while ((s = in.readLine()) != null) { if(!f){ responseBody.append("\n"); //$NON-NLS-1$ } else { f = false; } responseBody.append(s); } } return responseBody.toString(); } }