Statistics
| Revision:

root / branches / v2_0_0_prep / libraries / libFMap_dalfile / src / org / gvsig / fmap / dal / serverexplorer / filesystem / impl / DefaultFilesystemServerExplorer.java @ 32880

History | View | Annotate | Download (12.8 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.ValidateDataParametersException;
23
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemFileFilter;
24
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
25
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
26
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
27
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider;
28
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProviderServices;
29
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
30
import org.gvsig.fmap.dal.spi.DataServerExplorerProviderServices;
31
import org.gvsig.tools.dispose.impl.AbstractDisposable;
32
import org.gvsig.tools.exception.BaseException;
33
import org.gvsig.tools.extensionpoint.ExtensionPoint.Extension;
34

    
35
public class DefaultFilesystemServerExplorer extends AbstractDisposable
36
                implements FilesystemServerExplorerProviderServices,
37
                FilesystemFileFilter {
38
        // FIXME: , IPersistence{
39

    
40
        FilesystemServerExplorerParameters parameters;
41

    
42
        private File root;
43

    
44
        private File current;
45

    
46
        private DataServerExplorerProviderServices providerServices;
47

    
48
        private List serverProviders;
49

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

    
70
        /*
71
         * (non-Javadoc)
72
         * 
73
         * @see
74
         * org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer
75
         * #getParameters()
76
         */
77
        public DataServerExplorerParameters getParameters() {
78
                return parameters;
79
        }
80

    
81
        @Override
82
        protected void doDispose() throws BaseException {
83
                this.parameters = null;
84
                this.root = null;
85
        }
86

    
87
        public List list(int mode) throws DataException {
88
                // TODO
89
                return list();
90
        }
91

    
92
        /*
93
         * (non-Javadoc)
94
         * 
95
         * @see
96
         * org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer
97
         * #list()
98
         */
99
        public List list() throws DataException {
100
                if (this.current == null) {
101
                        throw new IllegalStateException(); // FIXME
102
                }
103
                if (!this.current.exists()) {
104
                        // TODO crear excepcion de Data??
105
                        new org.gvsig.fmap.dal.exception.FileNotFoundException(this.current);
106
                }
107

    
108
                if (!this.current.isDirectory()) {
109
                        new IllegalArgumentException(this.getName()
110
                                        + ": Path not a directory '" + this.current + "'");
111
                }
112
                // DataManager dsm=DataManager.getManager();
113

    
114
                String files[] = this.current.list();
115
                int i;
116
                File theFile;
117
                ArrayList list = new ArrayList();
118
                DataStoreParameters dsp = null;
119

    
120
                for (i = 0; i < files.length; i++) {
121
                        theFile = new File(this.root, files[i]);
122
                        dsp = this.createStoreParameters(theFile);
123
                        if (dsp != null) {
124
                                list.add(dsp);
125
                        }
126
                }
127
                return list;
128
        }
129

    
130
        /*
131
         * (non-Javadoc)
132
         * 
133
         * @see
134
         * org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer
135
         * #setCurrentPath(java.io.File)
136
         */
137
        public void setCurrentPath(File path) throws FileNotFoundException {
138
                // FIXME Comprobar si es un directorio existente
139
                if (!path.exists()) {
140
                        throw new FileNotFoundException(path);
141
                }
142
                if (!path.isDirectory()) {
143
                        throw new IllegalArgumentException(path.getPath()
144
                                        + " is not a directory");
145
                }
146
                if (!isFromRoot(path)) {
147
                        throw new IllegalArgumentException(path.getPath()
148
                                        + " is not from root");
149

    
150
                }
151

    
152
                this.current = path;
153
        }
154

    
155
        /*
156
         * (non-Javadoc)
157
         * 
158
         * @see
159
         * org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer
160
         * #getCurrentPath()
161
         */
162
        public File getCurrentPath() {
163
                return this.current;
164
        }
165

    
166
        /*
167
         * (non-Javadoc)
168
         * 
169
         * @see
170
         * org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer
171
         * #getRoot()
172
         */
173
        public File getRoot() {
174
                return this.root;
175
        }
176

    
177
        /*
178
         * (non-Javadoc)
179
         * 
180
         * @see
181
         * org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer
182
         * #remove(org.gvsig.fmap.dal.DataStoreParameters)
183
         */
184
        public void remove(DataStoreParameters dsp) throws RemoveException {
185
                String providerName = dsp.getDataStoreName();
186
                try {
187
                        this.checkIsMine(dsp);
188
                        FilesystemServerExplorerProvider provider = this
189
                                        .getProvider(providerName);
190

    
191
                        provider.remove(dsp);
192
                } catch (DataException e) {
193
                        throw new RemoveException(this.getName(), e);
194
                }
195
        }
196

    
197
        /*
198
         * (non-Javadoc)
199
         * 
200
         * @see
201
         * org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer
202
         * #add(org.gvsig.fmap.dal.NewDataStoreParameters, boolean)
203
         */
204
        public boolean add(String providerName, NewDataStoreParameters ndsp,
205
                        boolean overwrite) throws DataException {
206
                // String providerName = ndsp.getDataStoreName();
207

    
208
                try {
209
                        this.checkIsMine(ndsp);
210
                        FilesystemServerExplorerProvider provider = this
211
                                        .getProvider(providerName);
212

    
213
                        provider.create(ndsp, overwrite);
214
                        return true; // TODO deber?a devolver un booleano el provider o esto
215
                        // ser un void
216
                } catch (DataException e) {
217
                        throw new RemoveException(this.getName(), e);
218
                }
219
        }
220

    
221
        /*
222
         * (non-Javadoc)
223
         * 
224
         * @see
225
         * org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer
226
         * #canAdd()
227
         */
228
        public boolean canAdd() {
229
                return this.root.canWrite();
230
        }
231

    
232
        /*
233
         * (non-Javadoc)
234
         * 
235
         * @see
236
         * org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer
237
         * #getName()
238
         */
239
        public String getName() {
240
                return FilesystemServerExplorer.NAME;
241
        }
242

    
243
        /*
244
         * (non-Javadoc)
245
         * 
246
         * @see
247
         * org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer
248
         * #getAddParameters(java.lang.String)
249
         */
250
        public NewDataStoreParameters getAddParameters(String storeName)
251
                        throws DataException {
252
                FilesystemServerExplorerProvider provider = this.getProvider(storeName);
253
                if (provider == null) {
254
                        throw new IllegalArgumentException(
255
                                        "Not registered in this explorer"); // FIXME
256
                }
257

    
258
                NewDataStoreParameters nParams = provider.getCreateParameters();
259
                // nParams.setAttribute("path", this.getCurrentPath().getPath());
260
                return nParams;
261
        }
262

    
263
        /*
264
         * (non-Javadoc)
265
         * 
266
         * @see
267
         * org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer
268
         * #canAdd(java.lang.String)
269
         */
270
        public boolean canAdd(String storeName) throws DataException {
271
                if (storeName == null) {
272
                        return false;// CanAdd with genericFilter
273
                }
274
                FilesystemServerExplorerProvider provider = this.getProvider(storeName);
275
                if (provider == null) {
276
                        throw new IllegalArgumentException(
277
                                        "Not registered in this explorer"); // FIXME
278
                }
279

    
280
                return provider.canCreate();
281

    
282
        }
283

    
284
        // ==========================================
285

    
286
        private FilesystemServerExplorerProvider getProvider(String storeName)
287
                        throws InitializeException, ProviderNotRegisteredException {
288
                Iterator providers = getProviders().iterator();
289
                FilesystemServerExplorerProvider provider;
290
                while (providers.hasNext()) {
291
                        provider = (FilesystemServerExplorerProvider) providers.next();
292
                        if (provider.getDataStoreProviderName().equals(storeName)) {
293
                                return provider;
294
                        }
295
                }
296
                return null;
297
        }
298

    
299
        private DataManagerProviderServices getManager() {
300
                return (DataManagerProviderServices) DALLocator.getDataManager();
301
        }
302

    
303
        /*
304
         * (non-Javadoc)
305
         * 
306
         * @see
307
         * org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer
308
         * #getParametersFor(java.io.File)
309
         */
310
        public DataStoreParameters createStoreParameters(File file) throws DataException {
311

    
312
                return this.getParametersFor(file, true);
313
        }
314

    
315
        public DataStoreParameters getParametersFor(File file, boolean checksExist)
316
                        throws DataException {
317

    
318
                if (checksExist) {
319
                        if (!file.exists()) {
320
                                return null;
321
                        }
322
                        if (!file.isFile()) {
323
                                return null;
324
                        }
325
                        if (!file.canRead()) {
326
                                return null;
327
                        }
328
                        if (file.isHidden()) { // XXX ???
329
                                return null;
330
                        }
331
                }
332
                String providerName = this.getProviderName(file);
333
                if (providerName != null) {
334
                        DataStoreParameters params = this.getManager()
335
                                        .createStoreParameters(providerName);
336
                        ((FilesystemStoreParameters) params).setFile(file);
337
                        return params;
338

    
339
                }
340
                return null;
341
        }
342

    
343
        public String getProviderName(File file) {
344
                Iterator filters = getFilters();
345
                while (filters.hasNext()) {
346
                        FilesystemFileFilter filter = (FilesystemFileFilter) filters.next();
347
                        if (filter.accept(file)) {
348
                                return filter.getDataStoreProviderName();
349
                        }
350
                }
351
                return null;
352
        }
353

    
354
        public List getDataStoreProviderNames() {
355
                Set names = new HashSet();
356
                
357
                Iterator filters = getFilters();
358
                while (filters.hasNext()) {
359
                        FilesystemFileFilter filter = (FilesystemFileFilter) filters.next();
360
                        names.add(filter.getDataStoreProviderName());
361
                }
362
                return new ArrayList(names);        
363
        }
364

    
365
        private void checkIsMine(DataStoreParameters dsp)
366
                        throws IllegalArgumentException, DataException {
367
                // FIXME Exception ???
368
                if (!(dsp instanceof FilesystemStoreParameters)) {
369
                        new IllegalArgumentException(
370
                                        "not instance of FilesystemStoreParameters");
371
                }
372
                Iterator filters = getFilters();
373
                File file = ((FilesystemStoreParameters) dsp).getFile();
374
                if (!this.isFromRoot(file)) {
375
                        throw new IllegalArgumentException("worng explorer");
376
                }
377
                FilesystemFileFilter filter;
378
                while (filters.hasNext()) {
379
                        filter = (FilesystemFileFilter) filters.next();
380
                        if (dsp.getDataStoreName()
381
                                        .equals(filter.getDataStoreProviderName())) {
382
                                return;
383
                        }
384
                }
385
                throw new IllegalArgumentException("worng explorer");
386
        }
387

    
388
        private boolean isFromRoot(File file) {
389
                if (this.root == null) {
390
                        return true;
391
                }
392
                return file.getAbsolutePath().startsWith(this.root.getAbsolutePath());
393
        }
394

    
395
        public List getProviders() {
396
                if (this.serverProviders == null) {
397
                        Iterator iter = DALFileLocator.getFilesystemServerExplorerManager()
398
                                        .getRegisteredProviders();
399
                        this.serverProviders = new ArrayList();
400
                        Extension ext;
401
                        FilesystemServerExplorerProvider provider;
402
                        while (iter.hasNext()) {
403
                                ext = (Extension) iter.next();
404
                                try {
405
                                        provider = (FilesystemServerExplorerProvider) ext.create();
406
                                } catch (Exception e) {
407
                                        throw new RuntimeException(e);// FIXME !!!
408
                                }
409
                                provider.initialize(this);
410
                                this.serverProviders.add(provider);
411
                        }
412
                }
413
                return this.serverProviders;
414
        }
415

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

    
420
        public FilesystemFileFilter getGenericFilter() {
421
                return this;
422
        }
423

    
424
        public String getDataStoreProviderName() {
425
                return null;
426
        }
427

    
428
        public String getDescription() {
429
                return "All supporteds";
430
        }
431

    
432
        public boolean accept(File pathname) {
433
                try {
434
                        return this.createStoreParameters(pathname) != null;
435
                } catch (DataException e) {
436
                        throw new RuntimeException(e); // FIXME excpetion??
437
                }
438
        }
439

    
440
        public DataServerExplorerProviderServices getServerExplorerProviderServices() {
441
                return this.providerServices;
442
        }
443

    
444
        public DataStore open(File file) throws DataException,
445
                        ValidateDataParametersException {
446
                DataManager manager =  DALLocator.getDataManager();
447
                String providerName = this.getProviderName(file);
448
                
449
                DataStoreParameters params = manager.createStoreParameters(providerName);
450
                return manager.openStore(providerName, params);
451
        }
452

    
453
        public NewDataStoreParameters getAddParameters(File file)
454
                        throws DataException {
455
                DataStoreParameters params = this.getParametersFor(file, false);
456
                NewDataStoreParameters newParams = this.getAddParameters(params
457
                                .getDataStoreName());
458
                ((FilesystemStoreParameters) newParams)
459
                                .setFile(((FilesystemStoreParameters) params).getFile());
460
                return newParams;
461
        }
462

    
463
}