comparison backend/src/main/java/org/dive4elements/river/importer/ImporterSession.java @ 5838:5aa05a7a34b7

Rename modules to more fitting names.
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 25 Apr 2013 15:23:37 +0200
parents flys-backend/src/main/java/org/dive4elements/river/importer/ImporterSession.java@18619c1e7c2a
children 4dd33b86dc61
comparison
equal deleted inserted replaced
5837:d9901a08d0a6 5838:5aa05a7a34b7
1 package org.dive4elements.river.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 org.dive4elements.river.backend.SessionFactoryProvider;
15
16 import org.dive4elements.river.model.WstColumnValue;
17 import org.dive4elements.river.model.WstColumn;
18 import org.dive4elements.river.model.DischargeTableValue;
19 import org.dive4elements.river.model.DischargeTable;
20 import org.dive4elements.river.model.Range;
21 import org.dive4elements.river.model.River;
22
23 import org.apache.log4j.Logger;
24
25 import org.dive4elements.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 :

http://dive4elements.wald.intevation.org