Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.geodb.app / org.gvsig.geodb.app.mainplugin / src / main / java / org / gvsig / geodb / AbstractWizardDB.java @ 45672

History | View | Annotate | Download (10.8 KB)

1
package org.gvsig.geodb;
2

    
3
import java.awt.BorderLayout;
4
import java.awt.Dimension;
5
import java.util.ArrayList;
6
import java.util.Collection;
7
import java.util.HashMap;
8
import java.util.List;
9
import java.util.Map;
10
import javax.swing.DefaultListModel;
11
import javax.swing.ListSelectionModel;
12
import javax.swing.event.ChangeEvent;
13
import javax.swing.event.ChangeListener;
14
import javax.swing.event.ListSelectionEvent;
15
import org.gvsig.app.gui.WizardPanel;
16
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
17
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
18
import org.gvsig.fmap.dal.DALLocator;
19
import org.gvsig.fmap.dal.DataManager;
20
import static org.gvsig.fmap.dal.DataServerExplorer.MODE_ALL;
21
import org.gvsig.fmap.dal.DataStoreParameters;
22
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
23
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
24
import org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer;
25
import static org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer.SHOW_TABLES;
26
import static org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer.SHOW_VIEWS;
27
import org.gvsig.fmap.dal.swing.DALSwingLocator;
28
import org.gvsig.fmap.dal.swing.DataSwingManager;
29
import org.gvsig.tools.ToolsLocator;
30
import org.gvsig.tools.dispose.DisposeUtils;
31
import org.gvsig.tools.i18n.I18nManager;
32
import org.gvsig.tools.swing.api.FilteredListController;
33
import org.gvsig.tools.swing.api.JListWithCheckbox;
34
import org.gvsig.tools.swing.api.ToolsSwingLocator;
35
import org.gvsig.tools.swing.api.ToolsSwingManager;
36
import org.gvsig.tools.swing.api.ToolsSwingUtils;
37
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
38
import org.slf4j.Logger;
39
import org.slf4j.LoggerFactory;
40

    
41
/**
42
 *
43
 * @author jjdelcerro
44
 */
45
@SuppressWarnings("UseSpecificCatch")
46
public abstract class AbstractWizardDB extends WizardPanel {
47

    
48
    protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractWizardDB.class);
49

    
50

    
51
    protected AbstractWizardDBView view;
52
    private PickerController<JDBCServerExplorerParameters> pickerConnection;
53
    protected JListWithCheckbox lwcTables;
54
    protected Map<String, TableInfo> tablesInfo = null;
55
    protected FilteredListController tablesFilterController;
56
    protected TableInfoController tableInfoController;
57
    
58
    
59
    public AbstractWizardDB() {
60
        initComponents();
61
    }
62

    
63
    private void initComponents() {
64
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
65
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
66
        ExpressionEvaluatorSwingManager expressionSwingManager = ExpressionEvaluatorSwingLocator.getManager();
67

    
68
        this.view = new AbstractWizardDBView();
69

    
70
        toolsSwingManager.translate(this.view.lblColumns);
71
        toolsSwingManager.translate(this.view.lblConnection);
72
        toolsSwingManager.translate(this.view.lblFilter);
73
        toolsSwingManager.translate(this.view.lblGeometryField);
74
        toolsSwingManager.translate(this.view.lblIdField);
75
        toolsSwingManager.translate(this.view.lblName);
76
        toolsSwingManager.translate(this.view.lblProjection);
77
        toolsSwingManager.translate(this.view.lblTable);
78

    
79
        toolsSwingManager.addClearButton(this.view.txtName);
80
        toolsSwingManager.setDefaultPopupMenu(this.view.txtName);
81

    
82
        this.lwcTables = toolsSwingManager.createJListWithCheckbox(
83
                this.view.lstTables
84
        );
85

    
86
        this.lwcTables.addListSelectionListener((ListSelectionEvent e) -> {
87
            doChangeTableSelected();
88
        });
89
        
90
        this.initializePickerConnection();
91

    
92
        this.lwcTables.addChecksListener((ListSelectionEvent e) -> {
93
            doChangeTableChecked(e.getFirstIndex(), e.getLastIndex());
94
        });
95

    
96
        this.tablesFilterController = toolsSwingManager.createFilteredListController(
97
                this.view.lstTables, 
98
                this.view.txtTablesFilter, 
99
                this.view.btnTablesFilter
100
        );
101
        
102
        this.tableInfoController = new TableInfoController(
103
                this.view.btnDeselectAllColumns, 
104
                this.view.btnSelectAllColumns, 
105
                this.view.lstColumns, 
106
                this.view.txtName, 
107
                this.view.cboIdField, 
108
                this.view.cboGeometryField, 
109
                this.view.txtProjection, 
110
                this.view.btnProjection, 
111
                this.view.txtFilter, 
112
                this.view.btnFilter, 
113
                this.view.btnFilterBookmarks, 
114
                this.view.btnFilterHistory, 
115
                this.view.btnAdvancedProperties, 
116
                this.view.lblReadOnlyNotification,
117
                this.view.pnlCfgActions
118
        );
119
        
120
        this.tableInfoController.addChangeListener(new ChangeListener() {
121
            @Override
122
            public void stateChanged(ChangeEvent e) {
123
                checkFinishable();
124
            }
125
        });
126

    
127
        this.clearTables();
128
        this.setEditableTables(false);
129

    
130
        this.setLayout(new BorderLayout());
131
        this.add(this.view, BorderLayout.CENTER);
132
//        this.setPreferredSize(new Dimension(500, 400));
133
        this.setPreferredSize(ToolsSwingUtils.ensureRowsCols(this, 30, 80));
134
    }
135
    
136
    private void initializePickerConnection() {
137
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
138
        this.pickerConnection = dataSwingManager.createJDBCConnectionPickerController(
139
                this.view.cboConnection,
140
                this.view.btnConnection
141
        );
142
        this.pickerConnection.addChangeListener((ChangeEvent e) -> {
143
            doUpdateTables();
144
            setEditableTables(true);
145
        });
146
    }
147

    
148
    protected abstract boolean requireGeometry();
149

    
150
    protected Collection<TableInfo> getTablesInformation() {
151
        this.updateTableInfoFromUI();
152
        if( this.tablesInfo == null ) {
153
            this.tablesInfo = new HashMap<>();
154
        }
155
        return this.tablesInfo.values();
156
    }
157
    
158
    private void clearTables() {
159
        this.lwcTables.setModel(new DefaultListModel());
160
        this.lwcTables.getCheckedModel().clearSelection();
161
        this.clearTableConfig();
162
    }
163

    
164
    private void clearTableConfig() {
165
        this.tableInfoController.put(null);
166
    }
167

    
168
    private void setEditableTables(boolean enable) {
169
        this.view.lstTables.setEnabled(enable);
170
        this.tableInfoController.setEditable(enable);
171
    }
172

    
173
    private void doUpdateTables() {
174
        JDBCServerExplorerParameters connection = this.pickerConnection.get();
175
        if (connection == null) {
176
            this.clearTables();
177
            return;
178
        }
179
        DataManager dataManager = DALLocator.getDataManager();
180
        JDBCServerExplorer explorer = null;
181
        try {
182
            explorer = (JDBCServerExplorer) dataManager.openServerExplorer(
183
                    connection.getDataStoreName(),
184
                    connection
185
            );
186
            List<TableInfo> parameters = new ArrayList<>();
187
            for (DataStoreParameters params : explorer.list(MODE_ALL, SHOW_TABLES)) {
188
                JDBCStoreParameters jdbcParams = (JDBCStoreParameters) params;
189
                parameters.add(new TableInfo(jdbcParams.getTable(), jdbcParams, requireGeometry(), false));
190
            }
191
            for (DataStoreParameters params : explorer.list(MODE_ALL, SHOW_VIEWS)) {
192
                JDBCStoreParameters jdbcParams = (JDBCStoreParameters) params;
193
                parameters.add(new TableInfo(jdbcParams.getTable(), jdbcParams, requireGeometry(), true));
194
            }
195
            parameters.sort((TableInfo o1, TableInfo o2) -> 
196
                    o1.getLabel().compareTo(o2.getLabel())
197
            );
198
            this.tablesInfo = new HashMap<>();
199
            DefaultListModel<TableInfo> model = new DefaultListModel<>();
200
            for (TableInfo x : parameters) {
201
                model.addElement(x);
202
                this.tablesInfo.put(x.getDocumentName(), x);
203
            }
204
            this.lwcTables.setModel(model);
205
            this.lwcTables.getCheckedModel().clearSelection();
206
        } catch (Exception ex) {
207
        } finally {
208
            DisposeUtils.disposeQuietly(explorer);
209
        }
210
    }
211

    
212
    private void doChangeTableSelected() {
213
        TableInfo tableInfo = (TableInfo) this.lwcTables.getSelectedValue();
214
        if (tableInfo == null) {
215
            this.clearTableConfig();
216
            this.tableInfoController.setEditable(false);
217
            return;
218
        }
219
        this.updateTableInfoFromUI();
220
        this.tableInfoController.put(tableInfo);
221
    }
222

    
223
    private void doChangeTableChecked(int firstIndex, int lastIndex) {
224
        ListSelectionModel checkedModel = this.lwcTables.getCheckedModel();
225
        for (int i = firstIndex; i <= lastIndex; i++) {
226
            TableInfo tableInfo = (TableInfo) this.lwcTables.getModel().getElementAt(i);
227
            tableInfo.setSelected(checkedModel.isSelectedIndex(i));
228
        }
229
        this.checkFinishable();
230
    }
231
    
232
    private void updateTableInfoFromUI() {
233
        String previousId = this.tableInfoController.getId();
234
        if (previousId == null) {
235
            return;
236
        }
237

    
238
        if (this.tablesInfo != null && !this.tablesInfo.isEmpty()) {
239
            TableInfo previousInfo = this.tablesInfo.get(previousId);
240
            if (previousInfo != null) {
241
                this.tableInfoController.fetch(previousInfo);
242
            }
243
        }
244
    }
245

    
246

    
247
    @Override
248
    public void initWizard() {
249
        I18nManager i18n = ToolsLocator.getI18nManager();
250
        setTabName(i18n.getTranslation("_Database"));
251
    }
252

    
253
    @Override
254
    public boolean areSettingsValid() {
255
        boolean hasInvalidValues = false;
256
        boolean hasSelectedTables = false;
257
        for (TableInfo tableInfo : this.getTablesInformation() ) {
258
            if (tableInfo.isSelected()) {
259
                hasSelectedTables = true;
260
                if (!tableInfo.hasValidValues()) {
261
                    hasInvalidValues = true;
262
                }
263
            }
264
        }
265
        return hasSelectedTables && !hasInvalidValues;
266
    }
267

    
268
    @Override
269
    public DataStoreParameters[] getParameters() {
270
        int sz = 0;
271
        for (TableInfo tableInfo : this.getTablesInformation() ) {
272
            if( tableInfo.isSelected() ) {
273
                sz++;
274
            }
275
        }
276
        if( sz == 0 ) {
277
            return null;
278
        }
279
        DataStoreParameters[] dbParameters = new DataStoreParameters[sz];
280
        int n = 0;
281
        for (TableInfo tableInfo : this.getTablesInformation() ) {
282
            if( tableInfo.isSelected() ) {
283
                dbParameters[n++] = tableInfo.getParameters();
284
            }
285
        }
286
        return dbParameters;
287
    }
288
    
289
    @Override
290
    public void execute() {
291
        executeWizard();
292
    }
293

    
294
    @Override
295
    public void close() {
296
        
297
    }
298
    
299
    protected void checkFinishable() {
300
        boolean finishable = areSettingsValid();
301
        callStateChanged(finishable);
302
    }
303

    
304
}