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

History | View | Annotate | Download (15.5 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.slf4j.Logger;
19
import org.slf4j.LoggerFactory;
20

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

    
53

    
54
/**
55
 * @author fdiaz
56
 *
57
 */
58
public class FilesystemExplorerWizardPanel extends WizardPanel {
59

    
60
    /**
61
     *
62
     */
63
    private static final long serialVersionUID = 788115220334290212L;
64

    
65
    private static final Logger logger = LoggerFactory.getLogger(FilesystemExplorerWizardPanel.class);
66

    
67
    private static final String DEFAULT_FILTER = "All_supported";
68

    
69
    public static final String OPEN_LAYER_FILE_CHOOSER_ID =
70
        "OPEN_LAYER_FILE_CHOOSER_ID";
71

    
72
    protected FilesystemServerExplorer explorer;
73
    private ArrayList<MyFileFilter> filters;
74

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

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

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

    
120
    private void initUI() {
121

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

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

    
132
    }
133

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

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

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

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

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

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

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

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

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

    
207

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

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

    
235
            I18nManager i18nManager = ToolsLocator.getI18nManager();
236

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

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

    
249
    boolean isTiled(DataStoreParameters parameters){
250
        return this.panel.isTiled(parameters);
251
    }
252

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

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

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

    
277
                            File rootFolder = new File(Launcher.getAppHomeDir() + File.separator + "gvsig_rcache");
278

    
279
                            if (tileParameters.getDynClass().getDynField("rootFolder") != null) {
280
                                tileParameters.setDynValue("rootFolder", rootFolder);
281
                            }
282

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

    
289
                        }
290
                    }
291

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

    
299
                                        @Override
300
                                        public Window getOwnerWindow() {
301
                                            return null;
302
                                        }
303

    
304
                                        @Override
305
                                        public MapControl getMapControl() {
306
                                            return mapControl;
307
                                        }
308

    
309
                                        @Override
310
                                        public IProjection getViewProjection() {
311
                                            return mapContext.getProjection();
312
                                        }
313

    
314
                                        @Override
315
                                        public MapContext getMapContext() {
316
                                            return mapContext;
317
                                        }
318

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

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

    
362
                } finally {
363
                    if (preparedLayer != layer) {
364
                        DisposeUtils.disposeQuietly(preparedLayer);
365
                    }
366
                    DisposeUtils.disposeQuietly(layer);
367
                }
368
            }
369
        });
370
        task.start();
371

    
372
    }
373

    
374

    
375
    /**
376
     * @author fdiaz
377
     *
378
     */
379
    public class MyFileFilter extends FileFilter {
380

    
381
        private FilesystemFileFilter filter = null;
382

    
383
        /**
384
         * @param params
385
         */
386
        public MyFileFilter(FilesystemFileFilter params) {
387
            this.setFilter(params);
388
        }
389

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

    
399
        }
400

    
401
        /**
402
         * @see javax.swing.filechooser.FileFilter#getDescription()
403
         */
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
}