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

  ViewVC Help
Powered by ViewVC 1.1.20