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

History | View | Annotate | Download (15.7 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
import java.util.prefs.Preferences;
11

    
12
import javax.swing.JOptionPane;
13
import javax.swing.event.AncestorEvent;
14
import javax.swing.event.AncestorListener;
15
import javax.swing.filechooser.FileFilter;
16

    
17
import org.cresques.cts.IProjection;
18
import org.gvsig.andami.PluginsLocator;
19
import org.gvsig.andami.PluginsManager;
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.layers.FLayer;
45
import org.gvsig.fmap.mapcontrol.MapControl;
46
import org.gvsig.tools.ToolsLocator;
47
import org.gvsig.tools.dispose.DisposeUtils;
48
import org.gvsig.tools.dynobject.DynField;
49
import org.gvsig.tools.dynobject.DynObject;
50
import org.gvsig.tools.i18n.I18nManager;
51
import org.gvsig.tools.identitymanagement.UnauthorizedException;
52
import org.gvsig.tools.swing.api.ToolsSwingLocator;
53
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
54

    
55

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

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

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

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

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

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

    
77
    private static String lastPath = null;
78
    private FilesystemExplorerWizardPanelController panel = null;
79
    private boolean tabularOnly;
80
    /**
81
     *
82
     */
83
    public FilesystemExplorerWizardPanel() {
84
        this(false);
85
    }
86
    
87
    public FilesystemExplorerWizardPanel(boolean tabularOnly) {
88
        super();
89
        this.tabularOnly = tabularOnly;
90
        this.addAncestorListener(new AncestorListener() {
91
            public void ancestorAdded(AncestorEvent ae) {
92
                initExplorer();
93
                initFilters();
94
                updatePanel();
95
            }
96
            public void ancestorRemoved(AncestorEvent ae) {
97
                dispose();
98
            }
99
            public void ancestorMoved(AncestorEvent ae) {
100
            }
101
        });
102
    }
103

    
104
    protected void updatePanel() {
105
        this.panel.setExplorer(this.explorer);
106
        this.panel.setFilters(this.filters);
107
    }
108

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

    
122
    private void initUI() {
123

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

    
130
        panel = new FilesystemExplorerWizardPanelController(getMapContext(),explorer, filters);
131
        panel.setTabularOnly(this.tabularOnly);
132
        this.add(panel, gridBagConstraints);
133

    
134
    }
135

    
136
    @Override
137
    public void execute() {
138
        if (this.getMapCtrl() == null) {
139
            throw new IllegalArgumentException("MapControl need");
140
        }
141
        String layerName;
142

    
143
        for (DataStoreParameters params : this.getParameters()) {
144
            IProjection proj = this.getMapCtrl().getProjection();
145

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

    
171
            layerName = ((FilesystemStoreParameters) params).getFile().getName();
172

    
173
            this.doAddLayer(layerName, params);
174
        }
175
    }
176

    
177
    @Override
178
    public void close() {
179
        this.dispose();
180
    }
181

    
182
    /**
183
     * Dispose filters and explorer
184
     */
185
    public void dispose() {
186
        if (explorer != null) {
187
            explorer.dispose();
188
            explorer = null;
189
        }
190
        if (filters != null) {
191
            filters.clear();
192
            filters = null;
193
        }
194
        panel.dispose();
195
    }
196

    
197
    @Override
198
    public DataStoreParameters[] getParameters() {
199
        return this.panel.getParameters();
200
    }
201

    
202
    /**
203
     * @param files
204
     */
205
    public void addFiles(List<File> files) {
206
        this.panel.addFiles(files);
207
    }
208

    
209

    
210
    private void initExplorer() {
211
        if (this.explorer == null) {
212
            DataManager dm = DALLocator.getDataManager();
213
            FilesystemServerExplorerParameters param;
214
            try {
215
                param = (FilesystemServerExplorerParameters) dm
216
                        .createServerExplorerParameters(FilesystemServerExplorer.NAME);
217
                param.setInitialpath(lastPath);
218
                explorer = (FilesystemServerExplorer) dm.openServerExplorer(
219
                                FilesystemServerExplorer.NAME, param);
220
            } catch (Exception e) {
221
                throw new RuntimeException(e);
222
            }
223
        }
224
    }
225

    
226
    private void initFilters() {
227
        if (this.filters == null) {
228
            int mode = FilesystemServerExplorer.MODE_ALL;
229
            this.filters = new ArrayList<MyFileFilter>();
230
            if (this.getMapCtrl() == null) {
231
                mode = FilesystemServerExplorer.MODE_FEATURE;
232
            } else {
233
                mode = FilesystemServerExplorer.MODE_GEOMETRY
234
                        | FilesystemServerExplorer.MODE_RASTER;
235
            }
236

    
237
            I18nManager i18nManager = ToolsLocator.getI18nManager();
238

    
239
            // First filter in list will be 'All formats' filter
240
            this.filters.add(new MyFileFilter(explorer.getFilter(mode,
241
                    i18nManager.getTranslation(DEFAULT_FILTER))));
242

    
243
            @SuppressWarnings("unchecked")
244
            Iterator<FilesystemFileFilter> iter = explorer.getFilters(mode);
245
            while (iter.hasNext()) {
246
                this.filters.add(new MyFileFilter(iter.next()));
247
            }
248
        }
249
    }
250

    
251
    boolean isTiled(DataStoreParameters parameters){
252
        return this.panel.isTiled(parameters);
253
    }
254

    
255
    @Override
256
    protected void doAddLayer(final String layerName, final DataStoreParameters parameters) {
257
        final boolean b_isMapControlAvail = this.isMapControlAvailable();
258
        final MapControl mapControl = this.getMapCtrl();
259
        final MapContext mapContext = this.getMapContext();
260
        final ApplicationManager application = ApplicationLocator.getManager();
261
        final MapContextManager manager
262
                = MapContextLocator.getMapContextManager();
263

    
264
        logger.info("addLayer('{}',...)", layerName);
265
        Thread task = new Thread(new Runnable() {
266

    
267
            @Override
268
            public void run() {
269
                FLayer layer = null;
270
                FLayer preparedLayer = null;
271
                try {
272
                    DataManager dataManager = DALLocator.getDataManager();
273
                    DataStore dataStore = dataManager.openStore(parameters.getDataStoreName(), parameters);
274
                    DataStoreProviderFactory factory = dataStore.getProviderFactory();
275
                    if (factory.isTiledSupported() != DataStoreProviderFactory.NO && !factory.getClass().getSimpleName().equals("TileProviderFactory")) {
276
                        if (isTiled(parameters)) {
277
                            DynObject tileParameters = dataManager.createStoreParameters("TileCache");
278

    
279
                            PluginsManager pluginsManager = PluginsLocator.getManager();
280
                            File rootFolder = new File(pluginsManager.getApplicationHomeFolder(),"gvsig_rcache");
281

    
282
                            if (tileParameters.getDynClass().getDynField("rootFolder") != null) {
283
                                tileParameters.setDynValue("rootFolder", rootFolder);
284
                            }
285

    
286
                            try {
287
                                dataStore.useCache("TileCache", tileParameters);
288
                            } catch (DataException e) {
289
                                logger.warn("Can't cache the layer.", e);
290
                            }
291

    
292
                        }
293
                    }
294

    
295
                    String layerName = dataStore.getName();
296
                    layer = manager.createLayer(layerName, dataStore);
297
                    DisposeUtils.disposeQuietly(dataStore);
298
                    preparedLayer
299
                            = application.prepareOpenLayer(layer,
300
                                    new PrepareContextView_v1() {
301

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

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

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

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

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

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

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

    
375
    }
376

    
377

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

    
384
        private FilesystemFileFilter filter = null;
385

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

    
393
        /**
394
         * @see javax.swing.filechooser.FileFilter#accept(java.io.File)
395
         */
396
        public boolean accept(File f) {
397
            if (f.isDirectory()) {
398
                return true;
399
            }
400
            return getFilter().accept(f);
401

    
402
        }
403

    
404
        /**
405
         * @see javax.swing.filechooser.FileFilter#getDescription()
406
         */
407
        public String getDescription() {
408
            return getFilter().getDescription();
409
        }
410

    
411
        /**
412
         * @return
413
         */
414
        public String getName() {
415
            return getFilter().getDataStoreProviderName();
416
        }
417

    
418
        /**
419
         * @return the filter
420
         */
421
        public FilesystemFileFilter getFilter() {
422
            return filter;
423
        }
424

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

    
433
    protected void showPropertiesDialog(DynObject parameters) {
434
        panel.showPropertiesDialog(parameters);
435
    }
436

    
437
    protected PrepareContext getPrepareDataStoreContext() {
438
        return panel.getPrepareDataStoreContext();
439
    }
440

    
441
}