/[projects]/android/TrainInfoServiceGoogle/src/dk/thoerup/traininfoservice/StationDAO.java
ViewVC logotype

Contents of /android/TrainInfoServiceGoogle/src/dk/thoerup/traininfoservice/StationDAO.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1115 - (show annotations) (download)
Thu Sep 23 15:08:39 2010 UTC (13 years, 7 months ago) by torben
File size: 7816 byte(s)
search byName should be sorted by name
1 package dk.thoerup.traininfoservice;
2
3 import java.io.IOException;
4 import java.util.ArrayList;
5 import java.util.Collections;
6 import java.util.Comparator;
7 import java.util.HashMap;
8 import java.util.List;
9 import java.util.Map;
10 import java.util.logging.Level;
11 import java.util.logging.Logger;
12
13 import javax.jdo.Extent;
14 import javax.jdo.PersistenceManager;
15 import javax.jdo.Query;
16
17 import net.sf.jsr107cache.Cache;
18 import net.sf.jsr107cache.CacheException;
19 import net.sf.jsr107cache.CacheManager;
20
21 import com.google.appengine.api.memcache.jsr107cache.GCacheFactory;
22
23 import dk.thoerup.android.traininfo.common.StationBean;
24 import dk.thoerup.android.traininfo.common.StationBean.StationEntry;
25 import dk.thoerup.traininfoservice.geo.Geo;
26 import dk.thoerup.traininfoservice.jdo.JdoStationBean;
27 import dk.thoerup.traininfoservice.jdo.PMF;
28
29 public class StationDAO {
30 final static int LOCATION_LIMIT = 8;
31 static final Logger logger = Logger.getLogger(StationDAO.class.getName());
32
33 final int TIMEOUT_SECONDS = 30*60;
34
35 Cache cache;
36
37 public StationDAO() {
38 Map props = new HashMap();
39 props.put(GCacheFactory.EXPIRATION_DELTA, TIMEOUT_SECONDS);
40
41 try {
42 cache = CacheManager.getInstance().getCacheFactory().createCache(props);
43 } catch (CacheException e) {
44 logger.log(Level.WARNING, "error creating cache", e);
45 }
46
47 }
48
49
50 public StationEntry getById(int id) {
51
52 PersistenceManager pm = null;
53
54 try {
55 pm = PMF.get().getPersistenceManager();
56 JdoStationBean bean =pm.getObjectById(JdoStationBean.class, new Integer(id) );
57 return bean.toStationEntry();
58 } finally {
59 pm.close();
60 }
61 }
62
63 /* damn that JDO sucks so we to the filtering in java-code */
64 public StationBean getByName(String searchname) {
65 PersistenceManager pm = null;
66
67 try {
68 /*pm = PMF.get().getPersistenceManager();
69
70
71
72 Query q = pm.newQuery(JdoStationBean.class);
73 q.setOrdering("name");
74 List<JdoStationBean> beanList = (List<JdoStationBean>) q.execute();*/
75
76 List<JdoStationBean> beanList = getAllStations();
77
78
79 StationBean stationBean = new StationBean();
80
81 searchname = searchname.toLowerCase();
82 for(JdoStationBean bean : beanList) {
83 if (bean.getName().toLowerCase().startsWith(searchname)) {
84 stationBean.entries.add( bean.toStationEntry() );
85 } else {
86 for (String alias : bean.aliases ) {
87 if (alias.toLowerCase().startsWith(searchname)) {
88 stationBean.entries.add( bean.toStationEntry() );
89 }
90 }
91 }
92 }
93
94 Collections.sort(stationBean.entries, new Comparator<StationEntry>() {
95 @Override
96 public int compare(StationEntry arg0, StationEntry arg1) {
97 return arg0.getName().compareTo( arg1.getName() );
98 }
99 });
100
101 return stationBean;
102 } finally {
103 // pm.close();
104 }
105 }
106
107 public List<JdoStationBean> getAllStations() {
108 final String key = "allstations";
109 List<JdoStationBean> result = (List<JdoStationBean>) cache.get(key);
110
111 if (result == null) {
112 logger.info("getAllStations Cache miss");
113
114 PersistenceManager pm = null;
115 final double LAT = 0.4;
116 final double LNG = 0.75;
117
118 try {
119 pm = PMF.get().getPersistenceManager();
120 Extent<JdoStationBean> all = pm.getExtent(JdoStationBean.class, false);
121
122 result = new ArrayList<JdoStationBean>();
123 for (JdoStationBean station : all) {
124 result.add(station);
125 }
126
127 cache.put(key, result);
128
129 } finally {
130 pm.close();
131 }
132 } else {
133 logger.info("getAllStations Cache hit");
134 }
135
136
137
138 return result;
139
140 }
141
142
143 //String limitExpression = (geolimit == true) ? "AND abs(latitude-?)<0.4 AND abs(longitude-?)<0.75 " : "";
144 /*
145 public List<JdoStationBean> getByLocationList(double latitude, double longitude, boolean geolimit) {
146
147 PersistenceManager pm = null;
148 final double LAT = 0.4;
149 final double LNG = 0.75;
150
151 try {
152 pm = PMF.get().getPersistenceManager();
153 Query q = pm.newQuery(JdoStationBean.class);
154
155
156
157 if (geolimit == true) {
158 double minLat = latitude - LAT;
159 double maxLat = latitude + LAT;
160
161 //DAMN JDO implementation only allows us to compare on one parameter
162
163 String filter = String.format("latitude > %f && latitude < %f", minLat, maxLat);
164
165 q.setFilter( filter );
166 }
167
168 List<JdoStationBean> beanList = (List<JdoStationBean>) q.execute();
169
170 logger.info("beanList size " + beanList.size());
171
172 return beanList;
173 } finally {
174 pm.close();
175 }
176 }*/
177
178
179 public StationBean getByLocation(double latitude, double longitude) {
180 /*
181 List<JdoStationBean> beanList = getByLocationList(latitude,longitude,true);
182
183 if (beanList.size() < LOCATION_LIMIT ) {
184 logger.info("getByLocation failover: " +latitude + "," + longitude);
185 beanList = getByLocationList(latitude,longitude, false);
186 }*/
187
188 List<JdoStationBean> beanList = getAllStations();
189
190 StationBean stationBean = new StationBean();
191
192
193 Geo location = new Geo(latitude,longitude);
194 for(JdoStationBean bean : beanList) {
195 double meter = Geo.distanceKM( location, new Geo(bean.getLatitude(), bean.getLongitude() )) * 1000.0;
196
197 bean.distance = (int) meter;
198 }
199
200
201 Collections.sort(beanList, new Comparator<JdoStationBean>() {
202 @Override
203 public int compare(JdoStationBean o1, JdoStationBean o2) {
204 if (o1.distance < o2.distance) {
205 return -1;
206 } else if (o1.distance > o2.distance) {
207 return 1;
208 } else {
209 return 0;
210 }
211 }
212 });
213
214 for (int i=0; i<LOCATION_LIMIT && i<beanList.size(); i++) {
215 stationBean.entries.add( beanList.get(i).toStationEntry() );
216 }
217
218 return stationBean;
219 }
220
221
222 public StationBean getByList(String list) {
223 PersistenceManager pm = null;
224
225 try {
226 String parts[] = list.split(",");
227
228 StringBuilder filter = new StringBuilder();
229
230 for(String part : parts) {
231 if (filter.length() > 0) {
232 filter.append( " || " );
233 }
234 filter.append("id == ").append(part);
235 }
236
237 //String filter = "id == 10 || id == 82"; //TODO: build filter
238
239 pm = PMF.get().getPersistenceManager();
240 Query q = pm.newQuery(JdoStationBean.class);
241 q.setFilter( filter.toString() );
242 q.setOrdering("name");
243
244 List<JdoStationBean> beanList = (List<JdoStationBean>) q.execute();
245
246 StationBean stationBean = new StationBean();
247
248 for(JdoStationBean bean : beanList) {
249 stationBean.entries.add( bean.toStationEntry() );
250 }
251
252 return stationBean;
253 } finally {
254 pm.close();
255 }
256
257 }
258
259
260 public int getIdByName(String name) {
261
262 List<JdoStationBean> beanList = null;
263
264 PersistenceManager pm = null;
265
266 try {
267
268 String filter = " name == '" + name + "'";
269
270 pm = PMF.get().getPersistenceManager();
271 Query q = pm.newQuery(JdoStationBean.class);
272 q.setFilter(filter);
273
274 beanList = (List<JdoStationBean>) q.execute();
275
276 StationBean stationBean = new StationBean();
277
278 for(JdoStationBean bean : beanList) {
279 stationBean.entries.add( bean.toStationEntry() );
280 }
281
282
283 } finally {
284 pm.close();
285 }
286
287 if ( beanList != null && beanList.size() == 1) {
288 return (int) beanList.get(0).getId();
289 } else {
290 return -1;
291 }
292 }
293
294 @SuppressWarnings("unchecked")
295 public int saveStations(StationBean stationBean) throws IOException {
296 PersistenceManager pm = null;
297
298 try {
299 pm = PMF.get().getPersistenceManager();
300
301 List oldEntries = (List) pm.newQuery(JdoStationBean.class).execute();
302 pm.deletePersistentAll(oldEntries);
303
304 List<JdoStationBean> jdoList = new ArrayList<JdoStationBean>();
305 for (StationEntry station : stationBean.entries) {
306 JdoStationBean jdoBean = JdoStationBean.fromStationEntry(station);
307
308 jdoList.add(jdoBean);
309
310 }
311 pm.makePersistentAll(jdoList);
312
313 return jdoList.size();
314
315 } finally {
316 pm.close();
317 }
318 }
319
320 }

  ViewVC Help
Powered by ViewVC 1.1.20