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

Legend:
Removed from v.1545  
changed lines
  Added in v.1794

  ViewVC Help
Powered by ViewVC 1.1.20