/[projects]/android/TrainInfo/src/dk/thoerup/traininfo/provider/OfflineStationProvider.java
ViewVC logotype

Diff of /android/TrainInfo/src/dk/thoerup/traininfo/provider/OfflineStationProvider.java

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1546 by torben, Wed Jul 6 21:20:49 2011 UTC revision 1627 by torben, Fri Nov 25 10:20:40 2011 UTC
# Line 1  Line 1 
1  package dk.thoerup.traininfo.provider;  package dk.thoerup.traininfo.provider;
2    
 import java.io.EOFException;  
3  import java.io.File;  import java.io.File;
4  import java.io.FileInputStream;  import java.io.FileInputStream;
5  import java.io.FileOutputStream;  import java.io.FileOutputStream;
6    import java.io.IOException;
7  import java.io.ObjectInputStream;  import java.io.ObjectInputStream;
8  import java.io.ObjectOutputStream;  import java.io.ObjectOutputStream;
9  import java.util.ArrayList;  import java.net.URLEncoder;
10  import java.util.Collections;  import java.util.Collections;
11  import java.util.Comparator;  import java.util.Comparator;
12    import java.util.LinkedList;
13    
14  import org.simpleframework.xml.Serializer;  import org.simpleframework.xml.Serializer;
15  import org.simpleframework.xml.core.Persister;  import org.simpleframework.xml.core.Persister;
# Line 19  import android.util.Log; Line 20  import android.util.Log;
20  import dk.thoerup.android.traininfo.common.StationBean;  import dk.thoerup.android.traininfo.common.StationBean;
21  import dk.thoerup.android.traininfo.common.StationEntry;  import dk.thoerup.android.traininfo.common.StationEntry;
22  import dk.thoerup.genericjavautils.HttpUtil;  import dk.thoerup.genericjavautils.HttpUtil;
23    import dk.thoerup.traininfo.util.DownloadUtil;
24  import dk.thoerup.traininfo.util.IntSet;  import dk.thoerup.traininfo.util.IntSet;
25  import dk.thoerup.traininfo.util.XmlUtil;  import dk.thoerup.traininfo.util.XmlUtil;
26    
# Line 26  public class OfflineStationProvider impl Line 28  public class OfflineStationProvider impl
28                    
29          StationBean stations = new StationBean();          StationBean stations = new StationBean();
30    
31            public boolean hasStations() {
32                    return (stations != null && stations.entries.size() > 0);
33            }
34            
35    
36          public boolean loadStations(Context context) throws Exception {          public boolean loadStations(Context context) throws Exception {
37                    long start = System.currentTimeMillis();
38                    
39                  stations.entries.clear(); //TODO: remove                  stations.entries.clear(); //TODO: remove
40                                    
41                  File parent = context.getFilesDir();                  File parent = context.getFilesDir();
# Line 36  public class OfflineStationProvider impl Line 44  public class OfflineStationProvider impl
44                  if (!stationsFile.exists())                  if (!stationsFile.exists())
45                          return false;                          return false;
46                                    
47                  int size = (int) stationsFile.length();                  /*int size = (int) stationsFile.length();
48                  /*byte data[] = new byte[size];                  byte data[] = new byte[size];
49                                    
50                  RandomAccessFile raf = new RandomAccessFile(stationsFile, "r");                  RandomAccessFile raf = new RandomAccessFile(stationsFile, "r");
51                  raf.readFully(data);                  raf.readFully(data);
# Line 46  public class OfflineStationProvider impl Line 54  public class OfflineStationProvider impl
54                  stations = serializer.read(StationBean.class,  new String(data, "ISO-8859-1") );*/                  stations = serializer.read(StationBean.class,  new String(data, "ISO-8859-1") );*/
55                                    
56                                    
57                  try {  
58                          ObjectInputStream in = new ObjectInputStream( new FileInputStream(stationsFile) );                  ObjectInputStream in = new ObjectInputStream( new FileInputStream(stationsFile) );
59                          Object o;  
60                          while ( (o=in.readObject()) != null ) {                  int length = in.readInt(); // first field is the length
61                                  stations.entries.add( (StationEntry) o);                  
62                          }                  for (int i=0; i<length; i++) {                          
63                          in.close();                          StationEntry entry = (StationEntry) in.readObject();
64                  } catch (EOFException e) {                          updateSearchStrings(entry);
65                          //do nothing;                          stations.entries.add( entry );
66                  }                  }
67                                    
68                    in.close();
69    
70                    
71                  Log.e("OFFLINE", "loaded" + stations.entries.size());                  Log.e("OFFLINE", "loaded" + stations.entries.size());
72                    logElapsedTime(start, "loadStations");
73                                    
74                  return true;                  return true;
75          }                }
76            
77            public void updateSearchStrings(StationEntry entry) {          
78                    entry.nameLower = entry.getName().toLowerCase();
79                    entry.nameInternational = entry.nameLower.replace("æ", "ae").replace("ø", "oe").replace("å", "aa");
80            }
81                    
82          public void downloadStations(Context context) throws Exception {          public void downloadStations(Context context) throws Exception {
83                  File parent = context.getFilesDir();                  File parent = context.getFilesDir();
84                  File stationsFile = new File(parent, "stations.bin");                  File stationsFile = new File(parent, "stations.bin");
85    
86                    
87                  byte data[] = HttpUtil.getContent(XmlUtil.SERVICE_BASE + "/LocateStations?dump=1", 5000);                  byte data[] = HttpUtil.getContent(XmlUtil.SERVICE_BASE + "/LocateStations?dump=1", 5000);
88                  Serializer serializer = new Persister();                  Serializer serializer = new Persister();
89                  stations = serializer.read(StationBean.class,  new String(data, "ISO-8859-1") );                  StationBean tmpStations = serializer.read(StationBean.class,  new String(data, "ISO-8859-1") );
90                                    
91                                    
92                  ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(stationsFile) );                  ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(stationsFile) );
93                  Log.e("OFFLINE", "data size" + data.length);                  Log.e("OFFLINE", "data size" + data.length);
94                                    
95                  for (StationEntry entry : stations.entries) {                  out.writeInt( tmpStations.entries.size() ); //start with writing the length of the dataset
96                    
97                    for (StationEntry entry : tmpStations.entries) {
98                            updateSearchStrings( entry ); //prepare name fields for byName search
99                          out.writeObject(entry);                          out.writeObject(entry);
100                  }                  }
101                                    
102                  out.close();                              out.close();
103                    
104                    stations = tmpStations; // når alt er ok skifter vi over til ny udgave
105          }          }
106                    
107                    
# Line 87  public class OfflineStationProvider impl Line 110  public class OfflineStationProvider impl
110          public void purgeOldEntries() {          public void purgeOldEntries() {
111          }          }
112    
113            Comparator<StationEntry> distanceComparator = new Comparator<StationEntry>() {
114                    @Override
115                    public int compare(StationEntry object1, StationEntry object2) {
116                            if (object1.getCalcdist() == object2.getCalcdist())                                    
117                                    return 0;
118                            
119                            if (object1.getCalcdist() > object2.getCalcdist())
120                                    return 1;
121                            else
122                                    return -1;
123                    }              
124            };
125                    
126          @Override          @Override
127          public StationBean lookupStationsByLocation(Location location) {          public StationBean lookupStationsByLocation(Location location) {
128                                    
129                    statsByLocation(location);
130                    
131                    long start = System.currentTimeMillis();
132                  Location tmpLoc = new Location("GPS");                  Location tmpLoc = new Location("GPS");
133                                    
134                  ArrayList<StationEntry> entries = new ArrayList<StationEntry>() ;                  LinkedList<StationEntry> entries = new LinkedList<StationEntry>() ;
135                                    
136                  for (StationEntry entry : stations.entries) {                  for (StationEntry entry : stations.entries) {
137                          tmpLoc.setLatitude(entry.getLatitude());                          tmpLoc.setLatitude(entry.getLatitude());
138                          tmpLoc.setLongitude(entry.getLongitude());                          tmpLoc.setLongitude(entry.getLongitude());
139                                                    
140                          entry.setCalcdist( (int) location.distanceTo(tmpLoc) );                          int distance = (int) location.distanceTo(tmpLoc);
                         entries.add(entry);  
141                                                    
142                  }                          if (entries.size() <8 || entries.getLast().getCalcdist() > distance) {
143                                                    entry.setCalcdist(distance);
                 Collections.sort( entries, new Comparator<StationEntry>() {  
                         @Override  
                         public int compare(StationEntry object1, StationEntry object2) {  
                                 if (object1.getCalcdist() == object2.getCalcdist())                                      
                                         return 0;  
144                                                                    
145                                  if (object1.getCalcdist() > object2.getCalcdist())                                  if (entries.size() == 8)
146                                          return 1;                                          entries.removeLast();
147                                  else                                  
148                                          return -1;                                  entries.addLast(entry);
149                          }                                  
150                                                            Collections.sort( entries, distanceComparator);
151                  });                          }                      
152                    }
153                                    
154                    logElapsedTime(start, "location_stage1");
155                                    
156                    Collections.sort( entries, distanceComparator);
157                                    
158                  StationBean tmpStations = new StationBean();                  StationBean tmpStations = new StationBean();
159                  for (int i = 0; i<8; i++) {                  for (int i = 0; i<8 && i<entries.size(); i++) {
160                          tmpStations.entries.add( entries.get(i) );                          tmpStations.entries.add( entries.get(i) );
161                  }                  }
162                                    
163                    logElapsedTime(start, "location");
164                  return tmpStations;                  return tmpStations;
165          }          }
166            
167            private void logElapsedTime(long start, String method) {
168                    long now = System.currentTimeMillis();
169                    
170                    Log.i("TrainInfo", "Search by " + method + " elapsed " + (now-start) );
171            }
172    
173          @Override          @Override
174          public StationBean lookupStationsByName(String name) {          public StationBean lookupStationsByName(String name) {
175                                    
176                    long start = System.currentTimeMillis();
177                    
178                  name = name.toLowerCase();                  name = name.toLowerCase();
179                  StationBean tmpStations = new StationBean();                  StationBean tmpStations = new StationBean();
180                  for (StationEntry entry : stations.entries) {                  for (StationEntry entry : stations.entries) {
181                          if (entry.getName().toLowerCase().startsWith(name) ) {                          if (entry.nameLower.startsWith(name) || entry.nameInternational.startsWith(name) ) {
182                                  tmpStations.entries.add(entry);                                  tmpStations.entries.add(entry);
183                          }                          }
184                  }                  }
185                                                                    logElapsedTime(start, "name");                          
186                  return tmpStations;                  return tmpStations;
187          }          }
188    
189          @Override          @Override
190          public StationBean lookupStationsByIds(String ids) {          public StationBean lookupStationsByIds(String ids) {
191                    statsByIds(ids);
192                    
193                  IntSet idset = new IntSet();                  IntSet idset = new IntSet();
194                  idset.fromString(ids);                  idset.fromString(ids);
195                                    
# Line 154  public class OfflineStationProvider impl Line 200  public class OfflineStationProvider impl
200                          }                          }
201                  }                  }
202                                    
203                    return tmpStations;
204            }
205            
206    
207            private void statsByLocation(Location location) {
208                    double lat = XmlStationProvider.roundToPlaces(location.getLatitude(), 4);
209                    double lng = XmlStationProvider.roundToPlaces(location.getLongitude(), 4);
210                    
211                    final String url = XmlUtil.SERVICE_BASE + "/LocateStations?latitude=" + lat + "&longitude=" + lng + "&dummy=1";
212                    Log.i("url", url);
213                    urlSender(url);
214            }
215            
216            private void statsByName(String name) {
217                                    
218                    try {
219                            name = URLEncoder.encode(name, "ISO8859-1");    
220                    } catch (Exception e) {
221                            Log.e("lookupStations", "Encoding failed", e);//if encoding fails use original and hope for the best
222                    }
223                                    
224                  return tmpStations;                  String url = XmlUtil.SERVICE_BASE + "/LocateStations?name=" + name + "&dummy=1";
225                    Log.i("url", url);
226                    urlSender(url);
227            }
228            
229            private void statsByIds(String ids) {  
230                    final String url = XmlUtil.SERVICE_BASE + "/LocateStations?list=" + ids + "&dummy=1";
231                    Log.i("url", url);
232                    urlSender(url);
233          }          }
234            
235            private void urlSender(final String url) {
236                    Thread t = new Thread(new Runnable() {
237    
238                            @Override
239                            public void run() {
240                                    try {
241                                            DownloadUtil.getContentString(url, 15000, "ISO-8859-1");
242                                    } catch (IOException e) {
243                                            Log.e("TrainInfo", "stats failed");
244                                    }                              
245                            }                      
246                    });
247                    t.start();
248            }
249            
250    
251  }  }

Legend:
Removed from v.1546  
changed lines
  Added in v.1627

  ViewVC Help
Powered by ViewVC 1.1.20