root / trunk / libraries / libDataSource / src / org / gvsig / data / datastores / vectorial / driver / DriverStore.java @ 19440
History | View | Annotate | Download (6.97 KB)
1 |
package org.gvsig.data.datastores.vectorial.driver; |
---|---|
2 |
|
3 |
import java.awt.geom.Rectangle2D; |
4 |
import java.util.ArrayList; |
5 |
import java.util.Iterator; |
6 |
import java.util.List; |
7 |
|
8 |
import org.gvsig.data.DataSourceManager; |
9 |
import org.gvsig.data.IDataCollection; |
10 |
import org.gvsig.data.IDataStoreParameters; |
11 |
import org.gvsig.data.commands.implementation.AbstractFeatureCommand; |
12 |
import org.gvsig.data.spatialprovisional.IExtent; |
13 |
import org.gvsig.data.vectorial.AbstractFeatureStore; |
14 |
import org.gvsig.data.vectorial.FeatureStoreNotification; |
15 |
import org.gvsig.data.vectorial.IFeature; |
16 |
import org.gvsig.data.vectorial.IFeatureCollection; |
17 |
import org.gvsig.data.vectorial.IFeatureID; |
18 |
import org.gvsig.data.vectorial.IFeatureType; |
19 |
import org.gvsig.metadata.IMetadata; |
20 |
import org.gvsig.metadata.IMetadataManager; |
21 |
import org.gvsig.metadata.Metadata; |
22 |
import org.gvsig.metadata.MetadataManager; |
23 |
|
24 |
/**
|
25 |
*
|
26 |
* Los DataStore basados en drivers solo soportan un
|
27 |
* tipo de feature, no pueden tener varios tipos de feature en ellos.
|
28 |
*
|
29 |
* @author Equipo de desarrollo de gvSIG.
|
30 |
*
|
31 |
*/
|
32 |
public class DriverStore extends AbstractFeatureStore { |
33 |
public static String DATASTORE_NAME = "DriverDataSource"; |
34 |
|
35 |
protected IDriver driver;
|
36 |
private List featureTypes = new ArrayList();//<IFeatureType> |
37 |
|
38 |
private Rectangle2D fullExtent; |
39 |
|
40 |
public void init(IDataStoreParameters parameters) { |
41 |
super.init(parameters);
|
42 |
IDriverStoreParameters driverStoreParameters=(IDriverStoreParameters)parameters; |
43 |
DataSourceManager dsm = DataSourceManager.getManager(); |
44 |
|
45 |
this.driver = dsm.createDriver(driverStoreParameters.getDriverParameters());
|
46 |
|
47 |
} |
48 |
|
49 |
public String getName() { |
50 |
return DATASTORE_NAME;
|
51 |
} |
52 |
|
53 |
public void open() { |
54 |
this.observable.notifyObservers(
|
55 |
new FeatureStoreNotification(this,FeatureStoreNotification.BEFORE_OPEN) |
56 |
); |
57 |
driver.open(); |
58 |
this.observable.notifyObservers(
|
59 |
new FeatureStoreNotification(this,FeatureStoreNotification.AFTER_OPEN) |
60 |
); |
61 |
|
62 |
} |
63 |
|
64 |
public void close() { |
65 |
this.observable.notifyObservers(
|
66 |
new FeatureStoreNotification(this,FeatureStoreNotification.BEFORE_CLOSE) |
67 |
); |
68 |
driver.close(); |
69 |
this.observable.notifyObservers(
|
70 |
new FeatureStoreNotification(this,FeatureStoreNotification.AFTER_CLOSE) |
71 |
); |
72 |
} |
73 |
|
74 |
public void dispose() { |
75 |
this.observable.notifyObservers(
|
76 |
new FeatureStoreNotification(this,FeatureStoreNotification.BEFORE_DISPOSE) |
77 |
); |
78 |
driver.dispose(); |
79 |
this.observable.notifyObservers(
|
80 |
new FeatureStoreNotification(this,FeatureStoreNotification.AFTER_DISPOSE) |
81 |
); |
82 |
} |
83 |
|
84 |
public IFeature getFeatureByID(IFeatureID id) {
|
85 |
if (this.alterMode){ |
86 |
if (featureManager.contains(id)) {
|
87 |
return featureManager.getFeature(id);
|
88 |
} |
89 |
} |
90 |
return driver.getFeatureByID(id);
|
91 |
} |
92 |
|
93 |
public List getFeatureTypes() { |
94 |
featureTypes.set(0,driver.getFeatureType());
|
95 |
return featureTypes;
|
96 |
} |
97 |
|
98 |
public IFeatureType getDefaultFeatureType() {
|
99 |
IFeatureType ft = driver.getFeatureType(); |
100 |
if (isEditing()){
|
101 |
// Aqu? hay que construir un FeatureType con los cambios que se hayan hecho en la edici?n.
|
102 |
return attributeManager.getFeatureType(ft);
|
103 |
} |
104 |
return ft;
|
105 |
} |
106 |
|
107 |
public IDataCollection getDataCollection(IFeatureType type, String filter, String order) { |
108 |
IDataCollection dataCollection=driver.getDataCollection(featureManager,type, filter, order); |
109 |
this.addObserver(dataCollection);
|
110 |
return dataCollection;
|
111 |
} |
112 |
|
113 |
private void write(IFeatureCollection collection, IFeatureType featureType) { |
114 |
IFeaturesWriter writer = driver.getFeaturesWriter(); |
115 |
writer.init(driver); |
116 |
writer.updateFeatureType(featureType); |
117 |
writer.preProcess(); |
118 |
|
119 |
Iterator iterator=collection.iterator();
|
120 |
while (iterator.hasNext()) {
|
121 |
IFeature feature = (IFeature) iterator.next(); |
122 |
writer.updateFeature(feature); |
123 |
} |
124 |
writer.postProcess(); |
125 |
} |
126 |
|
127 |
public void finishEditing() { |
128 |
Iterator commandsfeatures = null; |
129 |
IFeaturesWriter writer = driver.getFeaturesWriter(); |
130 |
IFeatureType type = getDefaultFeatureType(); |
131 |
|
132 |
if (writer.isWriteAll()){
|
133 |
//?Llamar al driver para escribir una colecci?n?
|
134 |
write((IFeatureCollection)getDataCollection(),type); |
135 |
}else{
|
136 |
writer.init(driver); |
137 |
writer.updateFeatureType(type); |
138 |
writer.preProcess(); |
139 |
commandsfeatures = commands.getCommandsDeleted().iterator(); |
140 |
while( commandsfeatures.hasNext() ) {
|
141 |
Object obj=commandsfeatures.next();
|
142 |
if (obj instanceof AbstractFeatureCommand){ |
143 |
IFeature feature = ((AbstractFeatureCommand)obj).getFeature(); |
144 |
writer.deleteFeature(feature); |
145 |
} |
146 |
} |
147 |
commandsfeatures = commands.getCommandsUpdated().iterator(); |
148 |
while( commandsfeatures.hasNext() ) {
|
149 |
Object obj=commandsfeatures.next();
|
150 |
if (obj instanceof AbstractFeatureCommand){ |
151 |
IFeature feature = ((AbstractFeatureCommand)obj).getFeature(); |
152 |
writer.updateFeature(feature); |
153 |
} |
154 |
} |
155 |
commandsfeatures = commands.getCommandsInserted().iterator(); |
156 |
while( commandsfeatures.hasNext() ) {
|
157 |
Object obj=commandsfeatures.next();
|
158 |
if (obj instanceof AbstractFeatureCommand){ |
159 |
IFeature feature = ((AbstractFeatureCommand)obj).getFeature(); |
160 |
writer.insertFeature(feature); |
161 |
} |
162 |
} |
163 |
writer.postProcess(); |
164 |
} |
165 |
|
166 |
} |
167 |
|
168 |
public boolean isEditable() { |
169 |
return driver.isEditable();
|
170 |
} |
171 |
|
172 |
public boolean isWithDefaultLegend() { |
173 |
return (driver instanceof IDefaultLegend); |
174 |
} |
175 |
|
176 |
public Object getDefaultLegend() { |
177 |
if (driver instanceof IDefaultLegend) |
178 |
return ((IDefaultLegend)driver).getDefaultLegend();
|
179 |
return null; |
180 |
} |
181 |
|
182 |
public Object getDefaultLabelingStrategy() { |
183 |
if (driver instanceof IDefaultLegend) |
184 |
return ((IDefaultLegend)driver).getDefaultLabelingStrategy();
|
185 |
return null; |
186 |
} |
187 |
|
188 |
public boolean canAlterFeatureType() { |
189 |
return driver.canAlterFeatureType();
|
190 |
} |
191 |
|
192 |
public IMetadata getMetadata() {
|
193 |
IMetadata metadata=driver.getMetadata(); |
194 |
if (this.alterMode){ |
195 |
IExtent extent=(IExtent)metadata.get("extent");
|
196 |
IFeatureCollection featureCollection=(IFeatureCollection)getDataCollection(); |
197 |
if (spatialManager.isFullExtentDirty()){
|
198 |
if (!featureCollection.isEmpty()){
|
199 |
Iterator featureIterator=featureCollection.iterator();
|
200 |
extent = ((IFeature)featureIterator.next()).getExtent(); |
201 |
while(featureIterator.hasNext()){
|
202 |
IFeature feature=(IFeature)featureIterator.next(); |
203 |
IExtent boundExtent=feature.getExtent(); |
204 |
if (boundExtent!=null) |
205 |
extent.add(boundExtent); |
206 |
} |
207 |
} |
208 |
} |
209 |
metadata.set("extent",extent);
|
210 |
} |
211 |
return metadata;
|
212 |
} |
213 |
} |
214 |
|