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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20