gvsig-projects-pool / org.gvsig.vcsgis / trunk / org.gvsig.vcsgis / org.gvsig.vcsgis.lib / org.gvsig.vcsgis.lib.impl / src / main / java / org / gvsig / vcsgis / lib / repository / localdb / tables / DataRepoTable.java @ 3633
History | View | Annotate | Download (13.1 KB)
1 |
package org.gvsig.vcsgis.lib.repository.localdb.tables; |
---|---|
2 |
|
3 |
import java.sql.Timestamp; |
4 |
import java.text.SimpleDateFormat; |
5 |
import javax.json.JsonObject; |
6 |
import org.gvsig.expressionevaluator.spi.JsonUtils; |
7 |
import org.gvsig.fmap.dal.DALLocator; |
8 |
import org.gvsig.fmap.dal.DataManager; |
9 |
import org.gvsig.fmap.dal.DataTypes; |
10 |
import org.gvsig.fmap.dal.feature.EditableFeatureType; |
11 |
import org.gvsig.fmap.dal.feature.Feature; |
12 |
import org.gvsig.fmap.dal.feature.FeatureSet; |
13 |
import org.gvsig.fmap.dal.feature.FeatureStore; |
14 |
import org.gvsig.fmap.dal.feature.FeatureType; |
15 |
import org.gvsig.fmap.geom.Geometry; |
16 |
import org.gvsig.json.Json; |
17 |
import org.gvsig.json.JsonObjectBuilder; |
18 |
import org.gvsig.tools.dataTypes.CoercionException; |
19 |
import org.gvsig.tools.dispose.DisposableIterable; |
20 |
import org.gvsig.tools.dispose.DisposeUtils; |
21 |
import org.gvsig.tools.dynform.spi.DynFormSPIManager; |
22 |
import org.gvsig.tools.dynobject.DynObjectValueItem; |
23 |
import static org.gvsig.vcsgis.lib.VCSGisManager.OP_DELETE; |
24 |
import static org.gvsig.vcsgis.lib.VCSGisManager.OP_INSERT; |
25 |
import static org.gvsig.vcsgis.lib.VCSGisManager.OP_UPDATE; |
26 |
import static org.gvsig.vcsgis.lib.VCSGisManager.VCSGISCODELEN; |
27 |
import org.gvsig.vcsgis.lib.VCSGisUtils; |
28 |
import org.gvsig.vcsgis.lib.repository.VCSGisRepositoryData; |
29 |
import org.gvsig.vcsgis.lib.repository.localdb.VCSGisRepositoryLocaldb; |
30 |
|
31 |
/**
|
32 |
*
|
33 |
* @author gvSIG Team
|
34 |
*/
|
35 |
@SuppressWarnings("UseSpecificCatch") |
36 |
public class DataRepoTable extends AbstractRepoTable { |
37 |
|
38 |
public static final String TABLE_NAME = "VCSGISREPO_DATA"; |
39 |
|
40 |
private static final String COD_DATA = "COD_DATA"; |
41 |
private static final String COD_ENTITY = "COD_ENTITY"; |
42 |
private static final String COD_REVISION = "COD_REVISION"; |
43 |
private static final String DATA_REVNUMBER = "DAT_REVNUMBER"; |
44 |
private static final String DATA_EFECTIVEDATE = "DAT_EFECTIVEDATE"; |
45 |
private static final String DATA_OPERATION = "DAT_OPERATION"; |
46 |
private static final String DATA_FEATURERELATEDCODE = "DAT_FEATURERELATEDCODE"; |
47 |
private static final String DATA_GEOM = "DAT_GEOM"; |
48 |
private static final String DATA_DATA = "DAT_DATA"; |
49 |
|
50 |
public static class DataRepoRow extends AbstractRow implements VCSGisRepositoryData { |
51 |
|
52 |
public DataRepoRow(VCSGisRepositoryLocaldb repository) {
|
53 |
super(repository, TABLE_NAME, COD_DATA, null); |
54 |
} |
55 |
|
56 |
public DataRepoRow(VCSGisRepositoryLocaldb repository, Feature feature) {
|
57 |
super(repository, TABLE_NAME, COD_DATA, feature);
|
58 |
} |
59 |
|
60 |
@Override
|
61 |
public String getDataCode() { |
62 |
return this.getCode(); |
63 |
} |
64 |
|
65 |
@Override
|
66 |
public String getRevisionCode() { |
67 |
return this.feature.getString(COD_REVISION); |
68 |
} |
69 |
|
70 |
@Override
|
71 |
public String getEntityCode() { |
72 |
return this.feature.getString(COD_ENTITY); |
73 |
} |
74 |
|
75 |
@Override
|
76 |
public int getOperation() { |
77 |
return this.feature.getInt(DATA_OPERATION); |
78 |
} |
79 |
|
80 |
@Override
|
81 |
public int getRevisionNumber() { |
82 |
return this.feature.getInt(DATA_REVNUMBER); |
83 |
} |
84 |
|
85 |
@Override
|
86 |
public Timestamp getEfectiveDate() { |
87 |
return this.feature.getTimestamp(DATA_EFECTIVEDATE); |
88 |
} |
89 |
|
90 |
@Override
|
91 |
public String getFeatureRelatedCode() { |
92 |
return this.feature.getString(DATA_FEATURERELATEDCODE); |
93 |
} |
94 |
|
95 |
public Geometry getGeometry() {
|
96 |
return this.feature.getGeometry(DATA_GEOM); |
97 |
} |
98 |
|
99 |
@Override
|
100 |
public String getData() { |
101 |
return this.feature.getString(DATA_DATA); |
102 |
} |
103 |
|
104 |
public void setRevisionCode(String code) { |
105 |
this.feature.set(COD_REVISION, code);
|
106 |
} |
107 |
|
108 |
public void setEntityCode(String code) { |
109 |
this.feature.set(COD_ENTITY, code);
|
110 |
} |
111 |
|
112 |
public void setOperation(int op) { |
113 |
this.feature.set(DATA_OPERATION, op);
|
114 |
} |
115 |
|
116 |
public void setRevisionNumber(long revnum) { |
117 |
this.feature.set(DATA_REVNUMBER, revnum);
|
118 |
} |
119 |
|
120 |
public void setEfectiveDate(Timestamp date) { |
121 |
this.feature.set(DATA_EFECTIVEDATE, date);
|
122 |
} |
123 |
|
124 |
public void setIdentifier(String code) { |
125 |
this.feature.set(DATA_FEATURERELATEDCODE, code);
|
126 |
} |
127 |
|
128 |
public void setGeometry(Geometry geom) { |
129 |
this.feature.set(DATA_GEOM, geom);
|
130 |
} |
131 |
|
132 |
public void setValues(String jsonValues) { |
133 |
this.feature.set(DATA_DATA, jsonValues);
|
134 |
} |
135 |
|
136 |
@Override
|
137 |
public JsonObject getDataAsJson() {
|
138 |
try {
|
139 |
String s = this.getData(); |
140 |
if( s == null ) { |
141 |
return null; |
142 |
} |
143 |
JsonObject json = JsonUtils.toJsonObject(s); |
144 |
return json;
|
145 |
} catch (CoercionException ex) {
|
146 |
return null; |
147 |
} |
148 |
} |
149 |
|
150 |
@Override
|
151 |
public JsonObject toJson() {
|
152 |
return this.toJsonBuilder().build(); |
153 |
} |
154 |
|
155 |
@Override
|
156 |
public JsonObjectBuilder toJsonBuilder() {
|
157 |
JsonObjectBuilder builder = Json.createObjectBuilder(); |
158 |
builder.add("DataCode", this.getDataCode()); |
159 |
builder.add("EntityCode", this.getEntityCode()); |
160 |
builder.add("RevisionCode", this.getRevisionCode()); |
161 |
builder.add("RevisionNumber", this.getRevisionNumber()); |
162 |
builder.add("EfectiveDate", this.getEfectiveDate().toString()); |
163 |
builder.add("Operation", this.getOperation()); |
164 |
builder.add("FeatureRelatedCode", this.getFeatureRelatedCode()); |
165 |
builder.add("Data", this.getData()); |
166 |
return builder;
|
167 |
} |
168 |
|
169 |
} |
170 |
|
171 |
public DataRepoTable() {
|
172 |
super(TABLE_NAME, featureType());
|
173 |
} |
174 |
|
175 |
|
176 |
public DisposableIterable<Feature> getDataOfEntityFromRevisionNumber(VCSGisRepositoryLocaldb repository, String entityCode, long revnumber) { |
177 |
// if revnumber < 0 return all features
|
178 |
FeatureStore store = null;
|
179 |
DisposableIterable<Feature> features = null;
|
180 |
try {
|
181 |
|
182 |
String sql = String.format( |
183 |
VCSGisUtils.getSqlTemplate( |
184 |
repository.getServerExplorer().getProviderName(), |
185 |
"getDataOfEntityFromRevisionNumber"),
|
186 |
revnumber, |
187 |
entityCode |
188 |
); |
189 |
|
190 |
|
191 |
store = repository.openFeatureStore(TABLE_NAME,sql); |
192 |
FeatureSet fset = store.getFeatureSet(); |
193 |
// dumpData("Data", fset);
|
194 |
features = fset.iterable(); |
195 |
return features;
|
196 |
} catch (Exception ex) { |
197 |
DisposeUtils.disposeQuietly(features); |
198 |
throw new RuntimeException("Can't retrieve data of 'ENTITY["+entityCode+"] from revision "+revnumber+".", ex); |
199 |
} finally {
|
200 |
if( store!=null ) { |
201 |
DisposeUtils.dispose(store); |
202 |
} |
203 |
} |
204 |
} |
205 |
|
206 |
public DisposableIterable<Feature> getDataOfEntityToRevisionNumber(VCSGisRepositoryLocaldb repository, String entityCode, long revnumber) { |
207 |
// if revnumber < 0 return all features
|
208 |
FeatureStore store = null;
|
209 |
DisposableIterable<Feature> features = null;
|
210 |
try {
|
211 |
|
212 |
String sql = String.format( |
213 |
VCSGisUtils.getSqlTemplate( |
214 |
repository.getServerExplorer().getProviderName(), |
215 |
"getDataOfEntityToRevisionNumber"),
|
216 |
revnumber, |
217 |
entityCode |
218 |
); |
219 |
|
220 |
|
221 |
store = repository.openFeatureStore(TABLE_NAME,sql); |
222 |
FeatureSet fset = store.getFeatureSet(); |
223 |
// dumpData("Data", fset);
|
224 |
features = fset.iterable(); |
225 |
return features;
|
226 |
} catch (Exception ex) { |
227 |
DisposeUtils.disposeQuietly(features); |
228 |
throw new RuntimeException("Can't retrieve data of 'ENTITY["+entityCode+"] to revision "+revnumber+".", ex); |
229 |
} finally {
|
230 |
if( store!=null ) { |
231 |
DisposeUtils.dispose(store); |
232 |
} |
233 |
} |
234 |
} |
235 |
|
236 |
public DisposableIterable<Feature> getDataOfEntityFromEfectiveDate(VCSGisRepositoryLocaldb repository, String entityCode, Timestamp efectiveDate) { |
237 |
FeatureStore store = null;
|
238 |
DisposableIterable<Feature> features = null;
|
239 |
SimpleDateFormat dateFormat = new SimpleDateFormat( |
240 |
VCSGisUtils.getSqlTemplate( |
241 |
repository.getServerExplorer().getProviderName(), |
242 |
"dateFormat")
|
243 |
); |
244 |
try {
|
245 |
String sql = String.format( |
246 |
VCSGisUtils.getSqlTemplate( |
247 |
repository.getServerExplorer().getProviderName(), |
248 |
"getDataOfEntityFromEfectiveDate"
|
249 |
), |
250 |
entityCode, |
251 |
dateFormat.format(efectiveDate) |
252 |
); |
253 |
|
254 |
store = repository.openFeatureStore(TABLE_NAME,sql); |
255 |
FeatureSet fset = store.getFeatureSet(); |
256 |
features = fset.iterable(); |
257 |
return features;
|
258 |
} catch (Exception ex) { |
259 |
DisposeUtils.disposeQuietly(features); |
260 |
throw new RuntimeException("Can't data of 'ENTITY["+entityCode+"] from efective date "+efectiveDate+".", ex); |
261 |
} finally {
|
262 |
if( store!=null ) { |
263 |
DisposeUtils.dispose(store); |
264 |
} |
265 |
} |
266 |
} |
267 |
|
268 |
private void dumpData(String s, FeatureSet fset) { |
269 |
LOGGER.debug("BEGIN "+s);
|
270 |
DisposableIterable<Feature> features = fset.iterable(); |
271 |
for (Feature feature : features) {
|
272 |
LOGGER.debug("DATA: "+ feature.toJson().toString());
|
273 |
} |
274 |
LOGGER.debug("END "+s);
|
275 |
} |
276 |
|
277 |
public static final FeatureType featureType() { |
278 |
DataManager dataManager = DALLocator.getDataManager(); |
279 |
EditableFeatureType ft = dataManager.createFeatureType(); |
280 |
ft.setLabel("VCSGIS Data");
|
281 |
ft.getTags().set("ID", TABLE_NAME);
|
282 |
ft.getTags().set(DynFormSPIManager.TAG_DYNFORM_HEIGHT, 400);
|
283 |
ft.getTags().set(DynFormSPIManager.TAG_DYNFORM_WIDTH, 500);
|
284 |
ft.getTags().set(DynFormSPIManager.TAG_DYNFORM_LAYOUTMODE, DynFormSPIManager.TAG_DYNFORM_LAYOUTMODE_VALUE_TABS); |
285 |
ft.add(COD_DATA, DataTypes.STRING) |
286 |
.setSize(VCSGISCODELEN) |
287 |
.setIsPrimaryKey(true)
|
288 |
.setLabel("Code");
|
289 |
ft.add(COD_REVISION, DataTypes.STRING) |
290 |
.setForeingkey( |
291 |
true,
|
292 |
false,
|
293 |
RevisionsRepoTable.TABLE_NAME, |
294 |
RevisionsRepoTable.COD_REVISION, |
295 |
"FORMAT('r%d %s', REV_NUMBER, REV_OPERATIONDATE)"
|
296 |
) |
297 |
// .setIsIndexed(true)
|
298 |
// .setAllowIndexDuplicateds(true)
|
299 |
.setSize(VCSGISCODELEN) |
300 |
.setLabel("Revision");
|
301 |
ft.add(COD_ENTITY, DataTypes.STRING) |
302 |
.setForeingkey( |
303 |
true,
|
304 |
false,
|
305 |
EntitiesRepoTable.TABLE_NAME, |
306 |
EntitiesRepoTable.COD_ENTITY, |
307 |
EntitiesRepoTable.ENTITY_NAME |
308 |
) |
309 |
// .setIsIndexed(true)
|
310 |
// .setAllowIndexDuplicateds(true)
|
311 |
.setSize(VCSGISCODELEN) |
312 |
.setLabel("Entity");
|
313 |
ft.add(DATA_OPERATION, DataTypes.INTEGER) |
314 |
// .setIsIndexed(true)
|
315 |
// .setAllowIndexDuplicateds(true)
|
316 |
.setLabel("Operation")
|
317 |
.setAvailableValues(new DynObjectValueItem[] { |
318 |
new DynObjectValueItem(OP_INSERT, "Insert"), |
319 |
new DynObjectValueItem(OP_DELETE, "Delete"), |
320 |
new DynObjectValueItem(OP_UPDATE, "Update") |
321 |
}); |
322 |
ft.add(DATA_REVNUMBER, DataTypes.LONG) |
323 |
// .setIsIndexed(true)
|
324 |
// .setAllowIndexDuplicateds(true)
|
325 |
.setLabel("Rev. number");
|
326 |
ft.add(DATA_EFECTIVEDATE, DataTypes.TIMESTAMP) |
327 |
// .setIsIndexed(true)
|
328 |
// .setAllowIndexDuplicateds(true)
|
329 |
.setLabel("User date");
|
330 |
ft.add(DATA_FEATURERELATEDCODE, DataTypes.STRING) |
331 |
// .setIsIndexed(true)
|
332 |
// .setAllowIndexDuplicateds(true)
|
333 |
.setSize(VCSGISCODELEN) |
334 |
.setLabel("Identifier")
|
335 |
.setDescription("Identifier if the feature that represent.");
|
336 |
ft.add(DATA_GEOM, DataTypes.GEOMETRY) |
337 |
.setGeometryType(Geometry.TYPES.GEOMETRY, Geometry.SUBTYPES.GEOM3D) |
338 |
// .setIsIndexed(true)
|
339 |
.setLabel("Geometry");
|
340 |
ft.add(DATA_DATA, DataTypes.STRING) |
341 |
.setSize(10240)
|
342 |
.setLabel("Feature data serialized in json.")
|
343 |
.setGroup("Data");
|
344 |
|
345 |
return ft.getNotEditableCopy();
|
346 |
} |
347 |
|
348 |
public boolean canUpdate(String relatedFeatureCode) { |
349 |
return true; |
350 |
} |
351 |
|
352 |
public boolean canDelete(String relatedFeatureCode) { |
353 |
return true; |
354 |
} |
355 |
|
356 |
} |