Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.xml2db / org.gvsig.xml2db.swing / org.gvsig.xml2db.swing.impl / src / main / java / org / gvsig / xml2db / swing / impl / importxml2db / ImportXML2dbPanel.java @ 47353

History | View | Annotate | Download (10.5 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright (c) 2007-2023 gvSIG Association
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., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.xml2db.swing.impl.importxml2db;
24

    
25
import java.awt.Color;
26
import java.awt.event.ActionEvent;
27
import java.io.File;
28
import java.nio.charset.Charset;
29
import javax.swing.ImageIcon;
30
import javax.swing.JComponent;
31
import javax.swing.JOptionPane;
32
import javax.swing.SwingUtilities;
33
import javax.swing.event.ChangeEvent;
34
import org.apache.commons.lang3.StringUtils;
35
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
36
import org.gvsig.fmap.dal.swing.DALSwingLocator;
37
import org.gvsig.fmap.dal.swing.DataSwingManager;
38
import org.gvsig.tools.ToolsLibrary;
39
import org.gvsig.tools.ToolsLocator;
40
import org.gvsig.tools.i18n.I18nManager;
41
import org.gvsig.tools.swing.api.ToolsSwingLocator;
42
import org.gvsig.tools.swing.api.ToolsSwingManager;
43
import org.gvsig.tools.swing.api.ToolsSwingUtils;
44
import org.gvsig.tools.swing.api.pickercontroller.CharsetPickerController;
45
import org.gvsig.tools.swing.api.pickercontroller.FilePickerController;
46
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
47
import org.gvsig.tools.swing.api.task.TaskStatusController;
48
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
49
import org.gvsig.tools.swing.api.windowmanager.Dialog;
50
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
51
import org.gvsig.tools.task.SimpleTaskStatus;
52
import org.gvsig.xml2db.lib.api.Xml2dbLocator;
53
import org.gvsig.xml2db.lib.api.Xml2dbManager;
54
import org.gvsig.xml2db.swing.Xml2dbPanel;
55
import org.gvsig.xml2db.swing.impl.Xml2dbSwingCommons;
56
import org.gvsig.xml2db.swing.impl.createdbfromxml.CreatedbFromXmlPanel;
57
import org.gvsig.xml2db.swing.impl.Task;
58
import org.slf4j.Logger;
59
import org.slf4j.LoggerFactory;
60

    
61
/**
62
 *
63
 * @author jjdelcerro
64
 */
65
public class ImportXML2dbPanel 
66
        extends ImportXML2dbPanelView
67
        implements Xml2dbPanel
68
    {
69
    protected static final Logger LOGGER = LoggerFactory.getLogger(CreatedbFromXmlPanel.class);
70

    
71

    
72
    private Dialog dialog;
73
    private FilePickerController pickerXMLFile;
74
    private PickerController<JDBCServerExplorerParameters> pickerConnection;
75
    private TaskStatusController taskStatusController;
76
    private Task lastTask;
77
    private CharsetPickerController pickerCharset;
78
   
79
    public ImportXML2dbPanel() {
80
        this.createComponents();
81
    }
82
    
83
    private void createComponents() {    
84
        this.lastTask = Task.FAKE_TASK;
85
        this.initComponents();
86
    }
87
    
88
    private void initComponents() {
89
    
90
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
91
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
92
        
93
        this.taskStatusController = ToolsSwingLocator.getTaskStatusSwingManager().createTaskStatusController(
94
                lblStatusCaption, 
95
                lblStatusMsg,
96
                pbStatus
97
        );
98
        this.taskStatusController.setVisible(false);
99

    
100
        this.translate();
101
        
102
        this.pickerXMLFile = toolsSwingManager.createFilePickerController(
103
                this.txtXMLFile, 
104
                this.btnXMLFile,
105
                null,
106
                "Xml2db_xmlFile",
107
                null,
108
                true
109

    
110
        );
111
        this.pickerXMLFile.addChangeListener((ChangeEvent e) -> {
112
            updateStateComponents();
113
        });
114
        
115
        this.pickerCharset = toolsSwingManager.createCharsetPickerController(
116
                null,
117
                this.cboCharset
118
        );
119
        this.pickerCharset.set(null);        
120

    
121
        this.btnDetectCharset.addActionListener((ActionEvent e) -> {
122
            doDetectCharset();
123
        });
124
        
125
        this.pickerConnection = dataSwingManager.createJDBCConnectionPickerController(
126
                this.cboConnection, 
127
                this.btnConnection
128
        );
129
        this.pickerConnection.addChangeListener((ChangeEvent e) -> {
130
            updateStateComponents();
131
        });
132
        this.chkConnectToRepository.setSelected(true);
133
        
134
        ToolsSwingUtils.ensureRowsCols(this, 8, 80, 10, 100);
135
    }
136
    
137
    private void translate() {
138
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
139
        
140
        toolsSwingManager.translate(lblDatabase);
141
        toolsSwingManager.translate(lblFileXML);
142
        toolsSwingManager.translate(lblCharset);
143
        toolsSwingManager.translate(lblConnectToRepository);
144
        toolsSwingManager.translate(btnDetectCharset);
145
    }
146
    
147
    private void updateStateComponents() {
148
        if( !SwingUtilities.isEventDispatchThread() ) {
149
            SwingUtilities.invokeLater(this::updateStateComponents);
150
            return;
151
        }
152
        message(null);
153
        if( this.isProcessing() ) {
154
            this.pickerXMLFile.setEnabled(false);
155
            this.pickerCharset.setEnabled(false);
156
            this.pickerConnection.setEnabled(false);
157
            this.btnDetectCharset.setEnabled(false);
158
            if( this.dialog!=null ) {
159
                this.dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK, false);
160
            }
161
            return;
162
        }
163
        this.pickerXMLFile.setEnabled(true);
164
        this.pickerCharset.setEnabled(true);
165
        this.pickerConnection.setEnabled(true);
166
        I18nManager i18n = ToolsLocator.getI18nManager();
167
        File xmlfile = this.pickerXMLFile.get();
168
        if( xmlfile == null || !xmlfile.exists() ) {
169
            this.btnDetectCharset.setEnabled(false);
170
            if( xmlfile==null ) {
171
                this.message(i18n.getTranslation("_XML_file_is_required"), JOptionPane.WARNING_MESSAGE);
172
            } else {
173
                this.message(i18n.getTranslation("_XML_file_not_exists"), JOptionPane.WARNING_MESSAGE);
174
            }
175
            if( this.dialog!=null ) {
176
                this.dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK, false);
177
            }
178
            return;
179
        }
180
        this.btnDetectCharset.setEnabled(true);
181
        JDBCServerExplorerParameters conn = this.pickerConnection.get();
182
        if( conn==null ) {
183
            this.message(i18n.getTranslation("_A_database_connection_is_required"), JOptionPane.WARNING_MESSAGE);
184
            if( this.dialog!=null ) {
185
                this.dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK, false);
186
            }
187
            return;
188
        }
189
        if( this.dialog!=null ) {
190
            this.dialog.setButtonEnabled(WindowManager_v2.BUTTON_OK, true);        
191
        }
192
        this.taskStatusController.setVisible(this.lastTask.needToShowTheStatus());        
193
    }
194

    
195
    @Override
196
    public void setDialog(Dialog dialog) {
197
        this.dialog = dialog;
198
    }
199

    
200
    @Override
201
    public JComponent asJComponent() {
202
        return this;
203
    }
204
    
205
    @Override
206
    public void performAction() {
207
        doImportXML();
208
    }
209

    
210
    private void doImportXML() {
211
        Xml2dbManager manager = Xml2dbLocator.getXml2dbManager();
212
        File xmlfile = this.pickerXMLFile.get();
213
        if( xmlfile == null || !xmlfile.exists() ) {
214
            return;
215
        }
216
        JDBCServerExplorerParameters dbparams = this.pickerConnection.get();
217
        if( dbparams==null ) {
218
            return;
219
        }
220
        Charset charset = this.pickerCharset.get();
221
        boolean connectToRepository = this.chkConnectToRepository.isSelected();
222
        I18nManager i18n = ToolsLocator.getI18nManager();
223
        
224
        this.lastTask = new Task(                
225
                "Xml2db_copyXmml2Db", 
226
                i18n.getTranslation("_Copying_XML_data"),
227
                this::updateStateComponents, 
228
                taskStatusController
229
            ) {
230
            @Override
231
            protected void task(SimpleTaskStatus taskStatus) throws Throwable{
232
                try {
233
                    manager.copyXml2Db(xmlfile, charset, dbparams, taskStatus);
234
                    if( connectToRepository) {
235
                        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
236
                        dataSwingManager.connectToDatabaseWorkspace(dbparams);                        
237
                    }
238
                    taskStatus.terminate();
239
                } catch(Exception ex) {
240
                    LOGGER.warn("Can't import xml",ex);
241
                    I18nManager i18n = ToolsLocator.getI18nManager();
242
                    ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
243
                    dialogs.messageDialog(
244
                            i18n.getTranslation("_Problems_processing_XML_file")
245
                                    +"\n\n"
246
                                    + ex.getLocalizedMessage(), 
247
                            i18n.getTranslation("_Xml2db_Import_xml_data_to_a_existing_database"), 
248
                            JOptionPane.WARNING_MESSAGE
249
                    );
250
                    throw ex;
251
                }
252
            }
253
        };
254
        this.lastTask.start();
255
    }
256
    
257
    private void message(String msg) {
258
        message(msg,JOptionPane.INFORMATION_MESSAGE);
259
    }
260
    
261
    private void message(String msg, int type) {
262
        if( StringUtils.isBlank(msg) ) {
263
            this.lblStatusMsg.setText("");
264
            return;
265
        }
266
        if( type == JOptionPane.WARNING_MESSAGE ) {
267
            msg = Xml2dbSwingCommons.getHTMLColorTag(Color.RED.darker(), msg);
268
        }        
269
        this.lblStatusMsg.setText(msg);
270
        this.lblStatusMsg.setVisible(true);
271
    }
272

    
273
    private boolean isProcessing() {
274
        return this.lastTask.isProcessing();
275
    }
276

    
277
    @Override
278
    public ImageIcon loadImage(String imageName) {
279
        return ToolsSwingUtils.loadImage(this, imageName);
280
    }
281
    
282
    private void doDetectCharset() {
283
        Xml2dbManager manager = Xml2dbLocator.getXml2dbManager();
284
        this.pickerCharset.set(manager.detectCharset(this.pickerXMLFile.get()));
285
    }
286
}