Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.app / org.gvsig.app.mainplugin / src / main / java / org / gvsig / fmap / dal / serverexplorer / filesystem / swing / FilesystemExplorerWizardPanel.java @ 45810

History | View | Annotate | Download (14.6 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.io.File;
7
import java.util.ArrayList;
8
import java.util.Iterator;
9
import java.util.List;
10

    
11
import javax.swing.JOptionPane;
12
import javax.swing.event.AncestorEvent;
13
import javax.swing.event.AncestorListener;
14
import javax.swing.event.ChangeEvent;
15
import javax.swing.filechooser.FileFilter;
16
import org.apache.commons.lang3.ArrayUtils;
17

    
18
import org.cresques.cts.IProjection;
19
import org.gvsig.andami.PluginsLocator;
20
import org.gvsig.andami.PluginsManager;
21
import org.slf4j.Logger;
22
import org.slf4j.LoggerFactory;
23

    
24
//import org.gvsig.andami.Launcher;
25
import org.gvsig.app.ApplicationLocator;
26
import org.gvsig.app.ApplicationManager;
27
import org.gvsig.app.gui.WizardPanel;
28
import org.gvsig.app.prepareAction.PrepareContext;
29
import org.gvsig.app.prepareAction.PrepareContextView_v1;
30
import org.gvsig.app.project.documents.view.toc.actions.LayerErrorsPanel;
31
import org.gvsig.fmap.dal.DALLocator;
32
import org.gvsig.fmap.dal.DataManager;
33
import org.gvsig.fmap.dal.DataStore;
34
import org.gvsig.fmap.dal.DataStoreParameters;
35
import org.gvsig.fmap.dal.DataStoreProviderFactory;
36
import org.gvsig.fmap.dal.DataTypes;
37
import org.gvsig.fmap.dal.exception.DataException;
38
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemFileFilter;
39
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
40
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
41
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
42
import org.gvsig.fmap.mapcontext.MapContext;
43
import org.gvsig.fmap.mapcontext.MapContextLocator;
44
import org.gvsig.fmap.mapcontext.MapContextManager;
45
import org.gvsig.fmap.mapcontext.layers.FLayer;
46
import org.gvsig.fmap.mapcontrol.MapControl;
47
import org.gvsig.tools.ToolsLocator;
48
import org.gvsig.tools.dispose.DisposeUtils;
49
import org.gvsig.tools.dynobject.DynField;
50
import org.gvsig.tools.dynobject.DynObject;
51
import org.gvsig.tools.folders.FoldersManager;
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 gvSIG Team
60
 *
61
 */
62
@SuppressWarnings("UseSpecificCatch")
63
public class FilesystemExplorerWizardPanel extends WizardPanel {
64

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

    
70
    private static final Logger LOGGER = LoggerFactory.getLogger(FilesystemExplorerWizardPanel.class);
71

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

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

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

    
80
//    private static String lastPath = null;
81
    private FilesystemExplorerWizardPanelController panel = null;
82
    private boolean tabularOnly;
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
            @Override
95
            public void ancestorAdded(AncestorEvent ae) {
96
                initExplorer();
97
                initFilters();
98
                updatePanel();
99
            }
100
            @Override
101
            public void ancestorRemoved(AncestorEvent ae) {
102
                dispose();
103
            }
104
            @Override
105
            public void ancestorMoved(AncestorEvent ae) {
106
            }
107
        });
108
    }
109

    
110
    protected void updatePanel() {
111
        this.panel.setExplorer(this.explorer);
112
        this.panel.setFilters(this.filters);
113
    }
114

    
115
    @Override
116
    public void initWizard() {
117
        I18nManager i18nManager = ToolsLocator.getI18nManager();
118
        setTabName(i18nManager.getTranslation("Fichero"));
119
        initExplorer();
120
        initFilters();
121
        initUI();
122
    }
123

    
124
    private void initUI() {
125

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

    
132
        panel = new FilesystemExplorerWizardPanelController(getMapContext(),explorer, filters);
133
        panel.setTabularOnly(this.tabularOnly);
134
        this.add(panel, gridBagConstraints);
135
        panel.addChangeListener((ChangeEvent e) -> {
136
            callStateChanged(this.areSettingsValid());
137
        });
138

    
139
    }
140

    
141
    @Override
142
    public void execute() {
143
        if (this.getMapCtrl() == null) {
144
            throw new IllegalArgumentException("MapControl need");
145
        }
146
        String layerName;
147

    
148
        for (DataStoreParameters params : this.getParameters()) {
149
            fixCRS(params);
150

    
151
            layerName = ((FilesystemStoreParameters) params).getFile().getName();
152

    
153
            this.doAddLayer(layerName, params);
154
        }
155
    }
156

    
157
    @Override
158
    public void close() {
159
        this.dispose();
160
    }
161

    
162
    /**
163
     * Dispose filters and explorer
164
     */
165
    public void dispose() {
166
        if (explorer != null) {
167
            explorer.dispose();
168
            explorer = null;
169
        }
170
        if (filters != null) {
171
            filters.clear();
172
            filters = null;
173
        }
174
        panel.dispose();
175
    }
176

    
177
    @Override
178
    public DataStoreParameters[] getParameters() {
179
        return this.panel.getParameters();
180
    }
181

    
182
    /**
183
     * @param files
184
     */
185
    public void addFiles(List<File> files) {
186
        this.panel.addFiles(files);
187
    }
188

    
189

    
190
    private void initExplorer() {
191
        if (this.explorer == null) {
192
            DataManager dm = DALLocator.getDataManager();
193
            FilesystemServerExplorerParameters param;
194
            try {
195
                FoldersManager folderManager = ToolsLocator.getFoldersManager();
196
                param = (FilesystemServerExplorerParameters) dm
197
                        .createServerExplorerParameters(FilesystemServerExplorer.NAME);
198
                param.setInitialpath(
199
                        folderManager.getLastPath(
200
                                OPEN_LAYER_FILE_CHOOSER_ID, 
201
                                folderManager.getHome()
202
                        ).getAbsolutePath()
203
                );
204
                explorer = (FilesystemServerExplorer) dm.openServerExplorer(
205
                                FilesystemServerExplorer.NAME, param);
206
            } catch (Exception e) {
207
                throw new RuntimeException(e);
208
            }
209
        }
210
    }
211

    
212
    private void initFilters() {
213
        if (this.filters == null) {
214
            int mode = FilesystemServerExplorer.MODE_ALL;
215
            this.filters = new ArrayList<>();
216
            if (this.getMapCtrl() == null) {
217
                mode = FilesystemServerExplorer.MODE_FEATURE;
218
            } else {
219
                mode = FilesystemServerExplorer.MODE_GEOMETRY
220
                        | FilesystemServerExplorer.MODE_RASTER;
221
            }
222

    
223
            I18nManager i18nManager = ToolsLocator.getI18nManager();
224

    
225
            // First filter in list will be 'All formats' filter
226
            this.filters.add(new MyFileFilter(explorer.getFilter(mode,
227
                    i18nManager.getTranslation(DEFAULT_FILTER))));
228

    
229
            @SuppressWarnings("unchecked")
230
            Iterator<FilesystemFileFilter> iter = explorer.getFilters(mode);
231
            while (iter.hasNext()) {
232
                this.filters.add(new MyFileFilter(iter.next()));
233
            }
234
        }
235
    }
236

    
237
    boolean isTiled(DataStoreParameters parameters){
238
        return this.panel.isTiled(parameters);
239
    }
240

    
241
    @Override
242
    protected void doAddLayer(final String layerName, final DataStoreParameters parameters) {
243
        final boolean b_isMapControlAvail = this.isMapControlAvailable();
244
        final MapControl mapControl = this.getMapCtrl();
245
        final MapContext mapContext = this.getMapContext();
246
        final ApplicationManager application = ApplicationLocator.getManager();
247
        final MapContextManager manager
248
                = MapContextLocator.getMapContextManager();
249

    
250
        LOGGER.info("addLayer('{}',...)", layerName);
251
        Thread task = new Thread(() -> {
252
            FLayer layer = null;
253
            FLayer preparedLayer = null;
254
            try {
255
                DataManager dataManager = DALLocator.getDataManager();
256
                DataStore dataStore = dataManager.openStore(parameters.getDataStoreName(), parameters);
257
                DataStoreProviderFactory factory = dataStore.getProviderFactory();
258
                if (factory.isTiledSupported() != DataStoreProviderFactory.NO && !factory.getClass().getSimpleName().equals("TileProviderFactory")) {
259
                    if (isTiled(parameters)) {
260
                        DynObject tileParameters = dataManager.createStoreParameters("TileCache");
261
                        
262
                        PluginsManager pluginsManager = PluginsLocator.getManager();
263
                        File rootFolder = new File(pluginsManager.getApplicationHomeFolder(),"gvsig_rcache");
264
                        
265
                        if (tileParameters.getDynClass().getDynField("rootFolder") != null) {
266
                            tileParameters.setDynValue("rootFolder", rootFolder);
267
                        }
268
                        
269
                        try {
270
                            dataStore.useCache("TileCache", tileParameters);
271
                        } catch (DataException e) {
272
                            LOGGER.warn("Can't cache the layer.", e);
273
                        }
274
                        
275
                    }
276
                }
277
                String layerName1 = dataStore.getName();
278
                layer = manager.createLayer(layerName1, dataStore);
279
                DisposeUtils.disposeQuietly(dataStore);
280
                preparedLayer
281
                        = application.prepareOpenLayer(layer,
282
                                new PrepareContextView_v1() {
283
                                    
284
                                    @Override
285
                                    public Window getOwnerWindow() {
286
                                        return null;
287
                                    }
288
                                    
289
                                    @Override
290
                                    public MapControl getMapControl() {
291
                                        return mapControl;
292
                                    }
293
                                    
294
                                    @Override
295
                                    public IProjection getViewProjection() {
296
                                        return mapContext.getProjection();
297
                                    }
298
                                    
299
                                    @Override
300
                                    public MapContext getMapContext() {
301
                                        return mapContext;
302
                                    }
303
                                    
304
                                    @Override
305
                                    public boolean isMapControlAvailable() {
306
                                        return b_isMapControlAvail;
307
                                    }
308
                                });
309
                if (preparedLayer != null) {
310
                    mapControl.addLayer(preparedLayer);
311
                }
312
            } catch (UnauthorizedException e) {
313
                I18nManager i18nManager = ToolsLocator.getI18nManager();
314
                ApplicationManager application1 = ApplicationLocator.getManager();
315
                String resource = "";
316
                if (e.getResource() instanceof FilesystemStoreParameters) {
317
                    resource = ((FilesystemStoreParameters) e.getResource()).getFile().getPath();
318
                }
319
                application1.messageDialog(i18nManager.getTranslation("_User_0_is_not_authorized_to_1_on_resource_2_3",
320
                        new String[]{
321
                            e.getIdentity().getID(),
322
                            e.getActionName(),
323
                            e.getResourceName(),
324
                            resource
325
                        }), i18nManager.getTranslation("_Unauthorized_access"), JOptionPane.WARNING_MESSAGE);
326
                LOGGER.warn("Unauthorized access to layer '" + layerName + "'.", e);
327
            } catch (Exception e) {
328
                LayerErrorsPanel panel1 = new LayerErrorsPanel(layerName, e);
329
                if (preparedLayer != null) {
330
                    panel1.setLayer(preparedLayer);
331
                } else if (layer!=null) {
332
                    panel1.setLayer(layer);
333
                }
334
                I18nManager i18nManager = ToolsLocator.getI18nManager();
335
                ToolsSwingLocator.getWindowManager().showWindow(panel1, i18nManager.getTranslation("_Problems_loading_the_layer"), WindowManager.MODE.WINDOW);
336
                LOGGER.warn("Can't load layer '" + layerName + "'.", e);
337
            } finally {
338
                if (preparedLayer != layer) {
339
                    DisposeUtils.disposeQuietly(preparedLayer);
340
                }
341
                DisposeUtils.disposeQuietly(layer);
342
            }
343
        });
344
        task.setName("LoadLayer"+layerName);
345
        task.start();
346

    
347
    }
348

    
349

    
350
    /**
351
     * @author fdiaz
352
     *
353
     */
354
    public class MyFileFilter extends FileFilter {
355

    
356
        private FilesystemFileFilter filter = null;
357

    
358
        /**
359
         * @param params
360
         */
361
        public MyFileFilter(FilesystemFileFilter params) {
362
            this.setFilter(params);
363
        }
364

    
365
        @Override
366
        public boolean accept(File f) {
367
            if (f.isDirectory()) {
368
                return true;
369
            }
370
            return getFilter().accept(f);
371

    
372
        }
373

    
374
        @Override
375
        public String getDescription() {
376
            return getFilter().getDescription();
377
        }
378

    
379
        /**
380
         * @return
381
         */
382
        public String getName() {
383
            return getFilter().getDataStoreProviderName();
384
        }
385

    
386
        /**
387
         * @return the filter
388
         */
389
        public FilesystemFileFilter getFilter() {
390
            return filter;
391
        }
392

    
393
        /**
394
         * @param filter the filter to set
395
         */
396
        public void setFilter(FilesystemFileFilter filter) {
397
            this.filter = filter;
398
        }
399
    }
400

    
401
    protected void showPropertiesDialog(DynObject parameters) {
402
        panel.showPropertiesDialog(parameters);
403
    }
404

    
405
    protected PrepareContext getPrepareDataStoreContext() {
406
        return panel.getPrepareDataStoreContext();
407
    }
408

    
409
    @Override
410
    public boolean areSettingsValid() {
411
        DataStoreParameters[] params = this.getParameters();
412
        return !ArrayUtils.isEmpty(params);
413
    }
414

    
415
}