Statistics
| Revision:

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