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 @ 43891

History | View | Annotate | Download (15.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.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.prepareAction.PrepareContext;
28
import org.gvsig.app.prepareAction.PrepareContextView_v1;
29
import org.gvsig.app.project.documents.view.toc.actions.LayerErrorsPanel;
30
import org.gvsig.fmap.dal.DALLocator;
31
import org.gvsig.fmap.dal.DataManager;
32
import org.gvsig.fmap.dal.DataStore;
33
import org.gvsig.fmap.dal.DataStoreParameters;
34
import org.gvsig.fmap.dal.DataStoreProviderFactory;
35
import org.gvsig.fmap.dal.DataTypes;
36
import org.gvsig.fmap.dal.exception.DataException;
37
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemFileFilter;
38
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
39
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
40
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
41
import org.gvsig.fmap.mapcontext.MapContext;
42
import org.gvsig.fmap.mapcontext.MapContextLocator;
43
import org.gvsig.fmap.mapcontext.MapContextManager;
44
import org.gvsig.fmap.mapcontext.MapContextManager.CreateLayerParameters;
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.i18n.I18nManager;
52
import org.gvsig.tools.identitymanagement.UnauthorizedException;
53
import org.gvsig.tools.swing.api.ToolsSwingLocator;
54
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
55

    
56

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

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

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

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

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

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

    
78
    private static String lastPath = null;
79
    private FilesystemExplorerWizardPanelController panel = null;
80
    private boolean tabularOnly;
81
    
82
    /**
83
     *
84
     */
85
    public FilesystemExplorerWizardPanel() {
86
        this(false);
87
    }
88

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

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

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

    
126
    private void initUI() {
127

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

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

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

    
145
    }
146

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

    
154
        for (CreateLayerParameters layerParams : this.getLoadLayerParameters()) {
155
            IProjection proj = this.getMapCtrl().getProjection();
156

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

    
183
            layerName = ((FilesystemStoreParameters) params).getFile().getName();
184

    
185
            this.doAddLayer(layerName, layerParams);
186
        }
187
    }
188

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

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

    
209
    @Override
210
    public DataStoreParameters[] getParameters() {
211
        // TODO: Habria que ver si podemos eliminar este metodo.
212
        CreateLayerParameters[] layerParameters = this.panel.getCreateLayerParameters();
213
        DataStoreParameters[] dataParameters = new DataStoreParameters[layerParameters.length];
214
        for (int i = 0; i < dataParameters.length; i++) {
215
            DataStoreParameters dataParameter = layerParameters[i].getDataParameters();
216
        }
217
        return dataParameters;
218
    }
219
    
220
    public CreateLayerParameters[] getLoadLayerParameters() {
221
        return this.panel.getCreateLayerParameters();
222
    }
223

    
224
    /**
225
     * @param files
226
     */
227
    public void addFiles(List<File> files) {
228
        this.panel.addFiles(files);
229
    }
230

    
231

    
232
    private void initExplorer() {
233
        if (this.explorer == null) {
234
            DataManager dm = DALLocator.getDataManager();
235
            FilesystemServerExplorerParameters param;
236
            try {
237
                param = (FilesystemServerExplorerParameters) dm
238
                        .createServerExplorerParameters(FilesystemServerExplorer.NAME);
239
                param.setInitialpath(lastPath);
240
                explorer = (FilesystemServerExplorer) dm.openServerExplorer(
241
                                FilesystemServerExplorer.NAME, param);
242
            } catch (Exception e) {
243
                throw new RuntimeException(e);
244
            }
245
        }
246
    }
247

    
248
    private void initFilters() {
249
        if (this.filters == null) {
250
            int mode = FilesystemServerExplorer.MODE_ALL;
251
            this.filters = new ArrayList<>();
252
            if (this.getMapCtrl() == null) {
253
                mode = FilesystemServerExplorer.MODE_FEATURE;
254
            } else {
255
                mode = FilesystemServerExplorer.MODE_GEOMETRY
256
                        | FilesystemServerExplorer.MODE_RASTER;
257
            }
258

    
259
            I18nManager i18nManager = ToolsLocator.getI18nManager();
260

    
261
            // First filter in list will be 'All formats' filter
262
            this.filters.add(new MyFileFilter(explorer.getFilter(mode,
263
                    i18nManager.getTranslation(DEFAULT_FILTER))));
264

    
265
            @SuppressWarnings("unchecked")
266
            Iterator<FilesystemFileFilter> iter = explorer.getFilters(mode);
267
            while (iter.hasNext()) {
268
                this.filters.add(new MyFileFilter(iter.next()));
269
            }
270
        }
271
    }
272

    
273
    @Override
274
    protected void doAddLayer(final String layerName, final CreateLayerParameters layerParameters) {
275
        final boolean b_isMapControlAvail = this.isMapControlAvailable();
276
        final MapControl mapControl = this.getMapCtrl();
277
        final MapContext mapContext = this.getMapContext();
278
        final ApplicationManager application = ApplicationLocator.getManager();
279
        final MapContextManager manager = MapContextLocator.getMapContextManager();
280
        final DataStoreParameters parameters = layerParameters.getDataParameters();
281
        
282
        logger.info("addLayer('{}',...)", layerName);
283
        Thread task = new Thread(new Runnable() {
284

    
285
            @Override
286
            public void run() {
287
                FLayer layer = null;
288
                FLayer preparedLayer = null;
289
                try {
290
                    DataManager dataManager = DALLocator.getDataManager();
291
                    DataStore dataStore = dataManager.openStore(parameters.getDataStoreName(), parameters);
292
                    String layerName = dataStore.getName();
293
                    layer = manager.createLayer(
294
                            layerName, 
295
                            dataStore, 
296
                            layerParameters
297
                    );
298
                    DisposeUtils.disposeQuietly(dataStore);
299
                    preparedLayer
300
                            = application.prepareOpenLayer(layer,
301
                                    new PrepareContextView_v1() {
302

    
303
                                        @Override
304
                                        public Window getOwnerWindow() {
305
                                            return null;
306
                                        }
307

    
308
                                        @Override
309
                                        public MapControl getMapControl() {
310
                                            return mapControl;
311
                                        }
312

    
313
                                        @Override
314
                                        public IProjection getViewProjection() {
315
                                            return mapContext.getProjection();
316
                                        }
317

    
318
                                        @Override
319
                                        public MapContext getMapContext() {
320
                                            return mapContext;
321
                                        }
322

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

    
351
                } catch (Exception e) {
352
                    LayerErrorsPanel panel = new LayerErrorsPanel(layerName, e);
353
                    if (preparedLayer != null) {
354
                        panel.setLayer(preparedLayer);
355
                    } else if(layer!=null){
356
                        panel.setLayer(layer);
357
                    }
358
                    I18nManager i18nManager = ToolsLocator.getI18nManager();
359
                    ToolsSwingLocator.getWindowManager().showWindow(
360
                        panel,
361
                        i18nManager.getTranslation("_Problems_loading_the_layer"),
362
                        WindowManager.MODE.WINDOW
363
                    );
364
                    logger.warn("Can't load layer '" + layerName + "'.", e);
365

    
366
                } finally {
367
                    if (preparedLayer != layer) {
368
                        DisposeUtils.disposeQuietly(preparedLayer);
369
                    }
370
                    DisposeUtils.disposeQuietly(layer);
371
                }
372
            }
373
        });
374
        task.start();
375

    
376
    }
377

    
378

    
379
    /**
380
     * @author fdiaz
381
     *
382
     */
383
    public class MyFileFilter extends FileFilter {
384

    
385
        private FilesystemFileFilter filter = null;
386

    
387
        /**
388
         * @param params
389
         */
390
        public MyFileFilter(FilesystemFileFilter params) {
391
            this.setFilter(params);
392
        }
393

    
394
        @Override
395
        public boolean accept(File f) {
396
            if (f.isDirectory()) {
397
                return true;
398
            }
399
            return getFilter().accept(f);
400

    
401
        }
402

    
403
        @Override
404
        public String getDescription() {
405
            return getFilter().getDescription();
406
        }
407

    
408
        /**
409
         * @return
410
         */
411
        public String getName() {
412
            return getFilter().getDataStoreProviderName();
413
        }
414

    
415
        /**
416
         * @return the filter
417
         */
418
        public FilesystemFileFilter getFilter() {
419
            return filter;
420
        }
421

    
422
        /**
423
         * @param filter the filter to set
424
         */
425
        public void setFilter(FilesystemFileFilter filter) {
426
            this.filter = filter;
427
        }
428
    }
429

    
430
    protected void showPropertiesDialog(DynObject parameters) {
431
        panel.showPropertiesDialog(parameters);
432
    }
433

    
434
    protected PrepareContext getPrepareDataStoreContext() {
435
        return panel.getPrepareDataStoreContext();
436
    }
437

    
438

    
439
    @Override
440
    public boolean areSettingsValid() {
441
        boolean valid = super.areSettingsValid();
442
        return valid && getMapCtrl()!=null;
443
    }
444

    
445
}