Statistics
| Revision:

root / org.gvsig.wfs.app / trunk / org.gvsig.wfs.app / org.gvsig.wfs.app.mainplugin / src / main / java / org / gvsig / wfs / gui / wizards / WFSWizard.java @ 416

History | View | Annotate | Download (31.6 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 */package org.gvsig.wfs.gui.wizards;
20

    
21
import java.awt.FlowLayout;
22
import java.awt.event.KeyAdapter;
23
import java.awt.event.KeyEvent;
24
import java.awt.geom.Rectangle2D;
25
import java.io.File;
26
import java.io.FileInputStream;
27
import java.io.FileNotFoundException;
28
import java.io.IOException;
29
import java.net.MalformedURLException;
30
import java.net.URL;
31
import java.util.ArrayList;
32
import java.util.Iterator;
33
import java.util.List;
34
import java.util.Properties;
35
import java.util.prefs.Preferences;
36

    
37
import javax.swing.DefaultComboBoxModel;
38
import javax.swing.JCheckBox;
39
import javax.swing.JComboBox;
40
import javax.swing.JLabel;
41
import javax.swing.JOptionPane;
42
import javax.swing.JPanel;
43
import javax.swing.JTabbedPane;
44
import javax.swing.event.ChangeEvent;
45
import javax.swing.event.ChangeListener;
46
import org.apache.commons.io.IOUtils;
47
import org.apache.commons.lang3.BooleanUtils;
48

    
49
import org.slf4j.Logger;
50
import org.slf4j.LoggerFactory;
51
import org.gvsig.andami.PluginServices;
52
import org.gvsig.andami.PluginsLocator;
53
import org.gvsig.andami.PluginsManager;
54
import org.gvsig.andami.messages.NotificationManager;
55
import org.gvsig.andami.persistence.serverData.ServerDataPersistence;
56
import org.gvsig.app.gui.WizardPanel;
57
import org.gvsig.app.panelGroup.loaders.PanelGroupLoaderFromExtensionPoint;
58
import org.gvsig.fmap.dal.DALLocator;
59
import org.gvsig.fmap.dal.DataManager;
60
import org.gvsig.fmap.dal.DataStoreParameters;
61
import org.gvsig.fmap.dal.serverexplorer.wfs.WFSServerExplorer;
62
import org.gvsig.fmap.dal.serverexplorer.wfs.WFSServerExplorerParameters;
63
import org.gvsig.fmap.dal.store.wfs.WFSOpenStoreParameters;
64
import org.gvsig.gui.beans.Messages;
65
import org.gvsig.gui.beans.panelGroup.PanelGroupManager;
66
import org.gvsig.gui.beans.swing.JButton;
67
import org.gvsig.remoteclient.wfs.WFSProtocolHandlerFactory;
68
import org.gvsig.tools.dynobject.DynObject;
69
import org.gvsig.tools.exception.BaseException;
70
import org.gvsig.utils.swing.jcomboServer.JComboServer;
71
import org.gvsig.utils.swing.jcomboServer.ServerData;
72
import org.gvsig.wfs.WFSClientExtension;
73
import org.gvsig.wfs.gui.panels.WFSParamsPanel;
74

    
75
/**
76
 * <p>
77
 * Wizard that allows add a new WFS layer.
78
 * </p>
79
 *
80
 * @author Jorge Piera Llodr? (piera_jor@gva.es)
81
 * @author Pablo Piqueras Bartolom? (pablo.piqueras@iver.es)
82
 */
83
public class WFSWizard extends WizardPanel {
84

    
85
    private static final Logger logger = LoggerFactory.getLogger(WFSWizard.class);
86
    private static final String serversPropsFilename = "servers.properties";
87
    private PluginServices plugin = null;
88

    
89
    private int page;
90
    private boolean connected = false;
91
    private JComboServer cmbHost = null;
92
    private JButton btnConnect = null;
93
    private javax.swing.JPanel jPanel = null;
94
    private javax.swing.JLabel jLabel1 = null;
95
    private javax.swing.JLabel lblTitle = null;
96
    private javax.swing.JScrollPane jScrollPane = null;
97
    private javax.swing.JTextArea txtAbstract = null;
98
    private javax.swing.JPanel panelPage1 = null;
99
    private javax.swing.JPanel pnlName = null;
100
    private JButton btnSiguiente = null;
101
    private JButton btnAnterior = null;
102

    
103
    private JLabel serverVersionLabel = null;
104
    private JLabel serverAvailableVersionLabel = null;
105

    
106
    private JLabel cacheFeatLabel = null;
107
    private JComboBox cacheFeatCombo = null;
108

    
109
    private javax.swing.JPanel jPanel1 = null;
110
    private WFSParamsPanel wfsParamsPanel = null;
111
    private WFSWizard thisWFSPanel = null;
112
    private WFSServerExplorer explorer = null;
113

    
114
    private JCheckBox chkCaching = null;
115
    
116
    private DynObject preferences = null;
117
    
118
    private boolean refreshing = false;
119
    
120
    private final String wfs_properties_extensionpoint_name
121
            = "WFSPropertiesDialog";
122

    
123
    /**
124
     * This is the default constructor
125
     */
126
    public WFSWizard() {
127
        super();
128
        initialize();
129
    }
130

    
131
    /**
132
     * This method initializes this
133
     */
134
    private void initialize() {
135
        PluginsManager pluginsManager = PluginsLocator.getManager();
136
        this.plugin = pluginsManager.getPlugin(WFSClientExtension.class);
137
        this.preferences = this.plugin.getPluginProperties();
138

    
139
        this.refreshing = BooleanUtils.isTrue((Boolean) this.preferences.getDynValue("refresh_capabilities"));
140

    
141
        setTabName(PluginServices.getText(this, "WFS"));
142

    
143
        serverVersionLabel = new JLabel();
144
        serverVersionLabel.setBounds(30, 425, 100, 21);
145
        serverVersionLabel.setText(PluginServices.getText(this, "_Server_version") + ":");
146

    
147
        serverAvailableVersionLabel = new JLabel();
148
        serverAvailableVersionLabel.setBounds(135, 425, 90, 21);
149

    
150
        cacheFeatLabel = new JLabel();
151
        cacheFeatLabel.setBounds(30, 450, 140, 21);
152
        cacheFeatLabel.setText(PluginServices.getText(this, "_Feature_cache") + ":");
153

    
154
        cacheFeatCombo = new JComboBox();
155
        cacheFeatCombo.addItem(PluginServices.getText(this, "none"));
156
        cacheFeatCombo.setEnabled(false);
157
        cacheFeatCombo.setBounds(170, 450, 90, 21);
158

    
159
        this.setLayout(null);
160
        this.setVisible(true);
161

    
162
        this.add(getPanelPage1(), null);
163
        page = 0;
164
        this.add(getPanelPage2(), null);
165

    
166
        this.add(getBtnAnterior(), null);
167
        this.add(getBtnSiguiente(), null);
168

    
169
        this.add(serverVersionLabel, null);
170
        this.add(serverAvailableVersionLabel, null);
171
        this.add(cacheFeatLabel, null);
172
        this.add(cacheFeatCombo, null);
173

    
174
        uptateNavigatingButtons();
175

    
176
        thisWFSPanel = this;
177
    }
178

    
179
    /**
180
     * Adds the host addres to a persistent data storage.
181
     *
182
     * @param host the host of the server
183
     */
184
    private void addHost(String host) {
185
        host = host.trim();
186
        ServerDataPersistence persistence = getServerDataPersistence();
187
        persistence.addServerData(new ServerData(host, ServerData.SERVER_TYPE_WFS));
188
    }
189

    
190
    /**
191
     * Fills up the initial WCSWizard controls.
192
     */
193
    private void rellenarControles() throws Exception {
194
        String url = "(unknow)";
195
        try {
196
            url = cmbHost.getModel().getSelectedItem().toString();
197

    
198
            DataManager dataManager = DALLocator.getDataManager();
199
            
200
            // Create the server explorer parameters
201
            WFSServerExplorerParameters parameters
202
                    = (WFSServerExplorerParameters) dataManager
203
                    .createServerExplorerParameters(WFSServerExplorer.NAME);
204
            parameters.setUrl(url);
205
            parameters.setIgnoreCache(refreshing);
206
            addHost(url);
207
            
208
            // Create the server explorer
209
            explorer = (WFSServerExplorer) dataManager.openServerExplorer(
210
                    WFSServerExplorer.NAME, 
211
                    parameters
212
            );
213

    
214
            saveServerListFromComboBox();
215
            
216
            // Update the forms
217
            getLblTitle().setText(explorer.getTitle());
218
            getTxtAbstract().setText(explorer.getAbstract());
219

    
220
            List sel_ver = WFSProtocolHandlerFactory.getRequestableVersions(url,refreshing);
221

    
222
            wfsParamsPanel.getOptionsPanel().refreshVersions(sel_ver);
223

    
224
            if (sel_ver == null || sel_ver.size() == 0) {
225
                serverAvailableVersionLabel.setText("-");
226
            } else {
227
                serverAvailableVersionLabel.setText(
228
                        sel_ver.get(0).toString().trim());
229
                for (int i = 1; i < sel_ver.size(); i++) {
230
                    String txt = serverAvailableVersionLabel.getText();
231
                    txt = txt + ", " + sel_ver.get(i).toString().trim();
232
                    serverAvailableVersionLabel.setText(txt);
233
                }
234
            }
235
            serverAvailableVersionLabel.repaint();
236

    
237
            List cacheProviders = dataManager.getFeatureCacheProviders();
238
            Iterator<String> iter = cacheProviders.iterator();
239

    
240
            while (iter.hasNext()) {
241
                String featureCacheProvider = (String) iter.next();
242
                cacheFeatCombo.addItem(featureCacheProvider);
243
            }
244

    
245
            if (!explorer.getServerType().toLowerCase().startsWith("wfs 1.0")) {
246
                cacheFeatCombo.setEnabled(true);
247
            } else {
248
                cacheFeatCombo.setEnabled(false);
249
            }
250
            wfsParamsPanel.setServerExplorer(explorer);
251
            connected = true;
252
        } catch (Exception e) {
253
            logger.warn("Can't connect to '"+url+"'.",e);
254
            throw e;
255
        }
256
    }
257

    
258
    /**
259
     * Enables or disables the Next and Previous buttons according with the
260
     * current page and the enabled pages.
261
     */
262
    private void uptateNavigatingButtons() {
263
        if (page == 0) {
264
            getBtnAnterior().setEnabled(false);
265
            getBtnSiguiente().setVisible(true);
266
            getBtnSiguiente().setEnabled(false);
267
        } else {
268
            short tabIndex = (short) wfsParamsPanel.getSelectedIndex();
269

    
270
            getBtnAnterior().setEnabled(true);
271
            if (wfsParamsPanel.nextPageEnabled() == -1) {
272
                getBtnSiguiente().setEnabled(false);
273

    
274
                if (tabIndex == (wfsParamsPanel.getPanelInGUICount() - 1)) {
275
                    getBtnSiguiente().setVisible(false);
276
                }
277
            } else {
278
                getBtnSiguiente().setVisible(true);
279
                getBtnSiguiente().setEnabled(true);
280
            }
281
        }
282
    }
283

    
284
    /**
285
     * This method initializes txtHost from the persistent data storage
286
     *
287
     * @return javax.swing.JTextField
288
     */
289
    private javax.swing.JComboBox getTxtHost() {
290
        if (cmbHost == null) {
291
            cmbHost = new JComboServer();
292
            cmbHost.setModel(new DefaultComboBoxModel());
293
            cmbHost.setPreferredSize(new java.awt.Dimension(350, 20));
294
            cmbHost.setBounds(11, 26, 454, 20);
295
            cmbHost.setEditable(true);
296
            cmbHost.setServerList(getServerDataPersistence().getArrayOfServerData());
297

    
298
            // Allows that user can start the connection to the written server
299
            // pressing the 'Enter' key
300
            cmbHost.getEditor().getEditorComponent()
301
                    .addKeyListener(new KeyAdapter() {
302
                        public void keyReleased(KeyEvent e) {
303
                            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
304
                                getBtnConnect().doClick();
305
                            }
306
                        }
307
                    });
308
        }
309
        return cmbHost;
310
    }
311

    
312
    /**
313
     * Gets the list of servers that have been persisted or added in the
314
     * properties file
315
     *
316
     * @return
317
     */
318
    private ServerDataPersistence getServerDataPersistence() {
319
        ServerDataPersistence servers = (ServerDataPersistence) this.preferences.getDynValue("servers");
320

    
321
        if (servers == null || servers.isEmpty()) {
322
            if (servers == null) {
323
                servers = new ServerDataPersistence(ServerData.SERVER_TYPE_WFS);
324
                this.preferences.setDynValue("servers", servers);
325
            }
326
            //Lee los servidores del properties y los mezcla con los que hay en la persistencia
327
            Properties prop = new Properties();
328
            File propFile = new File(this.plugin.getPluginDirectory(), serversPropsFilename);
329
            FileInputStream fis = null;
330
            try {
331
                fis = new FileInputStream(propFile);
332
                prop.load(fis);
333
            } catch (FileNotFoundException e) {
334
                logger.info("Properties file '" + propFile.getAbsolutePath() + "' not found", e);
335
            } catch (IOException e) {
336
                logger.info("Error reading properties file '" + propFile.getAbsolutePath() + "'.", e);
337
            } finally {
338
                IOUtils.closeQuietly(fis);
339
            }
340

    
341
            for (int i = 0; i < prop.size(); i++) {
342
                Object value = prop.get("server[" + i + "]");
343
                servers.addServerData(new ServerData(value.toString(), ServerData.SERVER_TYPE_WFS));
344
            }
345

    
346
        }
347
        return servers;
348
    }
349

    
350
    /**
351
     * Saves the list of server reading from the <code>ComboBox</code>
352
     */
353
    private void saveServerListFromComboBox() {
354
        ServerDataPersistence persistence = getServerDataPersistence();
355
        String urlSelected = getTxtHost().getModel().getSelectedItem().toString();
356

    
357
        boolean isSelectedInModel = false;
358
        for (int i = 0; i < getTxtHost().getItemCount(); i++) {
359
            String url = getTxtHost().getItemAt(i).toString();
360
            persistence.addServerData(new ServerData(url, ServerData.SERVER_TYPE_WFS));
361
            if (url.equals(urlSelected)) {
362
                isSelectedInModel = true;
363
            }
364
        }
365
        if (!isSelectedInModel) {
366
            persistence.addServerData(new ServerData(urlSelected, ServerData.SERVER_TYPE_WFS));
367
        }
368
    }
369

    
370
    /**
371
     * This method initializes btnDetalles
372
     *
373
     * @return JButton
374
     */
375
    private JButton getBtnConnect() {
376
        if (btnConnect == null) {
377
            btnConnect = new JButton();
378
            btnConnect.setPreferredSize(new java.awt.Dimension(100, 20));
379
            btnConnect.setBounds(366, 50, 100, 20);
380
            btnConnect.setText(PluginServices.getText(this, "connect"));
381
            btnConnect.addActionListener(new java.awt.event.ActionListener() {
382

    
383
                public void actionPerformed(java.awt.event.ActionEvent e) {
384

    
385
                    /*
386
                     * Check if there is a suspicious parameter in URL
387
                     * The user should approve it
388
                     */
389
                    if (!checkServerUrl()) {
390
                        return;
391
                    }
392

    
393
                    btnConnect.setEnabled(false); // This avoids multiple
394
                    // contiguous actions
395

    
396
                    try {
397
                        rellenarControles();
398
                        wfsParamsPanel.refreshCapabilitiesInfo();
399
                        wfsParamsPanel.refreshWFSSelectFeaturePanel();
400
                        wfsParamsPanel.enableDefaultTabs(false);
401
                        btnConnect.setEnabled(true); // This avoids multiple
402
                        // contiguous actions
403

    
404
                        getBtnSiguiente().setEnabled(true);
405
                        getBtnSiguiente().requestFocus(); // Sets focus to the
406
                        // 'next' button
407
                    } catch (Exception e1) {
408

    
409
                        String msg = WFSWizard.getLastMessage(e1);
410
                        JOptionPane.showMessageDialog(
411
                                thisWFSPanel,
412
                                Messages.getText("cant_connect") + ":\n\n"
413
                                + msg,
414
                                Messages.getText("error"),
415
                                JOptionPane.ERROR_MESSAGE);
416
                        btnConnect.setEnabled(true);
417
                    }
418

    
419
                    /**
420
                     * Force panel not valid because connect button has been
421
                     * pressed
422
                     */
423
                    thisWFSPanel.callStateChanged(false);
424
                }
425

    
426
            });
427

    
428
            // If user press the 'Enter' key -> advance
429
            btnConnect.addKeyListener(new KeyAdapter() {
430

    
431
                /*
432
                 * (non-Javadoc)
433
                 *
434
                 * @see
435
                 * java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent
436
                 * )
437
                 */
438
                public void keyReleased(KeyEvent e) {
439
                    if (e.getKeyCode() == KeyEvent.VK_ENTER) {
440
                        btnConnect.doClick();
441
                    }
442
                }
443
            });
444
        }
445

    
446
        return btnConnect;
447
    }
448

    
449
    /**
450
     * This method initializes jPanel
451
     *
452
     * @return javax.swing.JPanel
453
     */
454
    private javax.swing.JPanel getJPanel() {
455
        if (jPanel == null) {
456
            jPanel = new javax.swing.JPanel();
457
            jPanel.setLayout(null);
458
            jPanel.setPreferredSize(new java.awt.Dimension(470, 130));
459
            jPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(null,
460
                    PluginServices.getText(this, "descripcion"),
461
                    javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
462
                    javax.swing.border.TitledBorder.DEFAULT_POSITION, null, null));
463
            jPanel.setBounds(2, 96, 477, 304);
464
            jPanel.add(getJScrollPane(), null);
465
            jPanel.add(getPnlName(), null);
466
        }
467

    
468
        return jPanel;
469
    }
470

    
471
    /**
472
     * This method initializes pnlName
473
     *
474
     * @return javax.swing.JPanel
475
     */
476
    private JPanel getPnlName() {
477
        if (pnlName == null) {
478
            pnlName = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 0));
479
            pnlName.setBounds(new java.awt.Rectangle(9, 19, 452, 24));
480
            pnlName.add(getJLabel1(), null);
481
            pnlName.add(getLblTitle(), null);
482
        }
483
        return pnlName;
484
    }
485

    
486
    /**
487
     * This method initializes jLabel1
488
     *
489
     * @return javax.swing.JLabel
490
     */
491
    private javax.swing.JLabel getJLabel1() {
492
        if (jLabel1 == null) {
493
            jLabel1 = new javax.swing.JLabel();
494
            jLabel1.setText(PluginServices.getText(this, "nombre") + ":");
495
            jLabel1.setBounds(15, 26, 65, 15);
496
        }
497

    
498
        return jLabel1;
499
    }
500

    
501
    /**
502
     * This method initializes lblTitle
503
     *
504
     * @return javax.swing.JLabel
505
     */
506
    private javax.swing.JLabel getLblTitle() {
507
        if (lblTitle == null) {
508
            lblTitle = new javax.swing.JLabel();
509
            lblTitle.setText("-");
510
            lblTitle.setPreferredSize(new java.awt.Dimension(350, 16));
511
            lblTitle.setBounds(82, 26, 350, 16);
512
        }
513

    
514
        return lblTitle;
515
    }
516

    
517
    /**
518
     * This method initializes jScrollPane
519
     *
520
     * @return javax.swing.JScrollPane
521
     */
522
    private javax.swing.JScrollPane getJScrollPane() {
523
        if (jScrollPane == null) {
524
            jScrollPane = new javax.swing.JScrollPane();
525
            jScrollPane.setViewportView(getTxtAbstract());
526
            jScrollPane.setPreferredSize(new java.awt.Dimension(450, 60));
527
            jScrollPane.setBounds(10, 47, 457, 247);
528
        }
529

    
530
        return jScrollPane;
531
    }
532

    
533
    /**
534
     * This method initializes txtAbstract
535
     *
536
     * @return javax.swing.JTextArea
537
     */
538
    private javax.swing.JTextArea getTxtAbstract() {
539
        if (txtAbstract == null) {
540
            txtAbstract = new javax.swing.JTextArea();
541
            txtAbstract.setWrapStyleWord(true);
542
            txtAbstract.setColumns(30);
543
            txtAbstract.setLineWrap(true);
544
        }
545

    
546
        return txtAbstract;
547
    }
548

    
549
    /**
550
     * This method initializes panelPage1
551
     *
552
     * @return javax.swing.JPanel
553
     */
554
    private javax.swing.JPanel getPanelPage1() {
555
        if (panelPage1 == null) {
556
            panelPage1 = new javax.swing.JPanel();
557
            panelPage1.setLayout(null);
558
            panelPage1.setPreferredSize(new java.awt.Dimension(480, 220));
559
            panelPage1.setVisible(true);
560
            panelPage1.setBounds(15, 5, 480, 407);
561
            panelPage1.add(getJPanel1(), null);
562
            panelPage1.add(getJPanel(), null);
563
        }
564

    
565
        return panelPage1;
566
    }
567

    
568
    /**
569
     * This method initializes panelPage2
570
     *
571
     * @return javax.swing.JPanel
572
     */
573
    private javax.swing.JPanel getPanelPage2() {
574
        if (wfsParamsPanel == null) {
575

    
576
            try {
577
                PanelGroupManager manager = PanelGroupManager.getManager();
578
                manager.registerPanelGroup(WFSParamsPanel.class);
579
                manager.setDefaultType(WFSParamsPanel.class);
580

    
581
                // Initially there is no layer
582
                wfsParamsPanel = (WFSParamsPanel) manager.getPanelGroup(null);
583
                wfsParamsPanel.setBounds(4, 9, 502, 393);
584
                wfsParamsPanel
585
                        .loadPanels(new PanelGroupLoaderFromExtensionPoint(
586
                                        wfs_properties_extensionpoint_name));
587
                wfsParamsPanel.addChangeListener(new ChangeListener() {
588

    
589
                    // This method is called whenever the selected tab changes
590
                    public void stateChanged(ChangeEvent evt) {
591
                        JTabbedPane pane = (JTabbedPane) evt.getSource();
592

    
593
                        // Update the navigation buttons
594
                        uptateNavigatingButtons();
595
                    }
596
                });
597
            } catch (BaseException bE) {
598
                NotificationManager.showMessageError(
599
                        bE.getLocalizedMessageStack(), bE);
600
            } catch (Exception e) {
601
                NotificationManager
602
                        .showMessageError(e.getLocalizedMessage(), e);
603
            }
604
        }
605

    
606
        return wfsParamsPanel;
607
    }
608

    
609
    /**
610
     * This method initializes btnSiguiente
611
     *
612
     * @return JButton
613
     */
614
    private JButton getBtnSiguiente() {
615
        if (btnSiguiente == null) {
616
            btnSiguiente = new JButton();
617
            btnSiguiente.setPreferredSize(new java.awt.Dimension(100, 30));
618
            btnSiguiente.setBounds(395, 444, 100, 20);
619
            btnSiguiente.setText(PluginServices.getText(this, "siguiente"));
620
            btnSiguiente.addActionListener(new java.awt.event.ActionListener() {
621

    
622
                public void actionPerformed(java.awt.event.ActionEvent e) {
623
                    if (page == 0) {
624
                        page = 1;
625
                        getPanelPage1().setVisible(false);
626
                        getPanelPage2().setVisible(true);
627
                    } else {
628
                        wfsParamsPanel.goToNextTab();
629
                    }
630

    
631
                    uptateNavigatingButtons();
632
                }
633
            });
634
        }
635
        return btnSiguiente;
636
    }
637

    
638
    /**
639
     * This method initializes btnAnterior
640
     *
641
     * @return JButton
642
     */
643
    private JButton getBtnAnterior() {
644
        if (btnAnterior == null) {
645
            btnAnterior = new JButton();
646
            btnAnterior.setBounds(292, 444, 100, 20);
647
            btnAnterior.setText(PluginServices.getText(this, "anterior"));
648
            btnAnterior.setPreferredSize(new java.awt.Dimension(100, 30));
649
            btnAnterior.addActionListener(new java.awt.event.ActionListener() {
650

    
651
                public void actionPerformed(java.awt.event.ActionEvent e) {
652
                    int tabIndex = wfsParamsPanel.getSelectedIndex();
653

    
654
                    if (page == 1) {
655
                        if (tabIndex == 0) {
656
                            page = 0;
657
                            connected = false;
658

    
659
                            wfsParamsPanel.enableDefaultTabs(false);
660
                            getLblTitle().setText("-");
661
                            getTxtAbstract().setText("");
662

    
663
                            getPanelPage2().setVisible(false);
664
                            getPanelPage1().setVisible(true);
665
                        } else {
666
                            wfsParamsPanel.goToPreviousTab();
667
                        }
668
                    } else {
669

    
670
                    }
671

    
672
                    uptateNavigatingButtons();
673
                }
674
            });
675
        }
676
        return btnAnterior;
677
    }
678

    
679
    /**
680
     * This method initializes jPanel1
681
     *
682
     * @return javax.swing.JPanel
683
     */
684
    private javax.swing.JPanel getJPanel1() {
685
        if (jPanel1 == null) {
686
            jPanel1 = new javax.swing.JPanel();
687
            jPanel1.setLayout(null);
688
            jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(
689
                    null, PluginServices.getText(this, "server"),
690
                    javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
691
                    javax.swing.border.TitledBorder.DEFAULT_POSITION, null, null));
692
            jPanel1.setBounds(2, 5, 477, 85);
693
            jPanel1.add(getTxtHost(), null);
694
            jPanel1.add(getBtnConnect(), null);
695
            jPanel1.add(getChkCaching(), null);
696
        }
697

    
698
        return jPanel1;
699
    }
700

    
701
    /**
702
     * Returns the wizard's data source
703
     *
704
     * @return the wizard's data source
705
     */
706
    public WFSServerExplorer getServerExplorer() {
707
        return explorer;
708
    }
709

    
710
    /**
711
     * Returns the rectangle that contains all the others
712
     *
713
     * @param rects [] rectangles with its positions and dimensions
714
     *
715
     * @return Rectangle2D the rectangle that contains all the others
716
     */
717
    public static Rectangle2D getRectangle(Rectangle2D[] rects) {
718
        Rectangle2D ret = rects[0];
719

    
720
        for (int i = 1; i < rects.length; i++) {
721
            ret.add(rects[i]);
722
        }
723

    
724
        return ret;
725
    }
726

    
727
    /**
728
     * Returns the host typed in the host text field or null if nothing is typed
729
     * or it is not a valid URL.
730
     *
731
     * @return URL del host
732
     */
733
    public URL getHost() {
734
        try {
735
            return new URL(cmbHost.getModel().getSelectedItem().toString());
736
        } catch (MalformedURLException e) {
737
            return null;
738
        }
739
    }
740

    
741
    /*
742
     * (non-Javadoc)
743
     *
744
     * @see com.iver.cit.gvsig.gui.WizardPanel#initWizard()
745
     */
746
    public void initWizard() {
747
        // setServerExplorer(new WFSWizardData());
748
    }
749

    
750
    /*
751
     * (non-Javadoc)
752
     *
753
     * @see com.iver.cit.gvsig.gui.WizardPanel#execute()
754
     */
755
    public void execute() {
756
        wfsParamsPanel.setSelectedCache(cacheFeatCombo.getSelectedItem().toString());
757
        String layerName = wfsParamsPanel.getFeaturesPanel().getLayerName();
758
        WFSOpenStoreParameters parameters;
759
        try {
760
            //
761
            // TODO: La proyeccion deberia ir en los parametros ?? !!!!!!!!!
762
            //
763
            parameters = wfsParamsPanel.getDataStoreParameters();
764

    
765
        } catch (Exception e) {
766
            logger.warn("Can't make the parameters of the wfs layer", e);
767
            JOptionPane.showMessageDialog(null,
768
                    PluginServices.getText(this, "_cant_create_wfslayer"),
769
                    "addLayer", JOptionPane.WARNING_MESSAGE
770
                    + JOptionPane.OK_OPTION);
771
            return;
772
        }
773
        doAddLayer(getMapCtrl(), layerName, parameters);
774
    }
775

    
776
    /**
777
     * This method initializes chkCaching
778
     *
779
     * @return javax.swing.JCheckBox
780
     */
781
    private JCheckBox getChkCaching() {
782
        if (chkCaching == null) {
783
            chkCaching = new JCheckBox();
784
            chkCaching.setBounds(7, 51, 349, 20);
785
            chkCaching.setText(PluginServices.getText(this,
786
                    "refresh_capabilities"));
787
            chkCaching.setToolTipText(PluginServices.getText(this,
788
                    "refresh_capabilities_tooltip"));
789
            chkCaching.setSelected(refreshing);
790
            chkCaching.addItemListener(new java.awt.event.ItemListener() {
791

    
792
                public void itemStateChanged(java.awt.event.ItemEvent e) {
793
                    refreshing = chkCaching.isSelected();
794
                    preferences.setDynValue("refresh_capabilities", new Boolean(refreshing));
795
                }
796
            });
797
            chkCaching.addActionListener(new java.awt.event.ActionListener() {
798

    
799
                public void actionPerformed(java.awt.event.ActionEvent e) {
800
                    refreshing = chkCaching.isSelected();
801
                    preferences.setDynValue("refresh_capabilities", new Boolean(refreshing));
802
                }
803
            });
804

    
805
        }
806
        return chkCaching;
807
    }
808

    
809
    /**
810
     * This method makes the 'btnSiguiente' to be clicked
811
     */
812
    public void doClickOnNextButton() {
813
        getBtnSiguiente().doClick();
814
    }
815

    
816
    /*
817
     * (non-Javadoc)
818
     *
819
     * @see com.iver.cit.gvsig.gui.WizardPanel#getParameters()
820
     */
821
    public DataStoreParameters[] getParameters() {
822
        // TODO Auto-generated method stub
823
        return null;
824
    }
825

    
826
    @Override
827
    public void close() {
828
        if (explorer != null) {
829
            explorer.dispose();
830
        }
831
    }
832

    
833
    /**
834
     * This method is called when user changes tab in add layer dialog
835
     */
836
    public boolean areSettingsValid() {
837
        if (wfsParamsPanel != null) {
838
            return wfsParamsPanel.isCorretlyConfigured();
839
        } else {
840
            return false;
841
        }
842
    }
843

    
844
    /**
845
     * This method suggests user to remove suspicious parameters such as
846
     * "request=..."
847
     */
848
    private boolean checkServerUrl() {
849

    
850
        Object sel_obj = cmbHost.getModel().getSelectedItem();
851
        if (sel_obj != null) {
852

    
853
            String url = sel_obj.toString();
854
            List<String> suspi = getSuspiciousParameters(url);
855
            if (suspi != null && suspi.size() > 0) {
856
                if (userWantsToContinue(suspi)) {
857
                    // user says url ok anyway
858
                    return true;
859
                } else {
860
                    // user wants to fix url by hand
861
                    return false;
862
                }
863
            } else {
864
                // url is ok
865
                return true;
866
            }
867
        } else {
868
            // no selection in combo
869
            return false;
870
        }
871
    }
872

    
873
    /**
874
     * @param suspi
875
     * @return
876
     */
877
    private boolean userWantsToContinue(List<String> suspi) {
878

    
879
        String tit = PluginServices.getText(this, "server");
880
        String msg = PluginServices.getText(this, "Dangerous_parameters_found_Continue_question");
881
        int len = suspi.size();
882
        msg = msg + " '";
883
        for (int i = 0; i < (len - 1); i++) {
884
            msg = msg + suspi.get(i) + ", ";
885
        }
886
        msg = msg + suspi.get(len - 1) + "'";
887

    
888
        int user_opt = JOptionPane.showConfirmDialog(
889
                thisWFSPanel, msg, tit, JOptionPane.YES_NO_OPTION);
890

    
891
        return user_opt == JOptionPane.YES_OPTION;
892
    }
893

    
894
    /**
895
     * @param url
896
     * @return
897
     */
898
    private List<String> getSuspiciousParameters(String _url) {
899

    
900
        String str_url = _url;
901
        int len = SUSPICIOUS_PARAMS.length;
902
        String item = null;
903
        ArrayList<String> resp = new ArrayList<String>();
904
        for (int i = 0; i < len; i++) {
905
            item = SUSPICIOUS_PARAMS[i];
906
            item = "&" + item + "=";
907
            if (str_url.indexOf(item) != -1) {
908
                resp.add(SUSPICIOUS_PARAMS[i]);
909
            }
910
        }
911
        return resp;
912
    }
913

    
914
    public static String getLastMessage(Throwable ex) {
915

    
916
        Throwable p = ex;
917
        while (p.getCause() != null && p.getCause() != p) {
918
            p = p.getCause();
919
        }
920
        return p.getMessage();
921
    }
922

    
923
    private static final String[] SUSPICIOUS_PARAMS
924
            = {"request"}; // , ""};
925
}