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

History | View | Annotate | Download (15.8 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.folders.FoldersManager;
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
    public FilesystemExplorerWizardPanel() {
85
        this(false);
86
    }
87
    
88
    public FilesystemExplorerWizardPanel(boolean tabularOnly) {
89
        super();
90
        this.tabularOnly = tabularOnly;
91
        this.addAncestorListener(new AncestorListener() {
92
            public void ancestorAdded(AncestorEvent ae) {
93
                initExplorer();
94
                initFilters();
95
                updatePanel();
96
            }
97
            public void ancestorRemoved(AncestorEvent ae) {
98
                dispose();
99
            }
100
            public void ancestorMoved(AncestorEvent ae) {
101
            }
102
        });
103
    }
104

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

    
110
    @Override
111
    public void initWizard() {
112
        I18nManager i18nManager = ToolsLocator.getI18nManager();
113
        setTabName(i18nManager.getTranslation("Fichero"));
114
        initExplorer();
115
        initFilters();
116
        initUI();
117
    }
118

    
119
    private void initUI() {
120

    
121
        setLayout(new GridBagLayout());
122
        GridBagConstraints gridBagConstraints = new GridBagConstraints();
123
        gridBagConstraints.fill = GridBagConstraints.BOTH;
124
        gridBagConstraints.weightx = 1.0;
125
        gridBagConstraints.weighty = 1.0;
126

    
127
        panel = new FilesystemExplorerWizardPanelController(getMapContext(),explorer, filters);
128
        panel.setTabularOnly(this.tabularOnly);
129
        this.add(panel, gridBagConstraints);
130

    
131
    }
132

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

    
140
        for (DataStoreParameters params : this.getParameters()) {
141
            IProjection proj = this.getMapCtrl().getProjection();
142

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

    
168
            layerName = ((FilesystemStoreParameters) params).getFile().getName();
169

    
170
            this.doAddLayer(layerName, params);
171
        }
172
    }
173

    
174
    @Override
175
    public void close() {
176
        this.dispose();
177
    }
178

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

    
194
    @Override
195
    public DataStoreParameters[] getParameters() {
196
        return this.panel.getParameters();
197
    }
198

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

    
206

    
207
    private void initExplorer() {
208
        if (this.explorer == null) {
209
            DataManager dm = DALLocator.getDataManager();
210
            FilesystemServerExplorerParameters param;
211
            try {
212
                FoldersManager folderManager = ToolsLocator.getFoldersManager();
213
                param = (FilesystemServerExplorerParameters) dm
214
                        .createServerExplorerParameters(FilesystemServerExplorer.NAME);
215
                param.setInitialpath(
216
                        folderManager.getLastPath(
217
                                OPEN_LAYER_FILE_CHOOSER_ID, 
218
                                folderManager.getHome()
219
                        ).getAbsolutePath()
220
                );
221
                explorer = (FilesystemServerExplorer) dm.openServerExplorer(
222
                                FilesystemServerExplorer.NAME, param);
223
            } catch (Exception e) {
224
                throw new RuntimeException(e);
225
            }
226
        }
227
    }
228

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

    
240
            I18nManager i18nManager = ToolsLocator.getI18nManager();
241

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

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

    
254
    boolean isTiled(DataStoreParameters parameters){
255
        return this.panel.isTiled(parameters);
256
    }
257

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

    
267
        logger.info("addLayer('{}',...)", layerName);
268
        Thread task = new Thread(new Runnable() {
269

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

    
282
                            PluginsManager pluginsManager = PluginsLocator.getManager();
283
                            File rootFolder = new File(pluginsManager.getApplicationHomeFolder(),"gvsig_rcache");
284

    
285
                            if (tileParameters.getDynClass().getDynField("rootFolder") != null) {
286
                                tileParameters.setDynValue("rootFolder", rootFolder);
287
                            }
288

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

    
295
                        }
296
                    }
297

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

    
305
                                        @Override
306
                                        public Window getOwnerWindow() {
307
                                            return null;
308
                                        }
309

    
310
                                        @Override
311
                                        public MapControl getMapControl() {
312
                                            return mapControl;
313
                                        }
314

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

    
320
                                        @Override
321
                                        public MapContext getMapContext() {
322
                                            return mapContext;
323
                                        }
324

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

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

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

    
378
    }
379

    
380

    
381
    /**
382
     * @author fdiaz
383
     *
384
     */
385
    public class MyFileFilter extends FileFilter {
386

    
387
        private FilesystemFileFilter filter = null;
388

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

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

    
405
        }
406

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

    
414
        /**
415
         * @return
416
         */
417
        public String getName() {
418
            return getFilter().getDataStoreProviderName();
419
        }
420

    
421
        /**
422
         * @return the filter
423
         */
424
        public FilesystemFileFilter getFilter() {
425
            return filter;
426
        }
427

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

    
436
    protected void showPropertiesDialog(DynObject parameters) {
437
        panel.showPropertiesDialog(parameters);
438
    }
439

    
440
    protected PrepareContext getPrepareDataStoreContext() {
441
        return panel.getPrepareDataStoreContext();
442
    }
443

    
444
}