Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libFMap_dalfile / src / org / gvsig / fmap / dal / serverexplorer / filesystem / impl / DefaultFilesystemServerExplorer.java @ 27723

History | View | Annotate | Download (12 KB)

1
package org.gvsig.fmap.dal.serverexplorer.filesystem.impl;
2

    
3
import java.io.File;
4
import java.util.ArrayList;
5
import java.util.Iterator;
6
import java.util.List;
7

    
8
import org.gvsig.fmap.dal.DALFileLocator;
9
import org.gvsig.fmap.dal.DALLocator;
10
import org.gvsig.fmap.dal.DataServerExplorerParameters;
11
import org.gvsig.fmap.dal.DataStore;
12
import org.gvsig.fmap.dal.DataStoreParameters;
13
import org.gvsig.fmap.dal.NewDataStoreParameters;
14
import org.gvsig.fmap.dal.exception.DataException;
15
import org.gvsig.fmap.dal.exception.FileNotFoundException;
16
import org.gvsig.fmap.dal.exception.InitializeException;
17
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
18
import org.gvsig.fmap.dal.exception.RemoveException;
19
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
20
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemFileFilter;
21
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
22
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
23
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
24
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider;
25
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProviderServices;
26
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
27
import org.gvsig.fmap.dal.spi.DataServerExplorerProviderServices;
28
import org.gvsig.tools.extensionpoint.ExtensionPoint.Extension;
29

    
30

    
31
public class DefaultFilesystemServerExplorer implements
32
                FilesystemServerExplorerProviderServices, FilesystemFileFilter {
33
        // FIXME: , IPersistence{
34

    
35

    
36
        FilesystemServerExplorerParameters parameters;
37
        private File root;
38

    
39
        private File current;
40

    
41
        private DataServerExplorerProviderServices providerServices;
42

    
43
        private List serverProviders;
44

    
45

    
46
        public DefaultFilesystemServerExplorer(FilesystemServerExplorerParameters parameters)
47
                        throws InitializeException {
48
                this.parameters = parameters;
49
                if (this.parameters.getRoot() != null) {
50
                        this.root = new File(this.parameters.getRoot());
51
                }
52
                if (this.parameters.getInitialpath() != null) {
53
                        this.current = new File(this.parameters.getInitialpath());
54
                }
55
                if (this.root == null && this.current == null){
56
                        //                        throw new InitializeException(this.getName(),
57
                        //                                        new IllegalArgumentException());
58
                } else if (this.current == null) {
59
                        this.current = new File(this.parameters.getRoot());
60
                }
61
        }
62

    
63
        /* (non-Javadoc)
64
         * @see org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer#getParameters()
65
         */
66
        public DataServerExplorerParameters getParameters() {
67
                return parameters;
68
        }
69

    
70
        /* (non-Javadoc)
71
         * @see org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer#dispose()
72
         */
73
        public void dispose() throws DataException {
74
                this.parameters = null;
75
                this.root = null;
76
        }
77

    
78
        public List list(int mode) throws DataException {
79
                //TODO
80
                return list();
81
        }
82

    
83

    
84
        /* (non-Javadoc)
85
         * @see org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer#list()
86
         */
87
        public List list() throws DataException {
88
                if (this.current == null){
89
                        throw new IllegalStateException(); //FIXME
90
                }
91
                if (!this.current.exists()) {
92
                        //TODO crear excepcion de Data??
93
                        new org.gvsig.fmap.dal.exception.FileNotFoundException(this.current);
94
                }
95

    
96
                if (!this.current.isDirectory()) {
97
                        new IllegalArgumentException(this.getName()
98
                                        + ": Path not a directory '"
99
                                        + this.current + "'");
100
                }
101
                // DataManager dsm=DataManager.getManager();
102

    
103
                String files[] = this.current.list();
104
                int i;
105
                File theFile;
106
                ArrayList list = new ArrayList();
107
                DataStoreParameters dsp = null;
108

    
109
                for (i = 0; i < files.length; i++) {
110
                        theFile = new File(this.root, files[i]);
111
                        dsp = this.getParametersFor(theFile);
112
                        if (dsp != null) {
113
                                list.add(dsp);
114
                        }
115
                }
116
                return list;
117
        }
118

    
119
        /* (non-Javadoc)
120
         * @see org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer#setCurrentPath(java.io.File)
121
         */
122
        public void setCurrentPath(File path) throws FileNotFoundException {
123
                // FIXME Comprobar si es un directorio existente
124
                if (!path.exists()) {
125
                        throw new FileNotFoundException(path);
126
                }
127
                if (!path.isDirectory()) {
128
                        throw new IllegalArgumentException(path.getPath()
129
                                        + " is not a directory");
130
                }
131
                if (!isFromRoot(path)) {
132
                        throw new IllegalArgumentException(path.getPath()
133
                                        + " is not from root");
134

    
135
                }
136

    
137
                this.current = path;
138
        }
139

    
140
        /* (non-Javadoc)
141
         * @see org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer#getCurrentPath()
142
         */
143
        public File getCurrentPath() {
144
                return this.current;
145
        }
146

    
147
        /* (non-Javadoc)
148
         * @see org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer#getRoot()
149
         */
150
        public File getRoot() {
151
                return this.root;
152
        }
153

    
154
        /* (non-Javadoc)
155
         * @see org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer#remove(org.gvsig.fmap.dal.DataStoreParameters)
156
         */
157
        public void remove(DataStoreParameters dsp) throws RemoveException {
158
                String providerName = dsp.getDataStoreName();
159
                try {
160
                        this.checkIsMine(dsp);
161
                        FilesystemServerExplorerProvider provider = this.getProvider(providerName);
162

    
163
                        provider.remove(dsp);
164
                } catch (DataException e) {
165
                        throw new RemoveException(this.getName(), e);
166
                }
167
        }
168

    
169
        /* (non-Javadoc)
170
         * @see org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer#add(org.gvsig.fmap.dal.NewDataStoreParameters, boolean)
171
         */
172
        public boolean add(NewDataStoreParameters ndsp, boolean overwrite)
173
                        throws DataException {
174
                String providerName = ndsp.getDataStoreName();
175

    
176
                try {
177
                        this.checkIsMine(ndsp);
178
                        FilesystemServerExplorerProvider provider = this.getProvider(providerName);
179

    
180
                        provider.create(ndsp, overwrite);
181
                        return true; // TODO deber?a devolver un booleano el provider o esto ser un void
182
                } catch (DataException e) {
183
                        throw new RemoveException(this.getName(), e);
184
                }
185
        }
186

    
187
        /* (non-Javadoc)
188
         * @see org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer#canAdd()
189
         */
190
        public boolean canAdd() {
191
                return this.root.canWrite();
192
        }
193

    
194
        /* (non-Javadoc)
195
         * @see org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer#getName()
196
         */
197
        public String getName() {
198
                return FilesystemServerExplorer.NAME;
199
        }
200

    
201
        /* (non-Javadoc)
202
         * @see org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer#getAddParameters(java.lang.String)
203
         */
204
        public NewDataStoreParameters getAddParameters(String storeName)
205
                        throws DataException {
206
                FilesystemServerExplorerProvider provider = this.getProvider(storeName);
207
                if (provider == null) {
208
                        throw new IllegalArgumentException(
209
                                        "Not registered in this explorer"); // FIXME
210
                }
211

    
212
                NewDataStoreParameters nParams = provider.getCreateParameters();
213
                //                nParams.setAttribute("path", this.getCurrentPath().getPath());
214
                return nParams;
215
        }
216

    
217
        /* (non-Javadoc)
218
         * @see org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer#canAdd(java.lang.String)
219
         */
220
        public boolean canAdd(String storeName)
221
                        throws DataException {
222
                if (storeName == null) {
223
                        return false;//CanAdd with genericFilter
224
                }
225
                FilesystemServerExplorerProvider provider = this.getProvider(storeName);
226
                if (provider == null) {
227
                        throw new IllegalArgumentException(
228
                                        "Not registered in this explorer"); // FIXME
229
                }
230

    
231
                return provider.canCreate();
232

    
233
        }
234

    
235
        // ==========================================
236

    
237
        private FilesystemServerExplorerProvider getProvider(String storeName)
238
                        throws InitializeException, ProviderNotRegisteredException {
239
                Iterator providers = getProviders().iterator();
240
                FilesystemServerExplorerProvider provider;
241
                while (providers.hasNext()) {
242
                        provider = (FilesystemServerExplorerProvider) providers.next();
243
                        if (provider.getDataStoreProviderName().equals(storeName)) {
244
                                return provider;
245
                        }
246
                }
247
                return null;
248
        }
249

    
250
        private DataManagerProviderServices getManager() {
251
                return (DataManagerProviderServices) DALLocator.getDataManager();
252
        }
253

    
254
        /* (non-Javadoc)
255
         * @see org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer#getParametersFor(java.io.File)
256
         */
257
        public DataStoreParameters getParametersFor(File file)
258
                        throws DataException {
259

    
260
                return this.getParametersFor(file, true);
261
        }
262

    
263
        public DataStoreParameters getParametersFor(File file, boolean checksExist)
264
                        throws DataException {
265

    
266
                if (checksExist) {
267
                        if (!file.exists()) {
268
                                return null;
269
                        }
270
                        if (!file.isFile()) {
271
                                return null;
272
                        }
273
                        if (!file.canRead()) {
274
                                return null;
275
                        }
276
                        if (file.isHidden()) { // XXX ???
277
                                return null;
278
                        }
279
                }
280
                Iterator filters = getFilters();
281
                while (filters.hasNext()) {
282
                        FilesystemFileFilter filter = (FilesystemFileFilter) filters.next();
283
                        if (filter.accept(file)) {
284
                                DataStoreParameters params = this.getManager()
285
                                                .createStoreParameters(
286
                                                                filter.getDataStoreProviderName());
287
                                ((FilesystemStoreParameters) params).setFile(file);
288
                                return params;
289
                        }
290
                }
291
                return null;
292
        }
293

    
294
        private void checkIsMine(DataStoreParameters dsp)
295
                        throws IllegalArgumentException, DataException {
296
                if (!(dsp instanceof FilesystemStoreParameters)) {
297
                        new IllegalArgumentException(
298
                                        "not instance of FilesystemStoreParameters");
299
                }
300
                Iterator filters = getFilters();
301
                File file = ((FilesystemStoreParameters) dsp).getFile();
302
                if (!this.isFromRoot(file)) {
303
                        throw new IllegalArgumentException("worng explorer");
304
                }
305
                FilesystemFileFilter filter;
306
                while (filters.hasNext()) {
307
                        filter = (FilesystemFileFilter) filters.next();
308
                        if (dsp.getDataStoreName().equals(filter.getDataStoreProviderName())) {
309
                                return;
310
                        }
311
                }
312
                throw new IllegalArgumentException("worng explorer");
313
        }
314

    
315
        private boolean isFromRoot(File file) {
316
                if (this.root == null) {
317
                        return true;
318
                }
319
                return file.getAbsolutePath().startsWith(this.root.getAbsolutePath());
320
        }
321

    
322
        /* (non-Javadoc)
323
         * @see org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer#initialize(org.gvsig.fmap.dal.spi.DataServerExplorerProviderServices)
324
         */
325
        public void initialize(
326
                        DataServerExplorerProviderServices dataServerExplorerProviderServices) {
327
                this.providerServices = dataServerExplorerProviderServices;
328

    
329
        }
330

    
331
        public List getProviders() {
332
                if (this.serverProviders == null) {
333
                        Iterator iter = DALFileLocator
334
                                        .getFilesystemServerExplorerManager()
335
                        .getRegisteredProviders();
336
                        this.serverProviders = new ArrayList();
337
                        Extension ext;
338
                        FilesystemServerExplorerProvider provider;
339
                        while (iter.hasNext()) {
340
                                ext = (Extension) iter.next();
341
                                try {
342
                                        provider = (FilesystemServerExplorerProvider) ext.create();
343
                                } catch (Exception e) {
344
                                        throw new RuntimeException(e);// FIXME !!!
345
                                }
346
                                provider.initialize(this);
347
                                this.serverProviders.add(provider);
348
                        }
349
                }
350
                return this.serverProviders;
351
        }
352

    
353
        public Iterator getFilters() {
354
                return this.getProviders().iterator();
355
        }
356

    
357
        public FilesystemFileFilter getGenericFilter() {
358
                return this;
359
        }
360

    
361
        public String getDataStoreProviderName() {
362
                return null;
363
        }
364

    
365
        public String getDescription() {
366
                return "All supporteds";
367
        }
368

    
369
        public boolean accept(File pathname) {
370
                try {
371
                        return this.getParametersFor(pathname) != null;
372
                } catch (DataException e) {
373
                        throw new RuntimeException(e); // FIXME excpetion??
374
                }
375
        }
376

    
377
        public DataServerExplorerProviderServices getServerExplorerProviderServices() {
378
                return this.providerServices;
379
        }
380

    
381
        public DataStore open(File file) throws DataException,
382
                        ValidateDataParametersException {
383
                DataStoreParameters params = this.getParametersFor(file);
384
                if (params == null){
385
                        return null;
386
                }
387
                return DALLocator.getDataManager().createStore(params);
388
        }
389

    
390
        public NewDataStoreParameters getAddParameters(File file)
391
                        throws DataException {
392
                DataStoreParameters params = this.getParametersFor(file, false);
393
                NewDataStoreParameters newParams = this.getAddParameters(params.getDataStoreName());
394
                ((FilesystemStoreParameters) newParams).setFile(((FilesystemStoreParameters)params).getFile());
395
                return newParams;
396
        }
397

    
398

    
399
}