Statistics
| Revision:

gvsig-projects-pool / org.gvsig.lidar.prov / org.gvsig.lidar.prov.whitebox / src / main / java / org / gvsig / lidar / prov / whitebox / WhiteboxLASFilesystemServerProvider.java @ 281

History | View | Annotate | Download (13.5 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright ? 2007-2016 gvSIG Association
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
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.lidar.prov.whitebox;
25

    
26
import java.io.File;
27

    
28
import org.gvsig.fmap.dal.DALLocator;
29
import org.gvsig.fmap.dal.DataServerExplorer;
30
import org.gvsig.fmap.dal.DataStoreParameters;
31
import org.gvsig.fmap.dal.NewDataStoreParameters;
32
import org.gvsig.fmap.dal.exception.CreateException;
33
import org.gvsig.fmap.dal.exception.DataException;
34
import org.gvsig.fmap.dal.exception.InitializeException;
35
import org.gvsig.fmap.dal.exception.RemoveException;
36
import org.gvsig.fmap.dal.feature.EditableFeatureType;
37
import org.gvsig.fmap.dal.resource.ResourceAction;
38
import org.gvsig.fmap.dal.resource.file.FileResource;
39
import org.gvsig.fmap.dal.resource.spi.ResourceConsumer;
40
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
41
import org.gvsig.fmap.dal.serverexplorer.filesystem.impl.AbstractFilesystemServerExplorerProvider;
42
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider;
43
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProviderServices;
44
import org.gvsig.lidar.prov.LASDataStoreParameters;
45
import org.slf4j.Logger;
46
import org.slf4j.LoggerFactory;
47

    
48
/**
49
 * 
50
 * @author <a href="mailto:cmartinez@scolab.es">Cesar Martinez Izquierdo</a>
51
 *
52
 */
53
public class WhiteboxLASFilesystemServerProvider extends AbstractFilesystemServerExplorerProvider implements
54
    FilesystemServerExplorerProvider, ResourceConsumer {
55

    
56
    private static final Logger LOG = LoggerFactory.getLogger(WhiteboxLASFilesystemServerProvider.class);
57

    
58
    private FilesystemServerExplorerProviderServices serverExplorer;
59

    
60
    @Override
61
    public String getDataStoreProviderName() {
62
        return WhiteboxLASDataStoreProvider.NAME;
63
    }
64

    
65
    @Override
66
    public String getDescription() {
67
        return WhiteboxLASDataStoreProvider.DESCRIPTION;
68
    }
69

    
70
    @Override
71
    public boolean accept(File pathname) {
72
            return (pathname.getName().toLowerCase().endsWith(".las"));
73
    }
74

    
75
    @Override
76
    public boolean closeResourceRequested(ResourceProvider resource) {
77
        // Do nothing
78
        return true;
79
    }
80

    
81
    @Override
82
    public void resourceChanged(ResourceProvider resource) {
83
        // Do nothing
84
    }
85

    
86
    @Override
87
    public void initialize(FilesystemServerExplorerProviderServices serverExplorer) {
88
        this.serverExplorer = serverExplorer;
89
    }
90

    
91
    @Override
92
    public boolean canCreate() {
93
            return false;
94
    }
95

    
96
    @Override
97
    public void create(NewDataStoreParameters parameters, boolean overwrite) throws CreateException {
98
        throw new UnsupportedOperationException();
99
        /*
100
        if (parameters instanceof LASNewDataStoreParameters) {
101

102
            final LASNewDataStoreParameters newLASDataStoreParameters =
103
                (LASNewDataStoreParameters) parameters;
104

105
            final File file = newLASDataStoreParameters.getFile();
106

107
            if (file.isFile() && file.exists()) {
108
                if (overwrite) {
109
                    // Deleting existing file
110
                    try {
111
                        this.remove(newLASDataStoreParameters);
112
                    } catch (RemoveException e) {
113
                        throw new CreateException("Can not overwrite file", e);
114
                    }
115
                } else {
116
                    throw new CreateException(file.getAbsolutePath(), new IllegalArgumentException(
117
                        String.format("%1s exists and overwrite option is false",
118
                            file.getAbsolutePath())));
119
                }
120
            }
121

122
            try {
123
                final FileResource resource =
124
                    (FileResource) serverExplorer.getServerExplorerProviderServices()
125
                        .createResource(FileResource.NAME, new Object[] { file.getAbsolutePath() });
126

127
                resource.addConsumer(this);
128
                resource.execute(new ResourceAction() {
129

130
                    @Override
131
                    public Object run() throws Exception {
132

133
                        String driverName = newLASDataStoreParameters.getDriverName();
134
                        Driver driver = ogr.GetDriverByName(driverName);
135
                        if (driver == null || StringUtils.isBlank(driverName)) {
136
                            throw new IllegalArgumentException(
137
                                "Driver name can not be blank and driver must exist.");
138
                        }
139

140
                        List options = newLASDataStoreParameters.getDatasetCreationOptions();
141
                        DataSource dataSource = null;
142
                        if (options == null) {
143
                            dataSource =
144
                                driver.CreateDataSource(resource.getFile().getAbsolutePath());
145
                        } else {
146
                            dataSource =
147
                                driver.CreateDataSource(resource.getFile().getAbsolutePath(),
148
                                    new Vector<String>(options));
149
                        }
150

151
                        if (dataSource == null) {
152
                            LOG.error("Can not open datasource from {} and {} options", resource
153
                                .getFile().getAbsoluteFile(), options);
154
                            throw new ResourceExecuteException(resource, null);
155
                        }
156

157
                        String layerName = newLASDataStoreParameters.getLayerName();
158
                        if (StringUtils.isBlank(layerName)) {
159
                            layerName = file.getName();
160
                        }
161

162
                        // Check if layer already exist at dataSource
163
                        Layer existingLayer = dataSource.GetLayerByName(layerName);
164
                        if (existingLayer != null) {
165
                            for (int i = 0; i < dataSource.GetLayerCount(); i++) {
166
                                if (dataSource.GetLayerByIndex(i).GetName()
167
                                    .equals(existingLayer.GetName())) {
168
                                    dataSource.DeleteLayer(i); // Delete it if
169
                                                               // exist
170
                                    break;
171
                                }
172
                            }
173
                        }
174

175
                        LASConverter converter = new LASConverter();
176

177
                        FeatureAttributeDescriptor geometryAttribute =
178
                            newLASDataStoreParameters.getDefaultFeatureType()
179
                                .getDefaultGeometryAttribute();
180
                        Integer ogrType = null;
181
                        SpatialReference srs = null;
182

183
                        // Determinate if featureType has SRS and geometry type
184
                        // defined
185
                        if (geometryAttribute != null) {
186
                            int type = geometryAttribute.getGeomType().getType();
187
                            ogrType = converter.convertToOGRGeomType(type);
188

189
                            IProjection projection = geometryAttribute.getSRS();
190
                            if (projection == null && newLASDataStoreParameters.getCRS() != null) {
191
                                projection = newLASDataStoreParameters.getCRS();
192
                                srs =
193
                                    new SpatialReference(projection.export(ICRSFactory.FORMAT_WKT));
194
                            }
195
                        }
196

197
                        Layer layer = null;
198
                        if (srs == null) {
199
                            layer = dataSource.CreateLayer(layerName);
200
                        } else if (ogrType == null) {
201
                            layer = dataSource.CreateLayer(layerName, srs);
202
                        } else {
203
                            layer = dataSource.CreateLayer(layerName, srs, ogrType);
204
                        }
205

206
                        // Creating fields
207
                        if (layer.TestCapability(ogrConstants.OLCCreateField)) {
208
                            List<FieldDefn> fields =
209
                                converter.convertFields(newLASDataStoreParameters
210
                                    .getDefaultFeatureType());
211
                            for (FieldDefn fieldDefn : fields) {
212
                                layer.CreateField(fieldDefn);
213
                            }
214
                        } else {
215
                            LOG.warn("{} driver does not support creation of fields",
216
                                driver.getName());
217
                        }
218

219
                        // Creating additional geometry fields, skipping default
220
                        // geometry column.
221
                        // When a OGR Layer is created, if feature type has
222
                        // default geometry column
223
                        // it will be set when layer is created
224
                        if (layer.TestCapability(ogrConstants.OLCCreateGeomField)) {
225
                            List<GeomFieldDefn> geomFields =
226
                                converter.convertGeometryFields(
227
                                    newLASDataStoreParameters.getDefaultFeatureType(), false);
228
                            for (GeomFieldDefn geomFieldDefn : geomFields) {
229
                                layer.CreateGeomField(geomFieldDefn);
230
                            }
231
                        } else {
232
                            LOG.warn(
233
                                "{} driver does not support creation of geometry fields, only default"
234
                                    + " OGR geometry field has been created", driver.getName());
235
                        }
236

237
                        // Release native resource to close file
238
                        dataSource.delete();
239
                        return null;
240
                    }
241
                });
242
            } catch (InitializeException e) {
243
                throw new CreateException("Can not create file resource to create it", e);
244
            }
245
        }
246
        */
247

    
248
    }
249

    
250
    @Override
251
    public NewDataStoreParameters getCreateParameters() throws DataException {
252
            LASDataStoreParameters newParameters = new LASDataStoreParameters(WhiteboxLASDataStoreProvider.NAME);
253
        EditableFeatureType editableFeatureType = DALLocator.getDataManager().createFeatureType();
254
        newParameters.setDefaultFeatureType(editableFeatureType);
255
        return newParameters;
256
    }
257

    
258
    @Override
259
    public void remove(DataStoreParameters parameters) throws RemoveException {
260

    
261
        if (parameters instanceof LASDataStoreParameters) {
262

    
263
                LASDataStoreParameters newLASDataStoreParameters =
264
                (LASDataStoreParameters) parameters;
265

    
266
            final File file = newLASDataStoreParameters.getFile();
267

    
268
            if (!file.exists() && !file.canWrite()) {
269
                throw new RemoveException(file.getAbsolutePath(), new IllegalArgumentException(
270
                    String.format("%1s does not exist", file.getAbsolutePath())));
271
            }
272

    
273
            try {
274
                final FileResource resource =
275
                    (FileResource) serverExplorer.getServerExplorerProviderServices()
276
                        .createResource(FileResource.NAME, new Object[] { file.getAbsolutePath() });
277

    
278
                resource.addConsumer(this);
279
                resource.execute(new ResourceAction() {
280

    
281
                    @Override
282
                    public Object run() throws Exception {
283
                        resource.closeRequest();
284
                        file.delete();
285
                        return null;
286
                    }
287
                });
288
                resource.addConsumer(this);
289
            } catch (InitializeException e) {
290
                throw new RemoveException("Can not create file resource to remove it", e);
291
            }
292
        }
293
    }
294

    
295
    @Override
296
    public boolean canCreate(NewDataStoreParameters parameters) {
297
            /*
298
        if (parameters instanceof LASNewDataStoreParameters) {
299

300
            LASNewDataStoreParameters newOGRDataStoreParameters =
301
                (LASNewDataStoreParameters) parameters;
302

303
            String driverName = newOGRDataStoreParameters.getDriverName();
304
            Driver driver = null;
305
            if (StringUtils.isNotBlank(driverName)) {
306
                driver = ogr.GetDriverByName(driverName);
307
            } else {
308
                return false;
309
            }
310

311
            if (driver.TestCapability(ogrConstants.ODrCCreateDataSource)
312
                && driver.TestCapability(ogrConstants.OLCCreateField)) {
313

314
                File file = newOGRDataStoreParameters.getFile();
315
                if (file != null && file.canWrite()) {
316
                    return true;
317
                }
318
            }
319
        }*/
320
        return false;
321
    }
322
    
323
    @Override
324
        public int getMode() {
325
                return DataServerExplorer.MODE_GEOMETRY|DataServerExplorer.MODE_FEATURE;
326
        }
327
}