Statistics
| Revision:

svn-gvsig-desktop / tags / v2_0_0_Build_2020 / libraries / libFMap_dal / src / org / gvsig / fmap / dal / store / memory / MemoryStoreProvider.java @ 33784

History | View | Annotate | Download (7.12 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 * 
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 * 
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 * 
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
19
 * MA  02110-1301, USA.
20
 * 
21
 */
22

    
23
/*
24
 * AUTHORS (In addition to CIT):
25
 * 2009 {Iver T.I.}   {Task}
26
 */
27

    
28
package org.gvsig.fmap.dal.store.memory;
29

    
30
import java.util.ArrayList;
31
import java.util.Hashtable;
32
import java.util.Iterator;
33
import java.util.List;
34
import java.util.Map;
35

    
36
import org.gvsig.fmap.dal.DataStore;
37
import org.gvsig.fmap.dal.DataTypes;
38
import org.gvsig.fmap.dal.exception.DataException;
39
import org.gvsig.fmap.dal.exception.InitializeException;
40
import org.gvsig.fmap.dal.exception.OpenException;
41
import org.gvsig.fmap.dal.feature.Feature;
42
import org.gvsig.fmap.dal.feature.FeatureSet;
43
import org.gvsig.fmap.dal.feature.FeatureType;
44
import org.gvsig.fmap.dal.feature.exception.PerformEditingException;
45
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
46
import org.gvsig.fmap.dal.feature.spi.FeatureReferenceProviderServices;
47
import org.gvsig.fmap.dal.feature.spi.memory.AbstractMemoryStoreProvider;
48
import org.gvsig.fmap.dal.feature.spi.memory.MemoryResource;
49
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
50
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
51
import org.gvsig.fmap.geom.GeometryLocator;
52
import org.gvsig.fmap.geom.GeometryManager;
53
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
54
import org.gvsig.fmap.geom.primitive.Envelope;
55
import org.gvsig.metadata.MetadataLocator;
56
import org.gvsig.metadata.MetadataManager;
57
import org.gvsig.metadata.exceptions.MetadataException;
58
import org.gvsig.tools.ToolsLocator;
59
import org.gvsig.tools.dispose.DisposableIterator;
60
import org.gvsig.tools.dynobject.DynObject;
61
import org.gvsig.tools.dynobject.DynStruct;
62
import org.slf4j.Logger;
63
import org.slf4j.LoggerFactory;
64

    
65
/**
66
 * @author <a href="mailto:jpiera@gvsig.org">Jorge Piera</a>
67
 * 
68
 *         TODO: take into account the parameter "autoOrderAttributeName" to
69
 *         order the {@link Feature}s by default by that attribute, in ascending
70
 *         order.
71
 */
72
public class MemoryStoreProvider extends AbstractMemoryStoreProvider{
73
        private static final Logger logger = LoggerFactory.getLogger(MemoryStoreProvider.class);
74

    
75
        private static GeometryManager geomManager = GeometryLocator.getGeometryManager();
76
        public static final String NAME = "Memory";
77
        public static final String DESCRIPTION = "Memory provider";
78
        
79
        public static final String METADATA_DEFINITION_NAME = "MemoryProvider";
80
        
81
        private long counterNewsOIDs = 0;
82
        private Envelope envelope = null;
83
        private Map oids = null;
84
        
85
        private Double sourceID = null;
86

    
87
        private ResourceProvider memoryResource;
88

    
89
        public static DynObject newMetadataContainer(String name) {
90
            return ToolsLocator.getDynObjectManager()
91
                        .createDynObject(
92
                                MetadataLocator.getMetadataManager().getDefinition(name)
93
                        );
94
        }
95
        
96
        public MemoryStoreProvider(MemoryStoreParameters memoryStoreParameters, 
97
                        DataStoreProviderServices storeServices) throws InitializeException {
98
                super(
99
                                memoryStoreParameters, 
100
                                storeServices,
101
                                newMetadataContainer(METADATA_DEFINITION_NAME)
102
                );
103
                sourceID = new Double(Math.random());
104
                data = new ArrayList();
105
                oids = new Hashtable();
106
                initialize();
107
                memoryResource =
108
                                createResource(MemoryResource.NAME,
109
                                                new Object[] { memoryStoreParameters.getName() });
110
        }        
111

    
112
        public String getName() {
113
                return this.sourceID.toString();
114
        }
115

    
116
        public String getFullName() {
117
                return "memory:"+this.sourceID.toString();
118
        }
119

    
120

    
121
        private void initialize() {
122
                FeatureType featureType = getStoreServices().createFeatureType().getNotEditableCopy();                
123
                List types = new ArrayList(1);
124
                types.add(featureType);
125
                getStoreServices().setFeatureTypes(types, featureType);
126
        }
127

    
128
        /*
129
         *         (non-Javadoc)
130
         * @see org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider#createNewOID()
131
         */
132
        public Object createNewOID() {
133
                return new Long(counterNewsOIDs++);
134
        }
135

    
136
        /*
137
         * (non-Javadoc)
138
         * @see org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider#getName()
139
         */
140
        public String getProviderName() {
141
                return NAME;
142
        }
143

    
144
        /*
145
         * (non-Javadoc)
146
         * @see org.gvsig.fmap.dal.feature.spi.FeatureStoreProvider#getOIDType()
147
         */
148
        public int getOIDType() {
149
                return DataTypes.LONG;
150
        }
151

    
152
        /*
153
         * (non-Javadoc)
154
         * @see org.gvsig.fmap.dal.spi.DataStoreProvider#getSourceId()
155
         */
156
        public Object getSourceId() {
157
                return sourceID;
158
        }
159

    
160
        public void open() throws OpenException {
161
        }
162

    
163
        public static void registerMetadataDefinition() throws MetadataException {
164
                MetadataManager manager = MetadataLocator.getMetadataManager();
165
                if( manager.getDefinition(METADATA_DEFINITION_NAME)==null ) {
166
                        DynStruct metadataDefinition = manager.addDefinition(METADATA_DEFINITION_NAME, "Memory Store");
167
                        metadataDefinition.extend(manager
168
                                        .getDefinition(DataStore.SPATIAL_METADATA_DEFINITION_NAME));
169
                }
170
        }
171

    
172
        public boolean allowWrite() {
173
                return true;
174
        }
175

    
176
        public void performChanges(Iterator deleteds, Iterator inserteds,
177
                        Iterator updateds, Iterator originalFeatureTypesUpdated)
178
        throws PerformEditingException {
179
                FeatureSet set = null;
180
                DisposableIterator iter = null;
181
                try {                
182
                        FeatureType featureType = this.getStoreServices().getDefaultFeatureType();
183
                        List types = new ArrayList(1);
184
                        types.add(featureType);                        
185
                        getStoreServices().setFeatureTypes(types, featureType);        
186
                        
187
                        //Sets the envelope                        
188
                        envelope = 
189
                                geomManager.createEnvelope(featureType.getDefaultGeometryAttribute().getGeometrySubType());
190
                                        
191
                        set = this.getFeatureStore().getFeatureSet();
192
                        iter = set.fastIterator();
193

    
194
                        ArrayList newData = new ArrayList();
195
                        Hashtable newOids = new Hashtable();
196
                        
197
                        while (iter.hasNext()) {
198
                                Feature feature=(Feature) iter.next();
199
                                FeatureProvider featureProvider = this.getStoreServices().getFeatureProviderFromFeature(feature);
200
                                newData.add(featureProvider);
201
                                newOids.put(featureProvider.getOID(), featureProvider);
202
                                envelope.add(feature.getDefaultEnvelope());
203
                        }
204
                        data = newData;
205
                        oids = newOids;
206
                        
207
                } catch (DataException e) {
208
                        logger.error("Error adding features", e);
209
                } catch (CreateEnvelopeException e) {
210
                        logger.error("Error creating the envelope", e);
211
                } finally {
212
                        dispose(iter);
213
                        dispose(set);
214
                }
215
        }
216

    
217
        public Envelope getEnvelope() throws DataException {
218
                return envelope;
219
        }
220
        
221
        protected FeatureProvider internalGetFeatureProviderByReference(
222
                        FeatureReferenceProviderServices reference) throws DataException {
223
                return (FeatureProvider) oids.get(reference.getOID());
224
        }
225

    
226
        public ResourceProvider getResource() {
227
                return memoryResource;
228
        }
229
}