svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.impl / src / main / java / org / gvsig / fmap / dal / feature / impl / FeatureTypeToStoreProviderAdapter.java @ 46078
History | View | Annotate | Download (14.1 KB)
1 |
package org.gvsig.fmap.dal.feature.impl; |
---|---|
2 |
|
3 |
import java.util.AbstractList; |
4 |
import java.util.Collections; |
5 |
import java.util.HashMap; |
6 |
import java.util.List; |
7 |
import java.util.Map; |
8 |
import org.gvsig.expressionevaluator.Expression; |
9 |
import org.gvsig.fmap.dal.DALLocator; |
10 |
import org.gvsig.fmap.dal.DataStoreParameters; |
11 |
import org.gvsig.fmap.dal.DataTypes; |
12 |
import org.gvsig.fmap.dal.exception.DataException; |
13 |
import org.gvsig.fmap.dal.exception.InitializeException; |
14 |
import org.gvsig.fmap.dal.exception.OpenException; |
15 |
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression; |
16 |
import org.gvsig.fmap.dal.feature.EditableFeatureType; |
17 |
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor; |
18 |
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator; |
19 |
import org.gvsig.fmap.dal.feature.FeatureStore; |
20 |
import org.gvsig.fmap.dal.feature.FeatureType; |
21 |
import org.gvsig.fmap.dal.feature.spi.FeatureProvider; |
22 |
import org.gvsig.fmap.dal.feature.spi.memory.AbstractMemoryStoreProvider; |
23 |
import org.gvsig.fmap.dal.feature.spi.memory.MemoryResource; |
24 |
import org.gvsig.fmap.dal.resource.spi.ResourceProvider; |
25 |
import org.gvsig.fmap.dal.spi.DataStoreInitializer2; |
26 |
import org.gvsig.fmap.dal.spi.DataStoreProvider; |
27 |
import org.gvsig.fmap.dal.spi.DataStoreProviderServices; |
28 |
import org.gvsig.fmap.dal.store.memory.MemoryStoreParameters; |
29 |
import org.gvsig.fmap.geom.Geometry; |
30 |
import org.gvsig.fmap.geom.primitive.Envelope; |
31 |
import org.gvsig.timesupport.Time; |
32 |
|
33 |
/**
|
34 |
*
|
35 |
* @author jjdelcerro
|
36 |
*/
|
37 |
public class FeatureTypeToStoreProviderAdapter extends AbstractMemoryStoreProvider { |
38 |
|
39 |
private static final String NAME = "FeatureType"; |
40 |
|
41 |
private static final int ATTR_NAME = 0; |
42 |
private static final int ATTR_TYPE = 1; |
43 |
private static final int ATTR_TYPENAME = 2; |
44 |
private static final int ATTR_SIZE = 3; |
45 |
private static final int ATTR_PRECISION = 4; |
46 |
private static final int ATTR_LABEL = 5; |
47 |
private static final int ATTR_SHORTLABEL = 6; |
48 |
private static final int ATTR_DESCRIPTION = 7; |
49 |
private static final int ATTR_PROFILE = 8; |
50 |
private static final int ATTR_GROUP = 9; |
51 |
private static final int ATTR_ORDER = 10; |
52 |
private static final int ATTR_ISPK = 11; |
53 |
private static final int ATTR_ISFK = 12; |
54 |
private static final int ATTR_ISCLOSEDLIST = 13; |
55 |
private static final int ATTR_ISREADONLY = 14; |
56 |
private static final int ATTR_ISCOMPUTED = 15; |
57 |
private static final int ATTR_ISCAUTOMATIC = 16; |
58 |
private static final int ATTR_ISHIDDEN = 17; |
59 |
private static final int ATTR_ALLOWNULLS = 18; |
60 |
private static final int ATTR_EXPRESSION = 19; |
61 |
private static final int ATTR_FKTABLE = 20; |
62 |
private static final int ATTR_FKCODE = 21; |
63 |
private static final int ATTR_FKLABEL = 22; |
64 |
private static final int ATTR_SCALE = 23; |
65 |
|
66 |
private static Map<String,Integer> attrName2Index; |
67 |
private static FeatureType featureTypeOfFeatureType; |
68 |
|
69 |
|
70 |
private static class Features |
71 |
extends AbstractList<FeatureProvider> |
72 |
implements List<FeatureProvider> |
73 |
{ |
74 |
|
75 |
private static class MyFeatureProvider implements FeatureProvider { |
76 |
|
77 |
private FeatureAttributeDescriptor descriptor;
|
78 |
|
79 |
public MyFeatureProvider(FeatureAttributeDescriptor descriptor) {
|
80 |
this.descriptor = descriptor;
|
81 |
} |
82 |
|
83 |
@Override
|
84 |
public boolean isReadOnly(int i) { |
85 |
return true; |
86 |
} |
87 |
|
88 |
@Override
|
89 |
public void set(int i, Object value) { |
90 |
} |
91 |
|
92 |
@Override
|
93 |
public Object get(int i) { |
94 |
switch(i) {
|
95 |
case ATTR_NAME:
|
96 |
return this.descriptor.getName(); |
97 |
case ATTR_SIZE:
|
98 |
return this.descriptor.getSize(); |
99 |
case ATTR_TYPE:
|
100 |
return this.descriptor.getType(); |
101 |
case ATTR_TYPENAME:
|
102 |
return this.descriptor.getDataTypeName(); |
103 |
case ATTR_PRECISION:
|
104 |
return this.descriptor.getPrecision(); |
105 |
case ATTR_SCALE:
|
106 |
return this.descriptor.getScale(); |
107 |
case ATTR_SHORTLABEL:
|
108 |
return this.descriptor.getShortLabel(); |
109 |
case ATTR_LABEL:
|
110 |
return this.descriptor.getLabel(); |
111 |
case ATTR_DESCRIPTION:
|
112 |
return this.descriptor.getDescription(); |
113 |
case ATTR_PROFILE:
|
114 |
return this.descriptor.getDataProfileName(); |
115 |
case ATTR_GROUP:
|
116 |
return this.descriptor.getGroup(); |
117 |
case ATTR_ORDER:
|
118 |
return this.descriptor.getOder(); |
119 |
case ATTR_ISPK:
|
120 |
return this.descriptor.isPrimaryKey(); |
121 |
case ATTR_ISFK:
|
122 |
return this.descriptor.isForeingKey(); |
123 |
case ATTR_ISCLOSEDLIST:
|
124 |
if( this.descriptor.isForeingKey() ) { |
125 |
return this.descriptor.getForeingKey().isClosedList(); |
126 |
} |
127 |
return false; |
128 |
case ATTR_ISREADONLY:
|
129 |
return this.descriptor.isReadOnly(); |
130 |
case ATTR_ISCOMPUTED:
|
131 |
return this.descriptor.isComputed(); |
132 |
case ATTR_ISCAUTOMATIC:
|
133 |
return this.descriptor.isAutomatic(); |
134 |
case ATTR_ISHIDDEN:
|
135 |
return this.descriptor.isHidden(); |
136 |
case ATTR_ALLOWNULLS:
|
137 |
return this.descriptor.allowNull(); |
138 |
case ATTR_EXPRESSION: {
|
139 |
FeatureAttributeEmulator x = this.descriptor.getFeatureAttributeEmulator();
|
140 |
if( x instanceof FeatureAttributeEmulatorExpression ) { |
141 |
Expression exp = ((FeatureAttributeEmulatorExpression) x).getExpression();
|
142 |
if( exp != null ) { |
143 |
return exp.getPhrase();
|
144 |
} |
145 |
} |
146 |
return null; |
147 |
} |
148 |
case ATTR_FKTABLE:
|
149 |
if( this.descriptor.isForeingKey() ) { |
150 |
return this.descriptor.getForeingKey().getTableName(); |
151 |
} |
152 |
return null; |
153 |
case ATTR_FKCODE:
|
154 |
if( this.descriptor.isForeingKey() ) { |
155 |
return this.descriptor.getForeingKey().getCodeName(); |
156 |
} |
157 |
return null; |
158 |
case ATTR_FKLABEL:
|
159 |
if( this.descriptor.isForeingKey() ) { |
160 |
return this.descriptor.getForeingKey().getLabelFormula(); |
161 |
} |
162 |
return null; |
163 |
|
164 |
|
165 |
default:
|
166 |
return null; |
167 |
} |
168 |
} |
169 |
|
170 |
@Override
|
171 |
public void set(String name, Object value) { |
172 |
} |
173 |
|
174 |
@Override
|
175 |
public Object get(String name) { |
176 |
int n = attrName2Index.get(name);
|
177 |
return this.get(n); |
178 |
} |
179 |
|
180 |
@Override
|
181 |
public void setOID(Object oid) { |
182 |
} |
183 |
|
184 |
@Override
|
185 |
public Object getOID() { |
186 |
return (long) this.descriptor.getIndex(); |
187 |
} |
188 |
|
189 |
@Override
|
190 |
public FeatureType getType() {
|
191 |
return featureTypeOfFeatureType;
|
192 |
} |
193 |
|
194 |
@Override
|
195 |
public FeatureProvider getCopy() {
|
196 |
return this; |
197 |
} |
198 |
|
199 |
@Override
|
200 |
public Envelope getDefaultEnvelope() {
|
201 |
return null; |
202 |
} |
203 |
|
204 |
@Override
|
205 |
public Geometry getDefaultGeometry() {
|
206 |
return null; |
207 |
} |
208 |
|
209 |
@Override
|
210 |
public Time getDefaultTime() { |
211 |
return null; |
212 |
} |
213 |
|
214 |
@Override
|
215 |
public void setDefaultEnvelope(Envelope extent) { |
216 |
} |
217 |
|
218 |
@Override
|
219 |
public void setDefaultGeometry(Geometry geom) { |
220 |
} |
221 |
|
222 |
@Override
|
223 |
public void setDefaultTime(Time time) { |
224 |
} |
225 |
|
226 |
@Override
|
227 |
public boolean isNull(int i) { |
228 |
return false; |
229 |
} |
230 |
|
231 |
@Override
|
232 |
public boolean isNull(String name) { |
233 |
return false; |
234 |
} |
235 |
|
236 |
@Override
|
237 |
public boolean isNew() { |
238 |
return false; |
239 |
} |
240 |
|
241 |
@Override
|
242 |
public void setNew(boolean isNew) { |
243 |
} |
244 |
|
245 |
@Override
|
246 |
public void setExtraValue(int index, Object value) { |
247 |
} |
248 |
|
249 |
@Override
|
250 |
public Object getExtraValue(int index) { |
251 |
return null; |
252 |
} |
253 |
|
254 |
@Override
|
255 |
public Object getExtraValue(String name) { |
256 |
return null; |
257 |
} |
258 |
|
259 |
@Override
|
260 |
public void setExtraValueNames(String[] extraValueNames) { |
261 |
} |
262 |
|
263 |
@Override
|
264 |
public boolean hasExtraValue(String name) { |
265 |
return false; |
266 |
} |
267 |
|
268 |
|
269 |
} |
270 |
|
271 |
private final FeatureType featureType; |
272 |
|
273 |
public Features(FeatureType featureType) {
|
274 |
this.featureType = featureType;
|
275 |
} |
276 |
|
277 |
@Override
|
278 |
public FeatureProvider get(int index) { |
279 |
return new MyFeatureProvider(this.featureType.get(index)); |
280 |
} |
281 |
|
282 |
@Override
|
283 |
public int size() { |
284 |
return this.featureType.size(); |
285 |
} |
286 |
|
287 |
} |
288 |
|
289 |
private final FeatureType featureType; |
290 |
private final ResourceProvider resource; |
291 |
private final Double sourceID; |
292 |
|
293 |
private FeatureTypeToStoreProviderAdapter(
|
294 |
DataStoreParameters parameters, |
295 |
DataStoreProviderServices storeServices, |
296 |
FeatureType featureType |
297 |
) throws InitializeException {
|
298 |
super(parameters, storeServices);
|
299 |
this.featureType = featureType;
|
300 |
this.data = new Features(featureType); |
301 |
this.sourceID = Math.random(); |
302 |
this.resource = createResource(
|
303 |
MemoryResource.NAME, |
304 |
new Object[] { NAME } |
305 |
); |
306 |
|
307 |
if( featureTypeOfFeatureType==null ) { |
308 |
this.initFeatureType();
|
309 |
} |
310 |
|
311 |
this.getStoreServices().setFeatureTypes(
|
312 |
Collections.singletonList(featureTypeOfFeatureType),
|
313 |
featureTypeOfFeatureType |
314 |
); |
315 |
} |
316 |
|
317 |
public static FeatureStore createFeatureStore(FeatureType featureType) { |
318 |
try {
|
319 |
DataStoreParameters parameters = FeatureTypeToStoreProviderAdapter.getParameters(featureType); |
320 |
DefaultFeatureStore store = new DefaultFeatureStore();
|
321 |
DataStoreProvider provider = new FeatureTypeToStoreProviderAdapter(
|
322 |
parameters, |
323 |
store, |
324 |
featureType |
325 |
); |
326 |
store.intialize(DALLocator.getDataManager(), parameters); |
327 |
((DataStoreInitializer2)store).setProvider(provider); |
328 |
return store;
|
329 |
} catch (Exception ex) { |
330 |
return null; |
331 |
} |
332 |
|
333 |
} |
334 |
|
335 |
private void initFeatureType() { |
336 |
if( featureTypeOfFeatureType!=null ) { |
337 |
return;
|
338 |
} |
339 |
EditableFeatureType ft = this.getStoreServices().createFeatureType(
|
340 |
getName() |
341 |
); |
342 |
ft.setHasOID(true);
|
343 |
|
344 |
ft.add("name", DataTypes.STRING, 100); |
345 |
ft.add("type", DataTypes.INT, 0); |
346 |
ft.add("typeName", DataTypes.STRING, 100); |
347 |
ft.add("size", DataTypes.INT, 0); |
348 |
ft.add("precision", DataTypes.INT, 0); |
349 |
ft.add("label", DataTypes.STRING, 100); |
350 |
ft.add("shortlabel", DataTypes.STRING, 100); |
351 |
ft.add("description", DataTypes.STRING, 1024); |
352 |
ft.add("profile", DataTypes.STRING, 100); |
353 |
ft.add("group", DataTypes.STRING, 100); |
354 |
ft.add("order", DataTypes.INT, 0); |
355 |
ft.add("isPk", DataTypes.BOOLEAN, 0); |
356 |
ft.add("isFk", DataTypes.BOOLEAN, 0); |
357 |
ft.add("isClosedList", DataTypes.BOOLEAN, 0); |
358 |
ft.add("isReadOnly", DataTypes.BOOLEAN, 0); |
359 |
ft.add("isComputed", DataTypes.BOOLEAN, 0); |
360 |
ft.add("isAutomatic", DataTypes.BOOLEAN, 0); |
361 |
ft.add("isHidden", DataTypes.BOOLEAN, 0); |
362 |
ft.add("allowNulls", DataTypes.BOOLEAN, 0); |
363 |
ft.add("expression", DataTypes.STRING, 1024); |
364 |
ft.add("fkTable", DataTypes.STRING, 100); |
365 |
ft.add("fkCode", DataTypes.STRING, 100); |
366 |
ft.add("fkLabel", DataTypes.STRING, 1024); |
367 |
|
368 |
featureTypeOfFeatureType = ft; |
369 |
attrName2Index = new HashMap<>(); |
370 |
for (FeatureAttributeDescriptor attr : ft) {
|
371 |
attrName2Index.put(attr.getName(), attr.getIndex()); |
372 |
} |
373 |
} |
374 |
|
375 |
private static MemoryStoreParameters getParameters(FeatureType featureType) { |
376 |
MemoryStoreParameters params = new MemoryStoreParameters(NAME);
|
377 |
params.setDynValue(MemoryStoreParameters.ORDER_PARAMETER_NAME, "name");
|
378 |
return params;
|
379 |
} |
380 |
|
381 |
@Override
|
382 |
public void open() throws OpenException { |
383 |
} |
384 |
|
385 |
@Override
|
386 |
public FeatureProvider createFeatureProvider(FeatureType featureType)throws DataException { |
387 |
return null; |
388 |
} |
389 |
|
390 |
@Override
|
391 |
public ResourceProvider getResource() {
|
392 |
return this.resource; |
393 |
} |
394 |
|
395 |
@Override
|
396 |
public final Object getSourceId() { |
397 |
return this.sourceID; |
398 |
} |
399 |
|
400 |
@Override
|
401 |
public final String getProviderName() { |
402 |
return NAME;
|
403 |
} |
404 |
|
405 |
@Override
|
406 |
public final String getName() { |
407 |
return this.featureType.getStore().getName() + "!" + this.featureType.getId(); |
408 |
} |
409 |
|
410 |
@Override
|
411 |
public final String getFullName() { |
412 |
return this.featureType.getStore().getFullName()+ "!" + this.featureType.getId(); |
413 |
} |
414 |
|
415 |
@Override
|
416 |
public Object createNewOID() { |
417 |
return null; |
418 |
} |
419 |
|
420 |
@Override
|
421 |
public int getOIDType() { |
422 |
return DataTypes.LONG;
|
423 |
} |
424 |
|
425 |
} |