Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.file / org.gvsig.fmap.dal.file.csv / src / main / java / org / gvsig / fmap / dal / store / csv / CSVFilesystemServerProvider.java @ 44309

History | View | Annotate | Download (9.25 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 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 3
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.fmap.dal.store.csv;
25

    
26
import java.io.File;
27
import java.io.IOException;
28
import org.gvsig.fmap.dal.DALLocator;
29
import org.gvsig.fmap.dal.DataManager;
30

    
31
import org.gvsig.fmap.dal.DataServerExplorer;
32
import org.gvsig.fmap.dal.DataStoreParameters;
33
import org.gvsig.fmap.dal.NewDataStoreParameters;
34
import org.gvsig.fmap.dal.exception.CreateException;
35
import org.gvsig.fmap.dal.exception.DataException;
36
import org.gvsig.fmap.dal.exception.FileNotFoundException;
37
import org.gvsig.fmap.dal.exception.InitializeException;
38
import org.gvsig.fmap.dal.exception.RemoveException;
39
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
40
import org.gvsig.fmap.dal.feature.EditableFeatureType;
41
import org.gvsig.fmap.dal.feature.FeatureType;
42
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
43
import org.gvsig.fmap.dal.resource.ResourceAction;
44
import org.gvsig.fmap.dal.resource.exception.ResourceExecuteException;
45
import org.gvsig.fmap.dal.resource.file.FileResource;
46
import org.gvsig.fmap.dal.resource.spi.ResourceConsumer;
47
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
48
import org.gvsig.fmap.dal.serverexplorer.filesystem.AbsolutePathRequiredException;
49
import org.gvsig.fmap.dal.serverexplorer.filesystem.impl.AbstractFilesystemServerExplorerProvider;
50
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider;
51
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProviderServices;
52
import org.gvsig.tools.dataTypes.DataTypes;
53
import org.supercsv.prefs.CsvPreference;
54

    
55
public class CSVFilesystemServerProvider extends AbstractFilesystemServerExplorerProvider
56
        implements FilesystemServerExplorerProvider, ResourceConsumer {
57

    
58
    protected FilesystemServerExplorerProviderServices serverExplorer;
59

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

    
65
    @Override
66
    public int getMode() {
67
        return DataServerExplorer.MODE_FEATURE | DataServerExplorer.MODE_GEOMETRY;
68
    }
69

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

    
75
    @Override
76
    public String getDescription() {
77
        return CSVStoreProvider.DESCRIPTION;
78
    }
79

    
80
    @Override
81
    public DataStoreParameters getParameters(File file) throws DataException {
82
        DataManager manager = DALLocator.getDataManager();
83
        CSVStoreParameters params = (CSVStoreParameters) manager
84
                .createStoreParameters(this.getDataStoreProviderName());
85
        params.setFile(file);
86
        return params;
87
    }
88

    
89
    @Override
90
    public boolean canCreate() {
91
        return true;
92
    }
93

    
94
    @Override
95
    public boolean canCreate(NewDataStoreParameters parameters) {
96
        CSVNewStoreParameters params = (CSVNewStoreParameters) parameters;
97
        if (params.getFile().getParentFile().canWrite()) {
98
            return false;
99
        }
100
        if (params.getFile().exists()) {
101
            if (!params.getFile().canWrite()) {
102
                return false;
103
            }
104
        }
105
        if (params.getDefaultFeatureType() == null) {
106
            return false;
107
        }
108
        return true;
109
    }
110

    
111
    public void create(NewDataStoreParameters parameters, boolean overwrite)
112
            throws CreateException {
113

    
114
        final CSVNewStoreParameters params = (CSVNewStoreParameters) parameters;
115
        final File file = params.getFile();
116

    
117
        if (!file.isAbsolute()) {
118
            throw new AbsolutePathRequiredException(file.getPath());
119
        }
120

    
121
        if (file.exists()) {
122
            if (overwrite) {
123
//                                if (!file.delete()) {
124
//                                        throw new CreateException(this.getDataStoreProviderName(),
125
//                                                        new IOException(
126
//                                                        "cannot delete file"));
127
//                                }
128
            } else {
129
                throw new CreateException(this.getDataStoreProviderName(),
130
                        new IOException(
131
                                "file already exist"));
132
            }
133
        }
134

    
135
        final FileResource resource;
136
        try {
137

    
138
            resource = (FileResource) this.serverExplorer
139
                    .getServerExplorerProviderServices().createResource(
140
                            FileResource.NAME,
141
                            new Object[]{file.getAbsolutePath()});
142
        } catch (InitializeException e1) {
143
            throw new CreateException(params.getFile().getAbsolutePath(), e1);
144
        }
145
        resource.addConsumer(this);
146

    
147
        try {
148
            resource.execute(new ResourceAction() {
149
                @Override
150
                public Object run() throws Exception {
151
                    CSVFeatureWriter writer = new CSVFeatureWriter();
152
                    //TODO correct values to the writer from params
153
                    writer.initialize(params, file.getAbsoluteFile(), params.getDefaultFeatureType(), null);
154
                    writer.begin();
155

    
156
//                    writer.begin(
157
//                            params,
158
//                            fixFeatureType(params.getDefaultFeatureType()),
159
//                            0
160
//                    );
161
                    writer.end();
162
                    //writer.dispose();
163
                    resource.notifyChanges();
164
                    return null;
165
                }
166
            });
167
        } catch (ResourceExecuteException e) {
168
            throw new CreateException(this.getDataStoreProviderName(), e);
169
        } finally {
170
            resource.removeConsumer(this);
171
        }
172

    
173
    }
174

    
175
    protected NewDataStoreParameters createInstanceNewDataStoreParameters() {
176
        return new CSVNewStoreParameters();
177
    }
178

    
179
    @Override
180
    public NewDataStoreParameters getCreateParameters() {
181
        NewFeatureStoreParameters params = (NewFeatureStoreParameters) this
182
                .createInstanceNewDataStoreParameters();
183
        params.setDefaultFeatureType(this.serverExplorer
184
                .getServerExplorerProviderServices().createNewFeatureType());
185
        return params;
186
    }
187

    
188
    @Override
189
    public void initialize(FilesystemServerExplorerProviderServices serverExplorer) {
190
        this.serverExplorer = serverExplorer;
191

    
192
    }
193

    
194
    @Override
195
    public void remove(DataStoreParameters parameters) throws RemoveException {
196
        CSVStoreParameters params = (CSVStoreParameters) parameters;
197
        File file = params.getFile();
198
        if (!file.exists()) {
199
            throw new RemoveException(this.getDataStoreProviderName(),
200
                    new FileNotFoundException(params.getFile()));
201
        }
202
        if (!file.delete()) {
203
            throw new RemoveException(this.getDataStoreProviderName(),
204
                    new IOException()); // FIXME Exception
205
        }
206
    }
207

    
208
    @Override
209
    public boolean closeResourceRequested(ResourceProvider resource) {
210
        // while it is using a resource anyone can't close it
211
        return !(this.equals(resource));
212
    }
213

    
214
    /*
215
         * (non-Javadoc)
216
         *
217
         * @see
218
         * org.gvsig.fmap.dal.resource.spi.ResourceConsumer#resourceChanged(org.
219
         * gvsig.fmap.dal.resource.spi.ResourceProvider)
220
     */
221
    @Override
222
    public void resourceChanged(ResourceProvider resource) {
223
        // Do nothing
224
    }
225

    
226
    protected EditableFeatureType fixFeatureType(FeatureType featureType) {
227
        EditableFeatureType newFeatureType;
228

    
229
        if (featureType instanceof EditableFeatureType) {
230
            newFeatureType = (EditableFeatureType) featureType.getCopy();
231
        } else {
232
            newFeatureType = featureType.getEditable();
233
        }
234

    
235
        for (int i = 0; i < newFeatureType.size(); i++) {
236
            EditableFeatureAttributeDescriptor attr = (EditableFeatureAttributeDescriptor) newFeatureType.getAttributeDescriptor(i);
237
            String s;
238
            switch (attr.getType()) {
239
                case DataTypes.INT:
240
                    s = String.valueOf(Integer.MAX_VALUE);
241
                    attr.setSize(18);
242
                    attr.setPrecision(0);
243
                    break;
244
                case DataTypes.LONG:
245
                    s = String.valueOf(Long.MAX_VALUE);
246
                    attr.setSize(18);
247
                    attr.setPrecision(0);
248
                    break;
249
                case DataTypes.FLOAT:
250
                    attr.setSize(18);
251
                    attr.setPrecision(6);
252
                    break;
253
                case DataTypes.DOUBLE:
254
                    attr.setSize(18);
255
                    attr.setPrecision(6);
256
                    break;
257
            }
258
        }
259
        return newFeatureType;
260
    }
261
}