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.lib / src / main / java / org / gvsig / fmap / dal / serverexplorer / filesystem / impl / DefaultFilesystemServerExplorer.java @ 43757

History | View | Annotate | Download (18.6 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 modify it under
7
 * the terms of the GNU General Public License as published by the Free Software
8
 * Foundation; either version 3 of the License, or (at your option) any later
9
 * version.
10
 *
11
 * This program is distributed in the hope that it will be useful, but WITHOUT
12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14
 * details.
15
 *
16
 * You should have received a copy of the GNU General Public License along with
17
 * this program; if not, write to the Free Software Foundation, Inc., 51
18
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us at info AT
21
 * gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.fmap.dal.serverexplorer.filesystem.impl;
24

    
25
import java.io.File;
26
import java.util.ArrayList;
27
import java.util.HashSet;
28
import java.util.Iterator;
29
import java.util.List;
30
import java.util.Set;
31
import org.apache.commons.io.FilenameUtils;
32

    
33
import org.gvsig.fmap.dal.DALFileLocator;
34
import org.gvsig.fmap.dal.DALLocator;
35
import org.gvsig.fmap.dal.DataManager;
36
import org.gvsig.fmap.dal.DataServerExplorerParameters;
37
import org.gvsig.fmap.dal.DataStore;
38
import org.gvsig.fmap.dal.DataStoreParameters;
39
import org.gvsig.fmap.dal.NewDataStoreParameters;
40
import org.gvsig.fmap.dal.exception.DataException;
41
import org.gvsig.fmap.dal.exception.FileNotFoundException;
42
import org.gvsig.fmap.dal.exception.InitializeException;
43
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
44
import org.gvsig.fmap.dal.exception.RemoveException;
45
import org.gvsig.fmap.dal.exception.ServerExplorerAddException;
46
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
47
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemFileFilter;
48
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
49
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
50
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
51
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider;
52
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProviderFactory;
53
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProviderServices;
54
import org.gvsig.fmap.dal.spi.AbstractDataServerExplorer;
55
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
56
import org.gvsig.fmap.dal.spi.DataServerExplorerProviderServices;
57
import org.gvsig.tools.exception.BaseException;
58
import org.gvsig.tools.extensionpoint.ExtensionPoint.Extension;
59

    
60
public class DefaultFilesystemServerExplorer extends AbstractDataServerExplorer
61
        implements FilesystemServerExplorerProviderServices,
62
        FilesystemFileFilter {
63

    
64
    private File root;
65
    private File current; // Current path
66
    private List<FilesystemServerExplorerProvider> serverProviders;
67

    
68
    public DefaultFilesystemServerExplorer(
69
            FilesystemServerExplorerParameters parameters,
70
            DataServerExplorerProviderServices services)
71
            throws InitializeException {
72
        super(parameters, services);
73
        if (this.getFSParameters().getRoot() != null) {
74
            this.root = new File(this.getFSParameters().getRoot());
75
        }
76
        if (this.getFSParameters().getInitialpath() != null) {
77
            this.current = new File(this.getFSParameters().getInitialpath());
78
        }
79
        if (this.root == null && this.current == null) {
80
                        // throw new InitializeException(this.getName(),
81
            // new IllegalArgumentException());
82
        } else if (this.current == null) {
83
            this.current = new File(this.getFSParameters().getRoot());
84
        }
85
    }
86

    
87
    private FilesystemServerExplorerParameters getFSParameters() {
88
        return (FilesystemServerExplorerParameters) this.getParameters();
89
    }
90

    
91
    @Override
92
    protected void doDispose() throws BaseException {
93
        this.root = null;
94
        super.doDispose();
95
    }
96

    
97
    @Override
98
    public List list(int mode) throws DataException {
99
        if (this.current == null) {
100
            throw new IllegalStateException();
101
        }
102
        if (!this.current.exists()) {
103
            throw new org.gvsig.fmap.dal.exception.FileNotFoundException(this.current);
104
        }
105

    
106
        if (!this.current.isDirectory()) {
107
            throw new IllegalArgumentException(this.getProviderName()
108
                    + ": Path not a directory '" + this.current + "'");
109
        }
110

    
111
        List files = new ArrayList(); // return files
112
        List providers = this.getProviders(mode);
113
        String allfiles[] = this.current.list();
114

    
115
        for (int i = 0; i < allfiles.length; i++) {
116
            File file = new File(this.root, allfiles[i]);
117
            Iterator providersit = providers.iterator();
118
            while (providersit.hasNext()) {
119
                FilesystemServerExplorerProvider provider = (FilesystemServerExplorerProvider) providersit
120
                        .next();
121
                if (provider.accept(file)) {
122
                    DataStoreParameters dsp = this.createStoreParameters(file);
123
                    if (dsp != null) {
124
                        files.add(dsp);
125
                    }
126
                    break;
127
                }
128
            }
129
        }
130
        return files;
131
    }
132

    
133
    public List list() throws DataException {
134
        if (this.current == null) {
135
            throw new IllegalStateException(); // FIXME
136
        }
137
        if (!this.current.exists()) {
138
            // TODO crear excepcion de Data??
139
            new org.gvsig.fmap.dal.exception.FileNotFoundException(this.current);
140
        }
141

    
142
        if (!this.current.isDirectory()) {
143
            new IllegalArgumentException(this.getProviderName()
144
                    + ": Path not a directory '" + this.current + "'");
145
        }
146

    
147
        String files[] = this.current.list();
148
        int i;
149
        File theFile;
150
        ArrayList list = new ArrayList();
151
        DataStoreParameters dsp = null;
152

    
153
        for (i = 0; i < files.length; i++) {
154
            theFile = new File(this.root, files[i]);
155
            dsp = this.createStoreParameters(theFile);
156
            if (dsp != null) {
157
                list.add(dsp);
158
            }
159
        }
160
        return list;
161
    }
162

    
163
    public void setCurrentPath(File path) throws FileNotFoundException {
164
        // FIXME Comprobar si es un directorio existente
165
        if (!path.exists()) {
166
            throw new FileNotFoundException(path);
167
        }
168
        if (!path.isDirectory()) {
169
            throw new IllegalArgumentException(path.getPath()
170
                    + " is not a directory");
171
        }
172
        if (!isFromRoot(path)) {
173
            throw new IllegalArgumentException(path.getPath()
174
                    + " is not from root");
175

    
176
        }
177

    
178
        this.current = path;
179
    }
180

    
181
    public File getCurrentPath() {
182
        return this.current;
183
    }
184

    
185
    public File getRoot() {
186
        return this.root;
187
    }
188

    
189
    public void remove(DataStoreParameters dsp) throws RemoveException {
190
        String providerName = dsp.getDataStoreName();
191
        try {
192
            this.checkIsMine(dsp);
193
            FilesystemServerExplorerProvider provider = this
194
                    .getProvider(providerName);
195

    
196
            provider.remove(dsp);
197
        } catch (DataException e) {
198
            throw new RemoveException(this.getProviderName(), e);
199
        }
200
    }
201

    
202
    public boolean add(String providerName, NewDataStoreParameters ndsp,
203
            boolean overwrite) throws DataException {
204

    
205
        try {
206
            this.checkIsMine(ndsp);
207
            FilesystemServerExplorerProvider provider = this
208
                    .getProvider(providerName);
209

    
210
            ndsp.validate();
211
            provider.create(ndsp, overwrite);
212
            return true;
213
        } catch (DataException e) {
214
            throw new ServerExplorerAddException(this.getProviderName(), e);
215
        } catch (ValidateDataParametersException e) {
216
            throw new ServerExplorerAddException(this.getProviderName(), e);
217
        }
218
    }
219

    
220
    public boolean canAdd() {
221
        return this.root.canWrite();
222
    }
223

    
224
    public String getProviderName() {
225
        return FilesystemServerExplorer.NAME;
226
    }
227

    
228
    public NewDataStoreParameters getAddParameters(String storeName)
229
            throws DataException {
230
        FilesystemServerExplorerProvider provider = this.getProvider(storeName);
231
        if (provider == null) {
232
            throw new IllegalArgumentException(
233
                    "Not registered in this explorer"); // FIXME
234
        }
235

    
236
        NewDataStoreParameters nParams = provider.getCreateParameters();
237
        // nParams.setAttribute("path", this.getCurrentPath().getPath());
238
        return nParams;
239
    }
240

    
241
    public boolean canAdd(String storeName) throws DataException {
242
        if (storeName == null) {
243
            return false;// CanAdd with genericFilter
244
        }
245
        FilesystemServerExplorerProvider provider = this.getProvider(storeName);
246
        if (provider == null) {
247
            throw new IllegalArgumentException(
248
                    "Not registered in this explorer"); // FIXME
249
        }
250

    
251
        return provider.canCreate();
252

    
253
    }
254

    
255
        // ==========================================
256
    private FilesystemServerExplorerProvider getProvider(String storeName)
257
            throws InitializeException, ProviderNotRegisteredException {
258
        Iterator providers = getProviders(FilesystemServerExplorer.MODE_ALL).iterator();
259
        FilesystemServerExplorerProvider provider;
260
        while (providers.hasNext()) {
261
            provider = (FilesystemServerExplorerProvider) providers.next();
262
            if (provider.getDataStoreProviderName().equals(storeName)) {
263
                return provider;
264
            }
265
        }
266
        return null;
267
    }
268

    
269
    private DataManagerProviderServices getManager() {
270
        return (DataManagerProviderServices) DALLocator.getDataManager();
271
    }
272

    
273
    public DataStoreParameters createStoreParameters(File file, String providerName) throws DataException {
274

    
275
        return this.getParametersFor(file, providerName, true);
276
    }
277

    
278
    public DataStoreParameters createStoreParameters(File file) throws DataException {
279

    
280
        return this.getParametersFor(file, null, true);
281
    }
282

    
283
    public DataStoreParameters getParametersFor(File file, String providerName, boolean checksExist) throws DataException {
284

    
285
        if (checksExist) {
286
            if (!file.exists()) {
287
                return null;
288
            }
289
            if (!file.isFile()) {
290
                return null;
291
            }
292
            if (!file.canRead()) {
293
                return null;
294
            }
295
            if (file.isHidden()) { // XXX ???
296
                return null;
297
            }
298
        }
299
        if (providerName == null) {
300
            providerName = this.getProviderName(file);
301
        }
302
        if (providerName != null) {
303
            DataStoreParameters params = this.getManager()
304
                    .createStoreParameters(providerName);
305
            ((FilesystemStoreParameters) params).setFile(file);
306
            return params;
307

    
308
        }
309
        return null;
310
    }
311

    
312
    public List<String> getProviderNameList(File file) {
313
        Iterator filters = getFilters();
314
        List list = new ArrayList();
315
        while (filters.hasNext()) {
316
            FilesystemFileFilter filter = (FilesystemFileFilter) filters.next();
317
            if (filter.accept(file)) {
318
                list.add(filter.getDataStoreProviderName());
319
            }
320
        }
321
        return list;
322
    }
323

    
324
    @Override
325
    public String getProviderName(File file) {
326
        Iterator filters = getFilters();
327
        while (filters.hasNext()) {
328
            FilesystemFileFilter filter = (FilesystemFileFilter) filters.next();
329
            if (filter.accept(file)) {
330
                return filter.getDataStoreProviderName();
331
            }
332
        }
333
        return null;
334
    }
335

    
336
    public List getDataStoreProviderNames() {
337
        Set names = new HashSet();
338

    
339
        Iterator filters = getFilters();
340
        while (filters.hasNext()) {
341
            FilesystemFileFilter filter = (FilesystemFileFilter) filters.next();
342
            names.add(filter.getDataStoreProviderName());
343
        }
344
        return new ArrayList(names);
345
    }
346

    
347
    private void checkIsMine(DataStoreParameters dsp)
348
            throws IllegalArgumentException, DataException {
349
        // FIXME Exception ???
350
        if (!(dsp instanceof FilesystemStoreParameters)) {
351
            new IllegalArgumentException(
352
                    "not instance of FilesystemStoreParameters");
353
        }
354
        Iterator filters = getFilters();
355
        File file = ((FilesystemStoreParameters) dsp).getFile();
356
        if (!this.isFromRoot(file)) {
357
            throw new IllegalArgumentException("worng explorer");
358
        }
359
        FilesystemFileFilter filter;
360
        while (filters.hasNext()) {
361
            filter = (FilesystemFileFilter) filters.next();
362
            if (dsp.getDataStoreName()
363
                    .equals(filter.getDataStoreProviderName())) {
364
                return;
365
            }
366
        }
367
        throw new IllegalArgumentException("worng explorer");
368
    }
369

    
370
    private boolean isFromRoot(File file) {
371
        if (this.root == null) {
372
            return true;
373
        }
374
        return file.getAbsolutePath().startsWith(this.root.getAbsolutePath());
375
    }
376

    
377
    public List<FilesystemServerExplorerProvider> getProviders() {
378
        if (this.serverProviders == null) {
379
            Iterator iter = DALFileLocator.getFilesystemServerExplorerManager()
380
                    .getRegisteredProviders();
381
            this.serverProviders = new ArrayList();
382
            Extension ext;
383
            FilesystemServerExplorerProvider provider;
384
            FilesystemServerExplorerProviderFactory factory;
385
            while (iter.hasNext()) {
386
                ext = (Extension) iter.next();
387
                try {
388
                    factory = (FilesystemServerExplorerProviderFactory) ext.create();
389
                } catch (Exception e) {
390
                    throw new RuntimeException(e);// FIXME !!!
391
                }
392
                try {
393
                    provider=factory.createProvider();
394
                } catch (InitializeException e) {
395
                    throw new RuntimeException(e);// FIXME !!!
396
                }
397
                provider.initialize(this);
398
                this.serverProviders.add(provider);
399
            }
400
        }
401
        return this.serverProviders;
402
    }
403

    
404
    public List getProviders(int mode) {
405
        List<FilesystemServerExplorerProvider> providers = new ArrayList();
406
        List<FilesystemServerExplorerProvider> allProviders = getProviders();
407
        for (FilesystemServerExplorerProvider provider:allProviders){
408
            if (provider.isMode(mode)) {
409
                provider.initialize(this);
410
                providers.add(provider);
411
            }
412
        }
413
        return providers;
414
    }
415

    
416
    public Iterator getFilters(int mode) {
417
        return this.getProviders(mode).iterator();
418
    }
419

    
420
    public Iterator<FilesystemServerExplorerProvider> getFilters() {
421
        return this.getProviders().iterator();
422
    }
423

    
424
    public FilesystemFileFilter getFilter(int mode, final String description) {
425

    
426
        final List filters = new ArrayList();
427
        Iterator it = this.getFilters(mode);
428
        while (it.hasNext()) {
429
            filters.add(it.next());
430
        }
431
        FilesystemFileFilter filter = new FilesystemFileFilter() {
432

    
433
            public boolean accept(File f) {
434
                if (f.isDirectory()) {
435
                    return true;
436
                }
437
                for (int i = 0; i < filters.size(); i++) {
438
                    if (((FilesystemFileFilter) filters.get(i)).accept(f)) {
439
                        return true;
440
                    }
441
                }
442
                return false;
443
            }
444

    
445
            public String getDescription() {
446
                return description;
447
            }
448

    
449
            public String getDataStoreProviderName() {
450
                return null;
451
            }
452
        };
453
        return filter;
454
    }
455

    
456
    public FilesystemFileFilter getGenericFilter() {
457
        // FIXME: Este metodo, getGenericFilter, no tengo claro que deba existir (jjdc)
458
        return this;
459
    }
460

    
461
    public String getDataStoreProviderName() {
462
        return null;
463
    }
464

    
465
    public String getDescription() {
466
        return "All supporteds";
467
    }
468

    
469
    public boolean accept(File pathname) {
470
        try {
471
            return this.createStoreParameters(pathname) != null;
472
        } catch (DataException e) {
473
            throw new RuntimeException(e); // FIXME excpetion??
474
        }
475
    }
476

    
477
    public DataStore open(File file) throws DataException,
478
            ValidateDataParametersException {
479
        DataManager manager = DALLocator.getDataManager();
480
        String providerName = this.getProviderName(file);
481

    
482
        DataStoreParameters params = this.getAddParameters(file);
483
        return manager.openStore(providerName, params);
484
    }
485

    
486
    public NewDataStoreParameters getAddParameters(File file)
487
            throws DataException {
488
        DataStoreParameters params = this.getParametersFor(file, null, false);
489
        NewDataStoreParameters newParams = this.getAddParameters(params
490
                .getDataStoreName());
491
        ((FilesystemStoreParameters) newParams)
492
                .setFile(((FilesystemStoreParameters) params).getFile());
493
        return newParams;
494
    }
495

    
496
    @Override
497
    public File getResourcePath(DataStore dataStore, String resourceName) throws DataException {
498
        FilesystemServerExplorerProvider provider
499
                = this.getProvider(dataStore.getProviderName());
500
        if (provider == null) {
501
            return null;
502
        }
503
        String rootPathName = provider.getResourceRootPathName(dataStore);
504
        if (rootPathName == null) {
505
            return null;
506
        }
507
        File f = new File(FilenameUtils.getFullPathNoEndSeparator(rootPathName),resourceName);
508
        if( f.exists() ) {
509
            return f;
510
        }
511
        return new File(rootPathName + "." + resourceName);
512
    }
513

    
514
    @Override
515
    public DataStoreParameters get(String name) throws DataException {
516
        File theFile = new File(this.current,name);
517
        DataStoreParameters dsp = this.createStoreParameters(theFile);
518
        return dsp;
519
    }
520
}