Statistics
| Revision:

svn-gvsig-desktop / branches / org.gvsig.desktop-2018a / org.gvsig.desktop.plugin / org.gvsig.app / org.gvsig.app.mainplugin / src / main / java / org / gvsig / fmap / dal / serverexplorer / filesystem / swing / FilesystemExplorerWizardPanel.java @ 43802

History | View | Annotate | Download (16.1 KB)

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

    
3
import java.awt.GridBagConstraints;
4
import java.awt.GridBagLayout;
5
import java.awt.Window;
6
import java.beans.PropertyChangeEvent;
7
import java.beans.PropertyChangeListener;
8
import java.io.File;
9
import java.util.ArrayList;
10
import java.util.Iterator;
11
import java.util.List;
12
import java.util.prefs.Preferences;
13

    
14
import javax.swing.JOptionPane;
15
import javax.swing.event.AncestorEvent;
16
import javax.swing.event.AncestorListener;
17
import javax.swing.filechooser.FileFilter;
18

    
19
import org.cresques.cts.IProjection;
20
import org.slf4j.Logger;
21
import org.slf4j.LoggerFactory;
22

    
23
import org.gvsig.andami.Launcher;
24
import org.gvsig.app.ApplicationLocator;
25
import org.gvsig.app.ApplicationManager;
26
import org.gvsig.app.gui.WizardPanel;
27
import org.gvsig.app.gui.wizards.WizardListener;
28
import org.gvsig.app.gui.wizards.WizardListenerSupport;
29
import org.gvsig.app.prepareAction.PrepareContext;
30
import org.gvsig.app.prepareAction.PrepareContextView_v1;
31
import org.gvsig.app.project.documents.view.toc.actions.LayerErrorsPanel;
32
import org.gvsig.fmap.dal.DALLocator;
33
import org.gvsig.fmap.dal.DataManager;
34
import org.gvsig.fmap.dal.DataStore;
35
import org.gvsig.fmap.dal.DataStoreParameters;
36
import org.gvsig.fmap.dal.DataStoreProviderFactory;
37
import org.gvsig.fmap.dal.DataTypes;
38
import org.gvsig.fmap.dal.exception.DataException;
39
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemFileFilter;
40
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
41
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
42
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
43
import org.gvsig.fmap.mapcontext.MapContext;
44
import org.gvsig.fmap.mapcontext.MapContextLocator;
45
import org.gvsig.fmap.mapcontext.MapContextManager;
46
import org.gvsig.fmap.mapcontext.layers.FLayer;
47
import org.gvsig.fmap.mapcontrol.MapControl;
48
import org.gvsig.tools.ToolsLocator;
49
import org.gvsig.tools.dispose.DisposeUtils;
50
import org.gvsig.tools.dynobject.DynField;
51
import org.gvsig.tools.dynobject.DynObject;
52
import org.gvsig.tools.i18n.I18nManager;
53
import org.gvsig.tools.identitymanagement.UnauthorizedException;
54
import org.gvsig.tools.swing.api.ToolsSwingLocator;
55
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
56

    
57

    
58
/**
59
 * @author fdiaz
60
 *
61
 */
62
public class FilesystemExplorerWizardPanel extends WizardPanel {
63

    
64
    /**
65
     *
66
     */
67
    private static final long serialVersionUID = 788115220334290212L;
68

    
69
    private static final Logger logger = LoggerFactory.getLogger(FilesystemExplorerWizardPanel.class);
70

    
71
    private static final String DEFAULT_FILTER = "All_supported";
72

    
73
    public static final String OPEN_LAYER_FILE_CHOOSER_ID =
74
        "OPEN_LAYER_FILE_CHOOSER_ID";
75

    
76
    protected FilesystemServerExplorer explorer;
77
    private ArrayList<MyFileFilter> filters;
78

    
79
    private static String lastPath = null;
80
    private FilesystemExplorerWizardPanelController panel = null;
81
    private boolean tabularOnly;
82

    
83
    /**
84
     *
85
     */
86
    public FilesystemExplorerWizardPanel() {
87
        this(false);
88
    }
89

    
90
    public FilesystemExplorerWizardPanel(boolean tabularOnly) {
91
        super();
92
        this.tabularOnly = tabularOnly;
93
        this.addAncestorListener(new AncestorListener() {
94
            public void ancestorAdded(AncestorEvent ae) {
95
                initExplorer();
96
                initFilters();
97
                updatePanel();
98
            }
99
            public void ancestorRemoved(AncestorEvent ae) {
100
                dispose();
101
            }
102
            public void ancestorMoved(AncestorEvent ae) {
103
            }
104
        });
105
    }
106

    
107
    protected void updatePanel() {
108
        this.panel.setExplorer(this.explorer);
109
        this.panel.setFilters(this.filters);
110
    }
111

    
112
    @Override
113
    public void initWizard() {
114
        I18nManager i18nManager = ToolsLocator.getI18nManager();
115
        setTabName(i18nManager.getTranslation("Fichero"));
116
        if (lastPath == null) {
117
            Preferences prefs = Preferences.userRoot().node("gvsig.foldering");
118
            lastPath = prefs.get("DataFolder", System.getProperty("user.home"));
119
        }
120
        initExplorer();
121
        initFilters();
122
        initUI();
123
    }
124

    
125
    private void initUI() {
126

    
127
        setLayout(new GridBagLayout());
128
        GridBagConstraints gridBagConstraints = new GridBagConstraints();
129
        gridBagConstraints.fill = GridBagConstraints.BOTH;
130
        gridBagConstraints.weightx = 1.0;
131
        gridBagConstraints.weighty = 1.0;
132

    
133
        panel = new FilesystemExplorerWizardPanelController(getMapContext(),explorer, filters);
134
        panel.setTabularOnly(this.tabularOnly);
135
        this.add(panel, gridBagConstraints);
136

    
137
        panel.asJComponent().addPropertyChangeListener(new PropertyChangeListener() {
138
            @Override
139
            public void propertyChange(PropertyChangeEvent evt) {
140
                callStateChanged(areSettingsValid());
141
            }
142
        });
143

    
144
    }
145

    
146
    @Override
147
    public void execute() {
148
        if (this.getMapCtrl() == null) {
149
            throw new IllegalArgumentException("MapControl need");
150
        }
151
        String layerName;
152

    
153
        for (DataStoreParameters params : this.getParameters()) {
154
            IProjection proj = this.getMapCtrl().getProjection();
155

    
156
            // Buscamos por el parametro de la proyeccion
157
            // que sean obligatorios y est?n a null
158
            // y le ponemos la proyeccion de la vista
159
            DynField[] fields = params.getDynClass().getDynFields();
160
            int crsfields = 0;
161
            DynField crsfield = null;
162
            for (DynField field : fields) {
163
                if (field.getType() == DataTypes.CRS ) {
164
                    crsfields++;
165
                    crsfield = field;
166
                    if( field.isMandatory() ) {
167
                        if (params.getDynValue(field.getName()) == null) {
168
                            params.setDynValue(field.getName(), proj);
169
                        }
170
                    }
171
                }
172
            }
173
            if( crsfields == 1 && crsfield!=null ) {
174
                // Si solo hay un parametro CRS y esta a null, aunque no sea
175
                // obligatorio le asigna el CRS de la vista.
176
                if (params.getDynValue(crsfield.getName()) == null) {
177
                    params.setDynValue(crsfield.getName(), proj);
178
                }
179
            }
180

    
181
            layerName = ((FilesystemStoreParameters) params).getFile().getName();
182

    
183
            this.doAddLayer(layerName, params);
184
        }
185
    }
186

    
187
    @Override
188
    public void close() {
189
        this.dispose();
190
    }
191

    
192
    /**
193
     * Dispose filters and explorer
194
     */
195
    public void dispose() {
196
        if (explorer != null) {
197
            explorer.dispose();
198
            explorer = null;
199
        }
200
        if (filters != null) {
201
            filters.clear();
202
            filters = null;
203
        }
204
        panel.dispose();
205
    }
206

    
207
    @Override
208
    public DataStoreParameters[] getParameters() {
209
        return this.panel.getParameters();
210
    }
211

    
212
    /**
213
     * @param files
214
     */
215
    public void addFiles(List<File> files) {
216
        this.panel.addFiles(files);
217
    }
218

    
219

    
220
    private void initExplorer() {
221
        if (this.explorer == null) {
222
            DataManager dm = DALLocator.getDataManager();
223
            FilesystemServerExplorerParameters param;
224
            try {
225
                param = (FilesystemServerExplorerParameters) dm
226
                        .createServerExplorerParameters(FilesystemServerExplorer.NAME);
227
                param.setInitialpath(lastPath);
228
                explorer = (FilesystemServerExplorer) dm.openServerExplorer(
229
                                FilesystemServerExplorer.NAME, param);
230
            } catch (Exception e) {
231
                throw new RuntimeException(e);
232
            }
233
        }
234
    }
235

    
236
    private void initFilters() {
237
        if (this.filters == null) {
238
            int mode = FilesystemServerExplorer.MODE_ALL;
239
            this.filters = new ArrayList<MyFileFilter>();
240
            if (this.getMapCtrl() == null) {
241
                mode = FilesystemServerExplorer.MODE_FEATURE;
242
            } else {
243
                mode = FilesystemServerExplorer.MODE_GEOMETRY
244
                        | FilesystemServerExplorer.MODE_RASTER;
245
            }
246

    
247
            I18nManager i18nManager = ToolsLocator.getI18nManager();
248

    
249
            // First filter in list will be 'All formats' filter
250
            this.filters.add(new MyFileFilter(explorer.getFilter(mode,
251
                    i18nManager.getTranslation(DEFAULT_FILTER))));
252

    
253
            @SuppressWarnings("unchecked")
254
            Iterator<FilesystemFileFilter> iter = explorer.getFilters(mode);
255
            while (iter.hasNext()) {
256
                this.filters.add(new MyFileFilter(iter.next()));
257
            }
258
        }
259
    }
260

    
261
    boolean isTiled(DataStoreParameters parameters){
262
        return this.panel.isTiled(parameters);
263
    }
264

    
265
    @Override
266
    protected void doAddLayer(final String layerName, final DataStoreParameters parameters) {
267
        final boolean b_isMapControlAvail = this.isMapControlAvailable();
268
        final MapControl mapControl = this.getMapCtrl();
269
        final MapContext mapContext = this.getMapContext();
270
        final ApplicationManager application = ApplicationLocator.getManager();
271
        final MapContextManager manager
272
                = MapContextLocator.getMapContextManager();
273

    
274
        logger.info("addLayer('{}',...)", layerName);
275
        Thread task = new Thread(new Runnable() {
276

    
277
            @Override
278
            public void run() {
279
                FLayer layer = null;
280
                FLayer preparedLayer = null;
281
                try {
282
                    DataManager dataManager = DALLocator.getDataManager();
283
                    DataStore dataStore = dataManager.openStore(parameters.getDataStoreName(), parameters);
284
                    DataStoreProviderFactory factory = dataStore.getProviderFactory();
285
                    if (factory.isTiledSupported() != DataStoreProviderFactory.NO && !factory.getClass().getSimpleName().equals("TileProviderFactory")) {
286
                        if (isTiled(parameters)) {
287
                            DynObject tileParameters = dataManager.createStoreParameters("TileCache");
288

    
289
                            File rootFolder = new File(Launcher.getAppHomeDir() + File.separator + "gvsig_rcache");
290

    
291
                            if (tileParameters.getDynClass().getDynField("rootFolder") != null) {
292
                                tileParameters.setDynValue("rootFolder", rootFolder);
293
                            }
294

    
295
                            try {
296
                                dataStore.useCache("TileCache", tileParameters);
297
                            } catch (DataException e) {
298
                                logger.warn("Can't cache the layer.", e);
299
                            }
300

    
301
                        }
302
                    }
303

    
304
                    String layerName = dataStore.getName();
305
                    layer = manager.createLayer(layerName, dataStore);
306
                    DisposeUtils.disposeQuietly(dataStore);
307
                    preparedLayer
308
                            = application.prepareOpenLayer(layer,
309
                                    new PrepareContextView_v1() {
310

    
311
                                        @Override
312
                                        public Window getOwnerWindow() {
313
                                            return null;
314
                                        }
315

    
316
                                        @Override
317
                                        public MapControl getMapControl() {
318
                                            return mapControl;
319
                                        }
320

    
321
                                        @Override
322
                                        public IProjection getViewProjection() {
323
                                            return mapContext.getProjection();
324
                                        }
325

    
326
                                        @Override
327
                                        public MapContext getMapContext() {
328
                                            return mapContext;
329
                                        }
330

    
331
                                        @Override
332
                                        public boolean isMapControlAvailable() {
333
                                            return b_isMapControlAvail;
334
                                        }
335
                                    });
336
                    if (preparedLayer != null) {
337
                        mapControl.addLayer(preparedLayer);
338
                    }
339
                } catch (UnauthorizedException e) {
340
                    I18nManager i18nManager = ToolsLocator.getI18nManager();
341
                    ApplicationManager application = ApplicationLocator.getManager();
342
                    String resource = "";
343
                    if (e.getResource() instanceof FilesystemStoreParameters) {
344
                        resource = ((FilesystemStoreParameters) e.getResource()).getFile().getPath();
345
                    }
346
                    application.messageDialog(
347
                            i18nManager.getTranslation("_User_0_is_not_authorized_to_1_on_resource_2_3",
348
                                    new String[]{
349
                                        e.getIdentity().getID(),
350
                                        e.getActionName(),
351
                                        e.getResourceName(),
352
                                        resource
353
                                    }),
354
                            i18nManager.getTranslation("_Unauthorized_access"),
355
                            JOptionPane.WARNING_MESSAGE
356
                    );
357
                    logger.warn("Unauthorized access to layer '" + layerName + "'.", e);
358

    
359
                } catch (Exception e) {
360
                    LayerErrorsPanel panel = new LayerErrorsPanel(layerName, e);
361
                    if (preparedLayer != null) {
362
                        panel.setLayer(preparedLayer);
363
                    } else if(layer!=null){
364
                        panel.setLayer(layer);
365
                    }
366
                    I18nManager i18nManager = ToolsLocator.getI18nManager();
367
                    ToolsSwingLocator.getWindowManager().showWindow(
368
                        panel,
369
                        i18nManager.getTranslation("_Problems_loading_the_layer"),
370
                        WindowManager.MODE.WINDOW
371
                    );
372
                    logger.warn("Can't load layer '" + layerName + "'.", e);
373

    
374
                } finally {
375
                    if (preparedLayer != layer) {
376
                        DisposeUtils.disposeQuietly(preparedLayer);
377
                    }
378
                    DisposeUtils.disposeQuietly(layer);
379
                }
380
            }
381
        });
382
        task.start();
383

    
384
    }
385

    
386

    
387
    /**
388
     * @author fdiaz
389
     *
390
     */
391
    public class MyFileFilter extends FileFilter {
392

    
393
        private FilesystemFileFilter filter = null;
394

    
395
        /**
396
         * @param params
397
         */
398
        public MyFileFilter(FilesystemFileFilter params) {
399
            this.setFilter(params);
400
        }
401

    
402
        /**
403
         * @see javax.swing.filechooser.FileFilter#accept(java.io.File)
404
         */
405
        public boolean accept(File f) {
406
            if (f.isDirectory()) {
407
                return true;
408
            }
409
            return getFilter().accept(f);
410

    
411
        }
412

    
413
        /**
414
         * @see javax.swing.filechooser.FileFilter#getDescription()
415
         */
416
        public String getDescription() {
417
            return getFilter().getDescription();
418
        }
419

    
420
        /**
421
         * @return
422
         */
423
        public String getName() {
424
            return getFilter().getDataStoreProviderName();
425
        }
426

    
427
        /**
428
         * @return the filter
429
         */
430
        public FilesystemFileFilter getFilter() {
431
            return filter;
432
        }
433

    
434
        /**
435
         * @param filter the filter to set
436
         */
437
        public void setFilter(FilesystemFileFilter filter) {
438
            this.filter = filter;
439
        }
440
    }
441

    
442
    protected void showPropertiesDialog(DynObject parameters) {
443
        panel.showPropertiesDialog(parameters);
444
    }
445

    
446
    protected PrepareContext getPrepareDataStoreContext() {
447
        return panel.getPrepareDataStoreContext();
448
    }
449

    
450

    
451
    @Override
452
    public boolean areSettingsValid() {
453
        boolean valid = super.areSettingsValid();
454
        return valid && getMapCtrl()!=null;
455
    }
456

    
457
}