Statistics
| Revision:

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

History | View | Annotate | Download (14.5 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.HashSet;
6
import java.util.Iterator;
7
import java.util.List;
8
import java.util.Set;
9

    
10
import org.gvsig.fmap.dal.DALFileLocator;
11
import org.gvsig.fmap.dal.DALLocator;
12
import org.gvsig.fmap.dal.DataManager;
13
import org.gvsig.fmap.dal.DataServerExplorerParameters;
14
import org.gvsig.fmap.dal.DataStore;
15
import org.gvsig.fmap.dal.DataStoreParameters;
16
import org.gvsig.fmap.dal.NewDataStoreParameters;
17
import org.gvsig.fmap.dal.exception.DataException;
18
import org.gvsig.fmap.dal.exception.FileNotFoundException;
19
import org.gvsig.fmap.dal.exception.InitializeException;
20
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
21
import org.gvsig.fmap.dal.exception.RemoveException;
22
import org.gvsig.fmap.dal.exception.ServerExplorerAddException;
23
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
24
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemFileFilter;
25
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
26
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
27
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
28
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider;
29
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProviderServices;
30
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
31
import org.gvsig.fmap.dal.spi.DataServerExplorerProviderServices;
32
import org.gvsig.tools.dispose.impl.AbstractDisposable;
33
import org.gvsig.tools.exception.BaseException;
34
import org.gvsig.tools.extensionpoint.ExtensionPoint.Extension;
35

    
36
@SuppressWarnings({"unchecked"})
37
public class DefaultFilesystemServerExplorer extends AbstractDisposable
38
                implements FilesystemServerExplorerProviderServices,
39
                FilesystemFileFilter {
40

    
41
        FilesystemServerExplorerParameters parameters;
42

    
43
        private File root;
44

    
45
        private File current; // Current path
46

    
47
        private DataServerExplorerProviderServices providerServices;
48

    
49
        private List serverProviders;
50

    
51
        public DefaultFilesystemServerExplorer(
52
                        FilesystemServerExplorerParameters parameters,
53
                        DataServerExplorerProviderServices services)
54
                        throws InitializeException {
55
                this.parameters = parameters;
56
                this.providerServices = services;
57
                if (this.parameters.getRoot() != null) {
58
                        this.root = new File(this.parameters.getRoot());
59
                }
60
                if (this.parameters.getInitialpath() != null) {
61
                        this.current = new File(this.parameters.getInitialpath());
62
                }
63
                if (this.root == null && this.current == null) {
64
                        // throw new InitializeException(this.getName(),
65
                        // new IllegalArgumentException());
66
                } else if (this.current == null) {
67
                        this.current = new File(this.parameters.getRoot());
68
                }
69
        }
70

    
71
        public DataServerExplorerParameters getParameters() {
72
                return parameters;
73
        }
74

    
75
        protected void doDispose() throws BaseException {
76
                this.parameters = null;
77
                this.root = null;
78
        }
79

    
80
        public List list(int mode) throws DataException {
81
                if (this.current == null) {
82
                        throw new IllegalStateException();
83
                }
84
                if (!this.current.exists()) {
85
                        new org.gvsig.fmap.dal.exception.FileNotFoundException(this.current);
86
                }
87

    
88
                if (!this.current.isDirectory()) {
89
                        new IllegalArgumentException(this.getProviderName()
90
                                        + ": Path not a directory '" + this.current + "'");
91
                }
92

    
93
                List files = new ArrayList(); // return files
94
                List providers = this.getProviders(mode); 
95
                String allfiles[] = this.current.list();
96

    
97
                for (int i = 0; i < allfiles.length; i++) {
98
                        File file = new File(this.root, allfiles[i]);
99
                        Iterator providersit = providers.iterator();
100
                        while (providersit.hasNext()) {
101
                                FilesystemServerExplorerProvider provider = (FilesystemServerExplorerProvider) providersit
102
                                                .next();
103
                                if( provider.accept(file)) {
104
                                        DataStoreParameters dsp = this.createStoreParameters(file);
105
                                        if (dsp != null) {
106
                                                files.add(dsp);
107
                                        }
108
                                        break;
109
                                }
110
                        }
111
                }
112
                return files;
113
        }
114

    
115
        public List list() throws DataException {
116
                if (this.current == null) {
117
                        throw new IllegalStateException(); // FIXME
118
                }
119
                if (!this.current.exists()) {
120
                        // TODO crear excepcion de Data??
121
                        new org.gvsig.fmap.dal.exception.FileNotFoundException(this.current);
122
                }
123

    
124
                if (!this.current.isDirectory()) {
125
                        new IllegalArgumentException(this.getProviderName()
126
                                        + ": Path not a directory '" + this.current + "'");
127
                }
128

    
129
                String files[] = this.current.list();
130
                int i;
131
                File theFile;
132
                ArrayList list = new ArrayList();
133
                DataStoreParameters dsp = null;
134

    
135
                for (i = 0; i < files.length; i++) {
136
                        theFile = new File(this.root, files[i]);
137
                        dsp = this.createStoreParameters(theFile);
138
                        if (dsp != null) {
139
                                list.add(dsp);
140
                        }
141
                }
142
                return list;
143
        }
144

    
145
        public void setCurrentPath(File path) throws FileNotFoundException {
146
                // FIXME Comprobar si es un directorio existente
147
                if (!path.exists()) {
148
                        throw new FileNotFoundException(path);
149
                }
150
                if (!path.isDirectory()) {
151
                        throw new IllegalArgumentException(path.getPath()
152
                                        + " is not a directory");
153
                }
154
                if (!isFromRoot(path)) {
155
                        throw new IllegalArgumentException(path.getPath()
156
                                        + " is not from root");
157

    
158
                }
159

    
160
                this.current = path;
161
        }
162

    
163
        public File getCurrentPath() {
164
                return this.current;
165
        }
166

    
167
        public File getRoot() {
168
                return this.root;
169
        }
170

    
171
        public void remove(DataStoreParameters dsp) throws RemoveException {
172
                String providerName = dsp.getDataStoreName();
173
                try {
174
                        this.checkIsMine(dsp);
175
                        FilesystemServerExplorerProvider provider = this
176
                                        .getProvider(providerName);
177

    
178
                        provider.remove(dsp);
179
                } catch (DataException e) {
180
                        throw new RemoveException(this.getProviderName(), e);
181
                }
182
        }
183

    
184
        public boolean add(String providerName, NewDataStoreParameters ndsp,
185
                        boolean overwrite) throws DataException {
186

    
187
                try {
188
                        this.checkIsMine(ndsp);
189
                        FilesystemServerExplorerProvider provider = this
190
                                        .getProvider(providerName);
191

    
192
                        ndsp.validate();
193
                        provider.create(ndsp, overwrite);
194
                        return true; 
195
                } catch (DataException e) {
196
                        throw new ServerExplorerAddException(this.getProviderName(), e);
197
                } catch (ValidateDataParametersException e) {
198
                        throw new ServerExplorerAddException(this.getProviderName(), e);
199
                }
200
        }
201

    
202
        public boolean canAdd() {
203
                return this.root.canWrite();
204
        }
205

    
206
        public String getProviderName() {
207
                return FilesystemServerExplorer.NAME;
208
        }
209

    
210
        public NewDataStoreParameters getAddParameters(String storeName)
211
                        throws DataException {
212
                FilesystemServerExplorerProvider provider = this.getProvider(storeName);
213
                if (provider == null) {
214
                        throw new IllegalArgumentException(
215
                                        "Not registered in this explorer"); // FIXME
216
                }
217

    
218
                NewDataStoreParameters nParams = provider.getCreateParameters();
219
                // nParams.setAttribute("path", this.getCurrentPath().getPath());
220
                return nParams;
221
        }
222

    
223
        public boolean canAdd(String storeName) throws DataException {
224
                if (storeName == null) {
225
                        return false;// CanAdd with genericFilter
226
                }
227
                FilesystemServerExplorerProvider provider = this.getProvider(storeName);
228
                if (provider == null) {
229
                        throw new IllegalArgumentException(
230
                                        "Not registered in this explorer"); // FIXME
231
                }
232

    
233
                return provider.canCreate();
234

    
235
        }
236

    
237
        // ==========================================
238

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

    
252
        private DataManagerProviderServices getManager() {
253
                return (DataManagerProviderServices) DALLocator.getDataManager();
254
        }
255
        
256
        public DataStoreParameters createStoreParameters(File file, String providerName) throws DataException {
257

    
258
                return this.getParametersFor(file, providerName, true);
259
        }
260

    
261
        public DataStoreParameters createStoreParameters(File file) throws DataException {
262

    
263
                return this.getParametersFor(file, null, true);
264
        }
265
        
266
        public DataStoreParameters getParametersFor(File file, String providerName, boolean checksExist) throws DataException {
267
                
268
                if (checksExist) {
269
                        if (!file.exists()) {
270
                                return null;
271
                        }
272
                        if (!file.isFile()) {
273
                                return null;
274
                        }
275
                        if (!file.canRead()) {
276
                                return null;
277
                        }
278
                        if (file.isHidden()) { // XXX ???
279
                                return null;
280
                        }
281
                }
282
                if(providerName == null)
283
                        providerName = this.getProviderName(file);
284
                if (providerName != null) {
285
                        DataStoreParameters params = this.getManager()
286
                        .createStoreParameters(providerName);
287
                        ((FilesystemStoreParameters) params).setFile(file);
288
                        return params;
289

    
290
                }
291
                return null;
292
        }
293
        
294
        public ArrayList<String> getProviderNameList(File file) {
295
                Iterator filters = getFilters();
296
                ArrayList<String> list = new ArrayList<String>();
297
                while (filters.hasNext()) {
298
                        FilesystemFileFilter filter = (FilesystemFileFilter) filters.next();
299
                        if (filter.accept(file)) {
300
                                list.add(filter.getDataStoreProviderName());
301
                        }
302
                }
303
                return list;
304
        }
305

    
306
        public String getProviderName(File file) {
307
                Iterator filters = getFilters();
308
                while (filters.hasNext()) {
309
                        FilesystemFileFilter filter = (FilesystemFileFilter) filters.next();
310
                        if (filter.accept(file)) {
311
                                return filter.getDataStoreProviderName();
312
                        }
313
                }
314
                return null;
315
        }
316

    
317
        public List getDataStoreProviderNames() {
318
                Set names = new HashSet();
319
                
320
                Iterator filters = getFilters();
321
                while (filters.hasNext()) {
322
                        FilesystemFileFilter filter = (FilesystemFileFilter) filters.next();
323
                        names.add(filter.getDataStoreProviderName());
324
                }
325
                return new ArrayList(names);        
326
        }
327

    
328
        private void checkIsMine(DataStoreParameters dsp)
329
                        throws IllegalArgumentException, DataException {
330
                // FIXME Exception ???
331
                if (!(dsp instanceof FilesystemStoreParameters)) {
332
                        new IllegalArgumentException(
333
                                        "not instance of FilesystemStoreParameters");
334
                }
335
                Iterator filters = getFilters();
336
                File file = ((FilesystemStoreParameters) dsp).getFile();
337
                if (!this.isFromRoot(file)) {
338
                        throw new IllegalArgumentException("worng explorer");
339
                }
340
                FilesystemFileFilter filter;
341
                while (filters.hasNext()) {
342
                        filter = (FilesystemFileFilter) filters.next();
343
                        if (dsp.getDataStoreName()
344
                                        .equals(filter.getDataStoreProviderName())) {
345
                                return;
346
                        }
347
                }
348
                throw new IllegalArgumentException("worng explorer");
349
        }
350

    
351
        private boolean isFromRoot(File file) {
352
                if (this.root == null) {
353
                        return true;
354
                }
355
                return file.getAbsolutePath().startsWith(this.root.getAbsolutePath());
356
        }
357

    
358
        public List getProviders() {
359
                if (this.serverProviders == null) {
360
                        Iterator iter = DALFileLocator.getFilesystemServerExplorerManager()
361
                                        .getRegisteredProviders();
362
                        this.serverProviders = new ArrayList();
363
                        Extension ext;
364
                        FilesystemServerExplorerProvider provider;
365
                        while (iter.hasNext()) {
366
                                ext = (Extension) iter.next();
367
                                try {
368
                                        provider = (FilesystemServerExplorerProvider) ext.create();
369
                                } catch (Exception e) {
370
                                        throw new RuntimeException(e);// FIXME !!!
371
                                }
372
                                provider.initialize(this);
373
                                this.serverProviders.add(provider);
374
                        }
375
                }
376
                return this.serverProviders;
377
        }
378

    
379
        public List getProviders(int mode) {
380
                Iterator iter = DALFileLocator.getFilesystemServerExplorerManager()
381
                                .getRegisteredProviders();
382
                List providers = new ArrayList();
383
                Extension ext;
384
                FilesystemServerExplorerProvider provider;
385
                while (iter.hasNext()) {
386
                        ext = (Extension) iter.next();
387
                        try {
388
                                provider = (FilesystemServerExplorerProvider) ext.create();
389
                        } catch (Exception e) {
390
                                throw new RuntimeException(e);// FIXME !!!
391
                        }
392
                        if (provider.isMode(mode)) {
393
                                provider.initialize(this);
394
                                providers.add(provider);
395
                        }
396
                }
397
                return providers;
398
        }
399

    
400
        public Iterator getFilters(int mode) {
401
                return this.getProviders(mode).iterator();
402
        }
403
        
404
        public Iterator getFilters() {
405
                return this.getProviders().iterator();
406
        }
407

    
408
        public FilesystemFileFilter getFilter(int mode, final String description ) {
409
                
410
                final List filters = new ArrayList();
411
                Iterator it = this.getFilters(mode);
412
                while( it.hasNext() ) {
413
                        filters.add( it.next() );
414
                }
415
                FilesystemFileFilter filter = new FilesystemFileFilter() {
416
                        
417
                        public boolean accept(File f) {
418
                                if (f.isDirectory()) {
419
                                        return true;
420
                                }
421
                                for(int i=0; i<filters.size(); i++) {
422
                                        if( ((FilesystemFileFilter)filters.get(i)).accept(f) ) {
423
                                                return true;
424
                                        }
425
                                }
426
                                return false;
427
                        }
428
                        
429
                        public String getDescription() {
430
                                return description;
431
                        }
432
                        
433
                        public String getDataStoreProviderName() {
434
                                return null;
435
                        }
436
                };
437
                return filter;
438
        }
439

    
440
        public FilesystemFileFilter getGenericFilter() {
441
                // FIXME: Este metodo, getGenericFilter, no tengo claro que deba existir (jjdc)
442
                return this;
443
        }
444

    
445
        public String getDataStoreProviderName() {
446
                return null;
447
        }
448

    
449
        public String getDescription() {
450
                return "All supporteds";
451
        }
452

    
453
        public boolean accept(File pathname) {
454
                try {
455
                        return this.createStoreParameters(pathname) != null;
456
                } catch (DataException e) {
457
                        throw new RuntimeException(e); // FIXME excpetion??
458
                }
459
        }
460

    
461
        public DataServerExplorerProviderServices getServerExplorerProviderServices() {
462
                return this.providerServices;
463
        }
464

    
465
        public DataStore open(File file) throws DataException,
466
                        ValidateDataParametersException {
467
                DataManager manager =  DALLocator.getDataManager();
468
                String providerName = this.getProviderName(file);
469
                
470
        DataStoreParameters params = this.getAddParameters(file);
471
                return manager.openStore(providerName, params);
472
        }
473

    
474
        public NewDataStoreParameters getAddParameters(File file)
475
                        throws DataException {
476
                DataStoreParameters params = this.getParametersFor(file, null, false);
477
                NewDataStoreParameters newParams = this.getAddParameters(params
478
                                .getDataStoreName());
479
                ((FilesystemStoreParameters) newParams)
480
                                .setFile(((FilesystemStoreParameters) params).getFile());
481
                return newParams;
482
        }
483

    
484
        public File getResourcePath(DataStore dataStore, String resourceName) throws DataException {
485
                FilesystemServerExplorerProvider provider = 
486
                        this.getProvider(dataStore.getName());
487
                if (provider == null){
488
                        return null;
489
                }                
490
                String rootPath = provider.getResourceRootPathName(dataStore);
491
                if (rootPath == null){
492
                        return null;
493
                }
494
                return new File(rootPath + "." + resourceName);
495
        }
496
}