Mercurial > dive4elements > river
comparison flys-backend/src/main/java/org/dive4elements/river/importer/ImporterSession.java @ 5828:dfb26b03b179
Moved directories to org.dive4elements.river
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 11:53:11 +0200 |
parents | flys-backend/src/main/java/de/intevation/flys/importer/ImporterSession.java@cdb35d96ca09 |
children | 18619c1e7c2a |
comparison
equal
deleted
inserted
replaced
5827:e308d4ecd35a | 5828:dfb26b03b179 |
---|---|
1 package de.intevation.flys.importer; | |
2 | |
3 import java.util.Iterator; | |
4 import java.util.Map; | |
5 import java.util.TreeMap; | |
6 | |
7 import java.math.BigDecimal; | |
8 | |
9 import org.hibernate.SessionFactory; | |
10 import org.hibernate.Session; | |
11 import org.hibernate.Query; | |
12 import org.hibernate.FlushMode; | |
13 | |
14 import de.intevation.flys.backend.SessionFactoryProvider; | |
15 | |
16 import de.intevation.flys.model.WstColumnValue; | |
17 import de.intevation.flys.model.WstColumn; | |
18 import de.intevation.flys.model.DischargeTableValue; | |
19 import de.intevation.flys.model.DischargeTable; | |
20 import de.intevation.flys.model.Range; | |
21 import de.intevation.flys.model.River; | |
22 | |
23 import org.apache.log4j.Logger; | |
24 | |
25 import de.intevation.artifacts.common.utils.LRUCache; | |
26 | |
27 public class ImporterSession | |
28 { | |
29 private static Logger log = Logger.getLogger(ImporterSession.class); | |
30 | |
31 private static final ThreadLocal<ImporterSession> SESSION = | |
32 new ThreadLocal<ImporterSession>() { | |
33 @Override | |
34 protected ImporterSession initialValue() { | |
35 return new ImporterSession(); | |
36 } | |
37 }; | |
38 | |
39 protected Session databaseSession; | |
40 | |
41 protected LRUCache<Integer, Map<ValueKey, WstColumnValue>> | |
42 wstColumnValues; | |
43 | |
44 protected LRUCache<Integer, Map<ValueKey, DischargeTableValue>> | |
45 dischargeTableValues; | |
46 | |
47 protected LRUCache<Integer, Map<ValueKey, Range>> | |
48 ranges; | |
49 | |
50 public static ImporterSession getInstance() { | |
51 return SESSION.get(); | |
52 } | |
53 | |
54 public ImporterSession() { | |
55 SessionFactory sessionFactory = | |
56 SessionFactoryProvider.createSessionFactory(); | |
57 databaseSession = sessionFactory.openSession(); | |
58 //databaseSession.setFlushMode(FlushMode.MANUAL); | |
59 | |
60 wstColumnValues = | |
61 new LRUCache<Integer, Map<ValueKey, WstColumnValue>>(); | |
62 | |
63 dischargeTableValues = | |
64 new LRUCache<Integer, Map<ValueKey, DischargeTableValue>>(); | |
65 | |
66 ranges = new LRUCache<Integer, Map<ValueKey, Range>>(); | |
67 } | |
68 | |
69 public Session getDatabaseSession() { | |
70 return databaseSession; | |
71 } | |
72 | |
73 public WstColumnValue getWstColumnValue( | |
74 WstColumn column, | |
75 BigDecimal position, | |
76 BigDecimal w | |
77 ) { | |
78 Integer c = column.getId(); | |
79 | |
80 Map<ValueKey, WstColumnValue> map = wstColumnValues.get(c); | |
81 | |
82 if (map == null) { | |
83 map = new TreeMap<ValueKey, WstColumnValue>( | |
84 ValueKey.EPSILON_COMPARATOR); | |
85 wstColumnValues.put(c, map); | |
86 Query query = databaseSession.createQuery( | |
87 "from WstColumnValue where wstColumn.id=:cid"); | |
88 query.setParameter("cid", c); | |
89 for (Iterator iter = query.iterate(); iter.hasNext();) { | |
90 WstColumnValue wcv = (WstColumnValue)iter.next(); | |
91 map.put(new ValueKey(wcv.getPosition(), wcv.getW()), wcv); | |
92 } | |
93 } | |
94 | |
95 ValueKey key = new ValueKey(position, w); | |
96 | |
97 WstColumnValue wcv = map.get(key); | |
98 | |
99 if (wcv != null) { | |
100 return wcv; | |
101 } | |
102 | |
103 wcv = new WstColumnValue(column, position, w); | |
104 | |
105 databaseSession.save(wcv); | |
106 | |
107 map.put(key, wcv); | |
108 | |
109 return wcv; | |
110 } | |
111 | |
112 public DischargeTableValue getDischargeTableValue( | |
113 DischargeTable table, | |
114 BigDecimal q, | |
115 BigDecimal w | |
116 ) { | |
117 Integer t = table.getId(); | |
118 | |
119 Map<ValueKey, DischargeTableValue> map = | |
120 dischargeTableValues.get(t); | |
121 | |
122 if (map == null) { | |
123 map = new TreeMap<ValueKey, DischargeTableValue>( | |
124 ValueKey.EPSILON_COMPARATOR); | |
125 dischargeTableValues.put(t, map); | |
126 Query query = databaseSession.createQuery( | |
127 "from DischargeTableValue where dischargeTable.id=:tid"); | |
128 query.setParameter("tid", t); | |
129 for (Iterator iter = query.iterate(); iter.hasNext();) { | |
130 DischargeTableValue dctv = (DischargeTableValue)iter.next(); | |
131 map.put(new ValueKey(dctv.getQ(), dctv.getW()), dctv); | |
132 } | |
133 } | |
134 | |
135 ValueKey key = new ValueKey(q, w); | |
136 | |
137 DischargeTableValue dctv = map.get(key); | |
138 | |
139 if (dctv != null) { | |
140 return dctv; | |
141 } | |
142 | |
143 dctv = new DischargeTableValue(table, q, w); | |
144 | |
145 databaseSession.save(dctv); | |
146 | |
147 map.put(key, dctv); | |
148 | |
149 return dctv; | |
150 } | |
151 | |
152 public Range getRange(River river, BigDecimal a, BigDecimal b) { | |
153 Integer r = river.getId(); | |
154 | |
155 Map<ValueKey, Range> map = ranges.get(r); | |
156 | |
157 if (map == null) { | |
158 map = new TreeMap<ValueKey, Range>( | |
159 ValueKey.EPSILON_COMPARATOR); | |
160 ranges.put(r, map); | |
161 Query query = databaseSession.createQuery( | |
162 "from Range where river.id=:rid"); | |
163 query.setParameter("rid", r); | |
164 for (Iterator iter = query.iterate(); iter.hasNext();) { | |
165 Range range = (Range)iter.next(); | |
166 map.put(new ValueKey(range.getA(), range.getB()), range); | |
167 } | |
168 } | |
169 | |
170 ValueKey key = new ValueKey(a, b); | |
171 | |
172 Range range = map.get(key); | |
173 | |
174 if (range != null) { | |
175 return range; | |
176 } | |
177 | |
178 range = new Range(a, b, river); | |
179 | |
180 databaseSession.save(range); | |
181 | |
182 map.put(key, range); | |
183 | |
184 return range; | |
185 } | |
186 } | |
187 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |