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

History | View | Annotate | Download (16.5 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
import org.gvsig.fmap.dal.DataStoreParameters;
59

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

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

    
72
    private static final long serialVersionUID = 6269512983586358017L;
73

    
74
    private static class TableItem {
75

    
76
        private JDBCStoreParameters params;
77
        private String label;
78

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
206

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

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

    
218
    @Override
219
    public void previousPanel() {
220

    
221
    }
222

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

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

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

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

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

    
338
    private void fillTablesList() {
339

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

    
350
    private class FillTablesListTask extends AbstractMonitorableTask {
351

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

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

    
361
        @Override
362
        public void run() {
363

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

    
372
                DataManager dataManager = DALLocator.getDataManager();
373

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

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

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

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

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

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

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

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

    
443
        }
444

    
445
    }
446

    
447
}