Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.exportto / org.gvsig.exportto.swing / org.gvsig.exportto.swing.prov / org.gvsig.exportto.swing.prov.jdbc / src / main / java / org / gvsig / export / jdbc / swing / panels / SelectTableNamePanel.java @ 44198

History | View | Annotate | Download (16.4 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or modify it under
7
 * the terms of the GNU General Public License as published by the Free Software
8
 * Foundation; either version 3 of the License, or (at your option) any later
9
 * version.
10
 *
11
 * This program is distributed in the hope that it will be useful, but WITHOUT
12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14
 * details.
15
 *
16
 * You should have received a copy of the GNU General Public License along with
17
 * this program; if not, write to the Free Software Foundation, Inc., 51
18
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us at info AT
21
 * gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.export.jdbc.swing.panels;
24

    
25
import java.awt.event.ActionEvent;
26
import java.awt.event.ActionListener;
27
import java.util.Iterator;
28
import java.util.List;
29

    
30
import javax.swing.DefaultListModel;
31
import javax.swing.JComponent;
32
import javax.swing.JOptionPane;
33
import javax.swing.ListModel;
34
import javax.swing.SwingUtilities;
35
import javax.swing.event.AncestorEvent;
36
import javax.swing.event.AncestorListener;
37
import org.apache.commons.lang3.StringUtils;
38
import org.gvsig.export.jdbc.service.ExportJDBCParameters;
39
//import org.gvsig.app.ApplicationLocator;
40
//import org.gvsig.app.ApplicationManager;
41
import org.gvsig.fmap.dal.DALLocator;
42
import org.gvsig.fmap.dal.DataManager;
43
import org.gvsig.fmap.dal.SQLBuilder;
44
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorer;
45
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
46
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
47
import org.gvsig.tools.ToolsLocator;
48
import org.gvsig.tools.i18n.I18nManager;
49
import org.gvsig.tools.swing.api.ToolsSwingLocator;
50
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
51
import org.gvsig.tools.task.AbstractMonitorableTask;
52
import org.gvsig.tools.task.SimpleTaskStatus;
53
import org.slf4j.Logger;
54
import org.slf4j.LoggerFactory;
55
import org.gvsig.export.swing.JExportProcessPanel;
56
import org.gvsig.export.swing.spi.ExportPanel;
57
import org.gvsig.export.swing.spi.ExportPanelValidationException;
58

    
59
/**
60
 * @author gvSIG Team
61
 * @version $Id$
62
 *
63
 */
64
public class SelectTableNamePanel 
65
        extends SelectTableNamePanelLayout 
66
        implements ExportPanel 
67
    {
68

    
69
    private static final Logger logger = LoggerFactory.getLogger(SelectTableNamePanel.class);
70

    
71
    private static final long serialVersionUID = 6269512983586358017L;
72

    
73
    private static class TableItem {
74

    
75
        private JDBCStoreParameters params;
76
        private String label;
77

    
78
        public TableItem(String label, JDBCStoreParameters params) {
79
            this.params = params;
80
            this.label = label;
81
        }
82

    
83
        public TableItem(JDBCStoreParameters params) {
84
            this( StringUtils.isEmpty(params.getSchema())? 
85
                params.getTable() : params.getSchema() + "." + params.getTable(), 
86
                params);
87
        }
88

    
89
        @Override
90
        public String toString() {
91
            return this.label;
92
        }
93

    
94
        public JDBCStoreParameters getParams() {
95
            return this.params;
96
        }
97
    }
98

    
99
    private FillTablesListTask task = null;
100
    private SQLBuilder sqlbuilder;
101
    private final ExportJDBCParameters parameters;
102
    private final JExportProcessPanel processPanel;
103

    
104
    @SuppressWarnings("OverridableMethodCallInConstructor")
105
    public SelectTableNamePanel(
106
            JExportProcessPanel processPanel, 
107
            ExportJDBCParameters parameters
108
        ) {
109
        this.processPanel = processPanel;
110
        this.parameters = parameters;
111
        initComponents();
112
        this.addAncestorListener(new AncestorListener() {
113

    
114
            @Override
115
            public void ancestorAdded(AncestorEvent ae) {
116
            }
117

    
118
            @Override
119
            public void ancestorRemoved(AncestorEvent ae) {
120
                cancelTask();
121
            }
122

    
123
            @Override
124
            public void ancestorMoved(AncestorEvent ae) {
125
            }
126
        });
127
    }
128

    
129
    private void initComponents() {
130
        this.rdoCreateTable.addActionListener(new ActionListener() {
131
            @Override
132
            public void actionPerformed(ActionEvent e) {
133
                onChangeRadioSelecion();
134
            }
135
        });
136
        this.rdoInsert.addActionListener(new ActionListener() {
137
            @Override
138
            public void actionPerformed(ActionEvent e) {
139
                onChangeRadioSelecion();
140
            }
141
        });
142
        this.rdoCreateTable.setSelected(true);
143
        this.rdoInsert.setEnabled(false);
144
        this.lstTables.setEnabled(false);
145
        try {
146
            this.txtTableName.setText(this.parameters.getSourceFeatureStore().getName());
147
        } catch (Exception ex) {
148
            logger.warn("Can't set the default value for the table name", ex);
149
        }
150

    
151
        I18nManager i18nManager = ToolsLocator.getI18nManager();
152
        this.lblHeader.setText(i18nManager.getTranslation("_Indique_donde_desea_insertar_los_datos"));
153
        this.lblWarningUseExistingTable.setText(
154
                "<html>\n"
155
                + i18nManager.getTranslation("_Los_datos_se_insertaran_usando_los_nombres_de_columna_que_coincidan_con_la_tabla_origen_dejandose_al_valor_por_defecto_para_los_que_no_haya_valores_en_la_tabla_origen")
156
                + "\n</html>"
157
        );
158
        this.rdoInsert.setText(i18nManager.getTranslation("_Insertar_registros_en_una_tabla_existente"));
159
        this.lblSelectTableName.setText(i18nManager.getTranslation("_Seleccione_la_tabla_a_usar"));
160
        this.rdoCreateTable.setText(i18nManager.getTranslation("_Crear_una_tabla_nueva"));
161
        this.lblSchema.setText(i18nManager.getTranslation("_Indique_el_esquema_en_el_que_desea_crear_la_tabla"));
162
        this.lblTableName.setText(i18nManager.getTranslation("_Indique_el_nombre_de_la_tabla"));
163
    }
164

    
165
    private void cancelTask() {
166
        if (task != null) {
167
            task.cancelRequest();
168
            task.getSimpleTaskStatus().remove();
169
            task = null;
170
        }
171
    }
172

    
173
    public boolean canCreateTable() {
174
        return this.rdoCreateTable.isSelected();
175
    }
176

    
177
    public String getSchema() {
178
        if (this.canCreateTable()) {
179
            return StringUtils.defaultIfBlank(this.txtSchema.getText(), null);
180
        }
181
        TableItem item = (TableItem) this.lstTables.getSelectedValue();
182
        JDBCStoreParameters tableParameter = item.getParams();
183
        if (tableParameter == null) {
184
            return null;
185
        }
186
        return tableParameter.getSchema();
187
    }
188

    
189
    public String getTableName() {
190
        if (this.canCreateTable()) {
191
            return StringUtils.defaultIfBlank(this.txtTableName.getText(), null);
192
        }
193
        TableItem item = (TableItem) this.lstTables.getSelectedValue();
194
        if (item == null) {
195
            return null;
196
        }
197
        JDBCStoreParameters tableParameter = item.getParams();
198

    
199
        if (tableParameter == null) {
200
            return null;
201
        }
202
        return tableParameter.getTable();
203
    }
204

    
205

    
206
    @Override
207
    public String getIdPanel() {
208
        return this.getClass().getCanonicalName();
209
    }
210

    
211
    @Override
212
    public String getTitlePanel() {
213
        I18nManager i18nManager = ToolsLocator.getI18nManager();
214
        return i18nManager.getTranslation("_Tablename");
215
    }
216

    
217
    @Override
218
    public void previousPanel() {
219

    
220
    }
221

    
222
    @Override
223
    public void nextPanel() {
224
        this.parameters.setSchema(this.getSchema());
225
        this.parameters.setTableName(this.getTableName());
226
        this.parameters.setCanCreatetable(this.canCreateTable());
227
    }
228

    
229
    @Override
230
    public boolean validatePanel() throws ExportPanelValidationException {
231
        I18nManager i18nManager = ToolsLocator.getI18nManager();
232
        String tablename = this.getTableName();
233
        if (tablename == null) {
234
            throw new ExportPanelValidationException(
235
                    i18nManager.getTranslation(
236
                            "_The_name_of_table_cannot_be_empty"
237
                    )
238
            );
239
        }
240
        String schema = this.getSchema();
241
        if( sqlbuilder.support_schemas() ) {
242
            if (schema == null) {
243
                throw new ExportPanelValidationException(
244
                        i18nManager.getTranslation(
245
                                "_The_name_of_schema_cannot_be_empty"
246
                        )
247
                );
248
            }
249
        }
250
        if (this.rdoCreateTable.isSelected()) {
251
            String tablename_tr = tablename;
252
            if( this.parameters.getTranslateIdentifiersToLowerCase() ) {
253
                tablename_tr = tablename_tr.toLowerCase();
254
            }
255
            if( this.parameters.getTranslateHyphens()) {
256
                tablename_tr = tablename_tr.replace("-", "_");
257
                tablename_tr = tablename_tr.replace(".", "_");                
258
            }
259
            if( this.parameters.getRemoveSpacesInIdentifiers() ) {
260
                tablename_tr = StringUtils.normalizeSpace(tablename_tr).replace(" ", "_");
261
            }
262
            if( !tablename_tr.equals(tablename) ) {
263
                String msg = i18nManager.getTranslation(
264
                        "Ha_utilizado_espacios_en_blanco_o_mayusculas_en_el_nombre_de_la_tabla_Desea_que_se_corrija_de_forma_automatica"
265
                );
266
                ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
267
                int resp = dialogs.confirmDialog(
268
                        msg, 
269
                        i18nManager.getTranslation("_Warning"),
270
                        JOptionPane.YES_NO_OPTION, 
271
                        JOptionPane.WARNING_MESSAGE,
272
                        "Exportto_Table_name_with_spaces_or_mixed_case"
273
                );
274
                if( resp != JOptionPane.YES_OPTION ) {
275
                    msg = i18nManager.getTranslation(
276
                            "El_nombre_de_tabla_contiene_caracteres no_validos"
277
                    );
278
                    throw new ExportPanelValidationException(msg);
279
                }
280
                tablename = tablename_tr;
281
                this.txtTableName.setText(tablename);
282
            }
283
            ListModel model = this.lstTables.getModel();
284
            for (int i = 0; i < model.getSize(); i++) {
285
                TableItem item = (TableItem) model.getElementAt(i);
286
                if ( StringUtils.equals(schema,item.getParams().getSchema())
287
                        && StringUtils.equals(tablename,item.getParams().getTable())) {
288
                    String msg = i18nManager.getTranslation(
289
                            "_La_tabla_{0}_{1}_ya_existe_en_la_base_de_datos_Seleccione_la_opcion_de_insertar_registros_en_una_tabla_existente_para_a?adir_los_datos_a_esta_o_indique_otro_nombre",
290
                            new String[]{schema, tablename}
291
                    );
292
                    throw new ExportPanelValidationException(msg);
293
                }
294
            }
295
        }
296
        return true;
297
    }
298

    
299
    @Override
300
    public void enterPanel() {
301
        JDBCServerExplorerParameters explorerParameters = parameters.getExplorerParameters();
302
        if (explorerParameters == null) {
303
            this.processPanel.setButtonEnabled(JExportProcessPanel.BUTTON_NEXT, false);
304
            return;
305
        }
306
        this.processPanel.setButtonEnabled(JExportProcessPanel.BUTTON_NEXT, true);
307
        try {
308
            DataManager dataManager = DALLocator.getDataManager();
309
            JDBCServerExplorer explorer = (JDBCServerExplorer) dataManager.openServerExplorer(
310
                explorerParameters.getExplorerName(),
311
                explorerParameters
312
            );
313
            this.sqlbuilder = explorer.createSQLBuilder();
314
        } catch (Exception ex) {
315
            throw new RuntimeException("Can't retrieve the sqlbuilder", ex);
316
        }
317
        this.fillTablesList();
318
    }
319

    
320
    @Override
321
    public JComponent asJComponent() {
322
        return this;
323
    }
324

    
325
    public void onChangeRadioSelecion() {
326
        if (this.rdoCreateTable.isSelected()) {
327
            this.txtSchema.setEnabled(true);
328
            this.txtTableName.setEnabled(true);
329
            this.lstTables.setEnabled(false);
330
        } else {
331
            this.txtSchema.setEnabled(false);
332
            this.txtTableName.setEnabled(false);
333
            this.lstTables.setEnabled(true);
334
        }
335
    }
336

    
337
    private void fillTablesList() {
338

    
339
        JDBCServerExplorerParameters explorerParameters = this.parameters.getExplorerParameters();
340
        if (explorerParameters == null) {
341
            return;
342
        }
343
        cancelTask();
344
        this.task = new FillTablesListTask();
345
        task.setDaemon(true);
346
        task.start();
347
    }
348

    
349
    private class FillTablesListTask extends AbstractMonitorableTask {
350

    
351
        public FillTablesListTask() {
352
            super("Export");
353
        }
354

    
355
        @Override
356
        protected SimpleTaskStatus getSimpleTaskStatus() {
357
            return (SimpleTaskStatus) this.getTaskStatus();
358
        }
359

    
360
        @Override
361
        public void run() {
362

    
363
            JDBCServerExplorerParameters explorerParameters = parameters.getExplorerParameters();
364
            if (parameters.getExplorerParameters() == null) {
365
                return;
366
            }
367
            final SimpleTaskStatus status = this.getSimpleTaskStatus();
368
            try {
369
                status.setAutoremove(true);
370

    
371
                DataManager dataManager = DALLocator.getDataManager();
372

    
373
                this.getSimpleTaskStatus().message("Connecting server");
374
                explorerParameters.setShowInformationDBTables(false);
375
                final JDBCServerExplorer explorer = (JDBCServerExplorer) dataManager.openServerExplorer(
376
                        explorerParameters.getExplorerName(),
377
                        explorerParameters
378
                );
379
                SwingUtilities.invokeAndWait(new Runnable() {
380

    
381
                    @Override
382
                    public void run() {
383
                        if( sqlbuilder.support_schemas() ) {
384
                            txtSchema.setText(sqlbuilder.default_schema());
385
                        } else {
386
                            txtSchema.setText("");
387
                            txtSchema.setEnabled(false);
388
                        }
389
                    }
390
                });
391

    
392
                this.getSimpleTaskStatus().message("Retrieving tables");
393
                final List<JDBCStoreParameters> tables = explorer.list();
394

    
395
                this.getSimpleTaskStatus().message("Add tables");
396

    
397
                SwingUtilities.invokeAndWait(new Runnable() {
398
                    @Override
399
                    public void run() {
400
                        DefaultListModel lmodel = new DefaultListModel();
401
                        Iterator<JDBCStoreParameters> it = tables.iterator();
402
                        while (it.hasNext()) {
403
                            if (status.isCancelled()) {
404
                                status.cancel();
405
                                break;
406
                            }
407
                            JDBCStoreParameters table = it.next();
408
                            lmodel.addElement(new TableItem(table));
409
                        }
410
                        lstTables.setModel(lmodel);
411
                        //lstTables.setEnabled(true);
412
                        rdoInsert.setEnabled(true);
413
                    }
414
                });
415

    
416
                status.message("finish");
417
                status.terminate();
418

    
419
            } catch (final Exception ex) {
420
                logger.warn("Fail to fill tables list", ex);
421
                if (status.isCancellationRequested()) {
422
                    status.cancel();
423
                }
424
                if (status.isRunning()) {                                
425
                    I18nManager i18nManager = ToolsLocator.getI18nManager();
426
                    ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
427
                    dialogs.messageDialog(
428
                            i18nManager.getTranslation("_There_have_been_problems_filling_data_in_panel")
429
                                + " (" + getTitlePanel() + ")",
430
                            null, 
431
                            i18nManager.getTranslation("_Warning"),
432
                            JOptionPane.WARNING_MESSAGE, 
433
                            "ProblemsFillingTableNamePanel"
434
                    );
435
                }
436

    
437
            } finally {
438
                status.terminate();
439
                status.remove();
440
            }
441

    
442
        }
443

    
444
    }
445

    
446
}