implement zip/unzip files for downloading

git-svn-id: https://osmand.googlecode.com/svn/trunk@309 e29c36b1-1cfa-d876-8d93-3434fc2bb7b8
This commit is contained in:
Victor Shcherb 2010-07-09 11:15:50 +00:00
parent e94b2b8350
commit e16371d336
8 changed files with 153 additions and 70 deletions

View file

@ -19,7 +19,10 @@ public class ToDoConstants {
// 60. Audio guidance for routing !
// 68. Implement service to app work with screen offline
// (introduce special settings how often update location to monitoring & audio guidance)
// 69. Multitouch zoom
// Improvement : Show stops in the transport route on the map
// Not clear if it is really needed
// 43. Enable poi filter by name
// 58. Upload/Download zip-index from site & unzip them on phone
// 45. Get clear <Use internet> settings. Move that setting on top settings screen.
@ -27,6 +30,7 @@ public class ToDoConstants {
// (would you like to use internet for that operation - if using internet is not checked).
// Internet using now for : edit POI osm, show osm bugs layer, download tiles.
// Unscheduled (complex)
// 66. Transport routing (show next stop, total distance, show stop get out) (?).
// 64. Traffic information (?)
// 65. Intermediate points - for better control routing, to avoid traffic jam ...(?)
@ -34,15 +38,14 @@ public class ToDoConstants {
// 63. Support simple offline routing(require new index file) (?)
// FIXME BUGS Android
// 1. Improvement : Show stops in the transport route
// 2. Pinch zoom !!!
// BUGS Android
// TODO swing
// 9. Fix issues with big files (such as netherlands) - save memory (!) - very slow due to transport index !
// Current result : for big file (1 - task 60-80% time, 90% memory)
// 1. Download tiles without using dir tiles (?)
// 10. Improve address indexing (use relations).
// Current result : for big file (1 - task 60-80% time, 90% memory) (?)
// 1. Download tiles without using dir tiles (?)
// 10. Improve address indexing (use relations). (?)
// use relation "a6" (to accumulate streets!), "a3" to read all cities & define boundaries for city (& define that street in city).
// BUGS Swing

View file

@ -22,16 +22,19 @@ public class DownloaderIndexFromGoogleCode {
* @throws IOException
*/
public static void main(String[] args) throws URISyntaxException, IOException {
Map<String, String> indexFiles = DownloaderIndexFromGoogleCode.getIndexFiles(new String[] { IndexConstants.ADDRESS_INDEX_EXT,
IndexConstants.POI_INDEX_EXT, IndexConstants.TRANSPORT_INDEX_EXT }, new String[] {
IndexConstants.ADDRESS_TABLE_VERSION + "", IndexConstants.POI_TABLE_VERSION + "", //$NON-NLS-1$//$NON-NLS-2$
IndexConstants.TRANSPORT_TABLE_VERSION + "" }); //$NON-NLS-1$
Map<String, String> indexFiles = DownloaderIndexFromGoogleCode.getIndexFiles(
new String[] { IndexConstants.ADDRESS_INDEX_EXT, IndexConstants.POI_INDEX_EXT, IndexConstants.TRANSPORT_INDEX_EXT,
IndexConstants.ADDRESS_INDEX_EXT_ZIP, IndexConstants.POI_INDEX_EXT_ZIP, IndexConstants.TRANSPORT_INDEX_EXT_ZIP,},
new String[] { IndexConstants.ADDRESS_TABLE_VERSION + "", IndexConstants.POI_TABLE_VERSION + "", //$NON-NLS-1$//$NON-NLS-2$
IndexConstants.TRANSPORT_TABLE_VERSION + "" , //$NON-NLS-1$
IndexConstants.ADDRESS_TABLE_VERSION + "", IndexConstants.POI_TABLE_VERSION + "", //$NON-NLS-1$//$NON-NLS-2$
IndexConstants.TRANSPORT_TABLE_VERSION + "" }); //$NON-NLS-1$
System.out.println(indexFiles);
}
private static StringBuilder getContent() {
try {
URL url = new URL("http://code.google.com/p/osmand/downloads/list?num=500&start=0"); //$NON-NLS-1$
URL url = new URL("http://code.google.com/p/osmand/downloads/list?num=1500&start=0"); //$NON-NLS-1$
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
StringBuilder b = new StringBuilder();

View file

@ -1,6 +1,7 @@
package com.osmand.data.index;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@ -12,6 +13,8 @@ import java.util.Date;
import java.util.LinkedHashSet;
import java.util.Locale;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.commons.logging.Log;
@ -61,20 +64,19 @@ public class IndexBatchCreator {
// us states
// TODO address
protected static final String[] usStates = new String[] {
"Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut",
"Delaware", "District_of_Columbia", "Florida", "Georgia", "Guantanamo_Bay", "Hawaii",
"Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine",
"Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri",
"Montana", "Nebraska", "Nevada", "New_Hampshire", "New_Jersey", "New_Mexico",
"New_York", "North_Carolina", "North_Dakota", "Ohio", "Oklahoma", "Oregon",
"Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee",
"Texas", "Utah", "Vermont", "Virginia", "Washington", "West_Virginia", "Wisconsin", "Wyoming",
// "Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut",
// "Delaware", "District_of_Columbia", "Florida", "Georgia", "Guantanamo_Bay", "Hawaii",
// "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine",
// "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri",
// "Montana", "Nebraska", "Nevada", "New_Hampshire", "New_Jersey", "New_Mexico",
// "New_York", "North_Carolina", "North_Dakota", "Ohio", "Oklahoma", "Oregon",
// "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee",
// "Texas", "Utah", "Vermont", "Virginia", "Washington", "West_Virginia", "Wisconsin", "Wyoming",
};
// TODO address
protected static final String[] canadaStates = new String[] {
"Alberta","British_Columbia","Manitoba","New_Brunswick","Newfoundland",
"Nova_Scotia","Nunavut", "Nw_Territories","Ontario","Pr_Edwrd_Island",
"Quebec","Saskatchewan","Yukon",
// "Alberta","British_Columbia","Manitoba","New_Brunswick","Newfoundland",
// "Nova_Scotia","Nunavut", "Nw_Territories","Ontario","Pr_Edwrd_Island",
// "Quebec","Saskatchewan","Yukon",
};
@ -266,24 +268,51 @@ public class IndexBatchCreator {
MessageFormat format = new MessageFormat("{0,date,dd.MM.yyyy} : {1, number,##.#} MB", Locale.US);
String summary;
double mbLengh = (double)f.length() / MB;
String descriptionFile = "{"+format.format(new Object[]{new Date(f.lastModified()), mbLengh})+"}";
if(f.getName().endsWith(IndexConstants.POI_INDEX_EXT)){
String regionName = f.getName().substring(0, f.getName().length() - IndexConstants.POI_INDEX_EXT.length() - 2);
summary = "POI index for " + regionName + " " + descriptionFile;
} else if(f.getName().endsWith(IndexConstants.ADDRESS_INDEX_EXT)){
String regionName = f.getName().substring(0, f.getName().length() - IndexConstants.ADDRESS_INDEX_EXT.length() - 2);
summary = "Adress index for " + regionName + " " + descriptionFile;
} else if(f.getName().endsWith(IndexConstants.TRANSPORT_INDEX_EXT)){
String regionName = f.getName().substring(0, f.getName().length() - IndexConstants.TRANSPORT_INDEX_EXT.length() - 2);
summary = "Transport index for " + regionName + " " + descriptionFile;
String regionName;
if(f.getName().endsWith(IndexConstants.POI_INDEX_EXT) || f.getName().endsWith(IndexConstants.POI_INDEX_EXT_ZIP)){
regionName = f.getName().substring(0, f.getName().length() - IndexConstants.POI_INDEX_EXT.length() - 2);
summary = "POI index for " ;
} else if(f.getName().endsWith(IndexConstants.ADDRESS_INDEX_EXT) || f.getName().endsWith(IndexConstants.ADDRESS_INDEX_EXT_ZIP)){
regionName = f.getName().substring(0, f.getName().length() - IndexConstants.ADDRESS_INDEX_EXT.length() - 2);
summary = "Adress index for " ;
} else if(f.getName().endsWith(IndexConstants.TRANSPORT_INDEX_EXT) || f.getName().endsWith(IndexConstants.TRANSPORT_INDEX_EXT_ZIP)){
regionName = f.getName().substring(0, f.getName().length() - IndexConstants.TRANSPORT_INDEX_EXT.length() - 2);
summary = "Transport index for ";
} else {
return;
}
if(mbLengh > 5 && f.getName().endsWith(".odb")){
String zipFileName = f.getName().subSequence(0, f.getName().length() - 4)+".zip";
File zFile = new File(f.getParentFile(), zipFileName);
log.info("Zipping file " + f.getName());
try {
ZipOutputStream zout = new ZipOutputStream(new FileOutputStream(zFile));
zout.setLevel(9);
zout.putNextEntry(new ZipEntry(f.getName()));
FileInputStream is = new FileInputStream(f);
byte[] BUFFER = new byte[8192];
int read = 0;
while((read = is.read(BUFFER)) != -1){
zout.write(BUFFER, 0, read);
}
zout.close();
} catch (IOException e) {
log.error("Exception while zipping file");
}
if(f.delete()){
log.info("Source odb file was deleted");
}
f = zFile;
}
mbLengh = (double)f.length() / MB;
if(mbLengh > 100){
System.err.println("ERROR : file " + f.getName() + " exceeded 90 mb!!! Could not be uploaded.");
System.err.println("ERROR : file " + f.getName() + " exceeded 100 mb!!! Could not be uploaded.");
return; // restriction for google code
}
String descriptionFile = "{"+format.format(new Object[]{new Date(f.lastModified()), mbLengh})+"}";
summary += regionName + " " + descriptionFile;
alreadyUploadedFiles.add(f.getName());
GoogleCodeUploadIndex uploader = new GoogleCodeUploadIndex();
uploader.setFileName(f.getAbsolutePath());

View file

@ -16,6 +16,10 @@ public class IndexConstants {
public static final String ADDRESS_INDEX_EXT = ".addr.odb"; //$NON-NLS-1$
public static final String TRANSPORT_INDEX_EXT = ".trans.odb"; //$NON-NLS-1$
public static final String POI_INDEX_EXT_ZIP = ".poi.zip"; //$NON-NLS-1$
public static final String ADDRESS_INDEX_EXT_ZIP = ".addr.zip"; //$NON-NLS-1$
public static final String TRANSPORT_INDEX_EXT_ZIP = ".trans.zip"; //$NON-NLS-1$
public interface IndexColumn {
public boolean isIndex();

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.osmand" android:versionName="0.2.1" android:versionCode="4">
package="com.osmand" android:versionName="0.2.2" android:versionCode="5">
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:debuggable="true" android:name=".activities.OsmandApplication" android:description="@string/app_description">
<activity android:name=".activities.MainMenuActivity"

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="unzipping_file">Файл распаковывается</string>
<string name="route_tr">Поверните направо и двигайтесь</string>
<string name="route_tshr">Поверните резко направо и двигайтесь</string>
<string name="route_tslr">Поверните направо и двигайтесь</string>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="unzipping_file">File is unzipping</string>
<string name="route_tr">Turn right and go</string>
<string name="route_tshr">Turn sharply right and go</string>
<string name="route_tslr">Turn slightly right and go</string>

View file

@ -1,6 +1,7 @@
package com.osmand.activities;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@ -13,6 +14,8 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.apache.commons.logging.Log;
@ -74,10 +77,14 @@ public class DownloadIndexActivity extends ListActivity {
protected Map<String, String> downloadIndex(){
try {
log.debug("Start loading list of index files"); //$NON-NLS-1$
Map<String, String> indexFiles = DownloaderIndexFromGoogleCode.getIndexFiles(new String[] { IndexConstants.ADDRESS_INDEX_EXT,
IndexConstants.POI_INDEX_EXT, IndexConstants.TRANSPORT_INDEX_EXT, }, new String[] {
Map<String, String> indexFiles = DownloaderIndexFromGoogleCode.getIndexFiles(new String[] {
IndexConstants.ADDRESS_INDEX_EXT, IndexConstants.POI_INDEX_EXT, IndexConstants.TRANSPORT_INDEX_EXT,
IndexConstants.ADDRESS_INDEX_EXT_ZIP, IndexConstants.POI_INDEX_EXT_ZIP, IndexConstants.TRANSPORT_INDEX_EXT_ZIP, },
new String[] {
IndexConstants.ADDRESS_TABLE_VERSION + "", IndexConstants.POI_TABLE_VERSION + "",//$NON-NLS-1$//$NON-NLS-2$
IndexConstants.TRANSPORT_TABLE_VERSION + "",}); //$NON-NLS-1$
IndexConstants.TRANSPORT_TABLE_VERSION + "", //$NON-NLS-1$
IndexConstants.ADDRESS_TABLE_VERSION + "", IndexConstants.POI_TABLE_VERSION + "",//$NON-NLS-1$//$NON-NLS-2$
IndexConstants.TRANSPORT_TABLE_VERSION + ""}); //$NON-NLS-1$
if (indexFiles != null && !indexFiles.isEmpty()) {
return indexFiles;
} else {
@ -129,18 +136,27 @@ public class DownloadIndexActivity extends ListActivity {
if(key.endsWith(IndexConstants.ADDRESS_INDEX_EXT)){
parent = new File(Environment.getExternalStorageDirectory(), ResourceManager.ADDRESS_PATH);
regionName += IndexConstants.ADDRESS_INDEX_EXT;
} else if(key.endsWith(IndexConstants.ADDRESS_INDEX_EXT_ZIP)){
parent = new File(Environment.getExternalStorageDirectory(), ResourceManager.ADDRESS_PATH);
regionName += IndexConstants.ADDRESS_INDEX_EXT_ZIP;
} else if(key.endsWith(IndexConstants.POI_INDEX_EXT)){
parent = new File(Environment.getExternalStorageDirectory(), ResourceManager.POI_PATH);
regionName += IndexConstants.POI_INDEX_EXT;
} else if(key.endsWith(IndexConstants.POI_INDEX_EXT_ZIP)){
parent = new File(Environment.getExternalStorageDirectory(), ResourceManager.POI_PATH);
regionName += IndexConstants.POI_INDEX_EXT_ZIP;
} else if(key.endsWith(IndexConstants.TRANSPORT_INDEX_EXT)){
parent = new File(Environment.getExternalStorageDirectory(), ResourceManager.TRANSPORT_PATH);
regionName += IndexConstants.TRANSPORT_INDEX_EXT;
} else if(key.endsWith(IndexConstants.TRANSPORT_INDEX_EXT_ZIP)){
parent = new File(Environment.getExternalStorageDirectory(), ResourceManager.TRANSPORT_PATH);
regionName += IndexConstants.TRANSPORT_INDEX_EXT_ZIP;
}
if(parent != null){
parent.mkdirs();
}
if(parent == null || !parent.exists()){
Toast.makeText(DownloadIndexActivity.this, getString(R.string.download_sd_dir_not_accessible), Toast.LENGTH_LONG);
Toast.makeText(DownloadIndexActivity.this, getString(R.string.download_sd_dir_not_accessible), Toast.LENGTH_LONG).show();
return null;
}
File file = new File(parent, regionName);
@ -158,32 +174,55 @@ public class DownloadIndexActivity extends ListActivity {
public void run() {
try {
FileOutputStream out = new FileOutputStream(file);
try {
URL url = DownloaderIndexFromGoogleCode.getInputStreamToLoadIndex(key);
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
impl.startTask(getString(R.string.downloading_file), conn.getContentLength());
byte[] buffer = new byte[BUFFER_SIZE];
int read = 0;
while((read = is.read(buffer)) != -1){
out.write(buffer, 0, read);
impl.progress(read);
URL url = DownloaderIndexFromGoogleCode.getInputStreamToLoadIndex(key);
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
impl.startTask(getString(R.string.downloading_file), conn.getContentLength());
byte[] buffer = new byte[BUFFER_SIZE];
int read = 0;
while((read = is.read(buffer)) != -1){
out.write(buffer, 0, read);
impl.progress(read);
}
out.close();
File toIndex = file;
if(file.getName().endsWith(".zip")){ //$NON-NLS-1$
impl.startTask(getString(R.string.unzipping_file), -1);
toIndex = new File(file.getParentFile(), file.getName().substring(0, file.getName().length() - 3) + "odb"); //$NON-NLS-1$
ZipInputStream zipIn = new ZipInputStream(new FileInputStream(file));
ZipEntry entry = null;
boolean found = false;
while(!found) {
if(entry != null){
zipIn.closeEntry();
}
entry = zipIn.getNextEntry();
found = entry == null || entry.getName().endsWith(".odb"); //$NON-NLS-1$
}
if(entry != null){
out = new FileOutputStream(toIndex);
while((read = zipIn.read(buffer)) != -1){
out.write(buffer, 0, read);
}
out.close();
}
ArrayList<String> warnings = new ArrayList<String>();
if(file.getName().endsWith(IndexConstants.ADDRESS_INDEX_EXT)){
ResourceManager.getResourceManager().indexingAddress(impl, warnings, file);
} else if(file.getName().endsWith(IndexConstants.POI_INDEX_EXT)){
ResourceManager.getResourceManager().indexingPoi(impl, warnings, file);
} else if(file.getName().endsWith(IndexConstants.TRANSPORT_INDEX_EXT)){
ResourceManager.getResourceManager().indexingTransport(impl, warnings, file);
}
if(warnings.isEmpty()){
showWarning(getString(R.string.download_index_success));
} else {
showWarning(warnings.get(0));
}
} finally {
out.close();
zipIn.close();
file.delete(); // zip is no needed more
}
ArrayList<String> warnings = new ArrayList<String>();
if(toIndex.getName().endsWith(IndexConstants.ADDRESS_INDEX_EXT)){
ResourceManager.getResourceManager().indexingAddress(impl, warnings, toIndex);
} else if(toIndex.getName().endsWith(IndexConstants.POI_INDEX_EXT)){
ResourceManager.getResourceManager().indexingPoi(impl, warnings, toIndex);
} else if(toIndex.getName().endsWith(IndexConstants.TRANSPORT_INDEX_EXT)){
ResourceManager.getResourceManager().indexingTransport(impl, warnings, toIndex);
}
if(warnings.isEmpty()){
showWarning(getString(R.string.download_index_success));
} else {
showWarning(warnings.get(0));
}
} catch (IOException e) {
log.error("Exception ocurred", e); //$NON-NLS-1$
@ -227,15 +266,18 @@ public class DownloadIndexActivity extends ListActivity {
Entry<String, String> e = getItem(position);
int l = e.getKey().lastIndexOf('_');
String s = ""; //$NON-NLS-1$
if(e.getKey().endsWith(IndexConstants.POI_INDEX_EXT)){
if(e.getKey().endsWith(IndexConstants.POI_INDEX_EXT) || e.getKey().endsWith(IndexConstants.POI_INDEX_EXT_ZIP)){
s = getString(R.string.poi);
} else if(e.getKey().endsWith(IndexConstants.ADDRESS_INDEX_EXT)){
} else if(e.getKey().endsWith(IndexConstants.ADDRESS_INDEX_EXT) || e.getKey().endsWith(IndexConstants.ADDRESS_INDEX_EXT_ZIP)){
s = getString(R.string.address);
} else if(e.getKey().endsWith(IndexConstants.TRANSPORT_INDEX_EXT)){
} else if(e.getKey().endsWith(IndexConstants.TRANSPORT_INDEX_EXT) || e.getKey().endsWith(IndexConstants.TRANSPORT_INDEX_EXT_ZIP)){
s = getString(R.string.transport);
}
item.setText(s + "\n " + e.getKey().substring(0, l).replace('_', ' ')); //$NON-NLS-1$
String name = e.getKey().substring(0, l).replace('_', ' ');
if(e.getKey().endsWith(".zip")){ //$NON-NLS-1$
name += " (zip)"; //$NON-NLS-1$
}
item.setText(s + "\n " + name); //$NON-NLS-1$
description.setText(e.getValue().replace(':', '\n'));
return row;
}