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

History | View | Annotate | Download (10.4 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.ListSelectionEvent;
14
import org.gvsig.app.gui.WizardPanel;
15
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
16
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
17
import org.gvsig.fmap.dal.DALLocator;
18
import org.gvsig.fmap.dal.DataManager;
19
import static org.gvsig.fmap.dal.DataServerExplorer.MODE_ALL;
20
import org.gvsig.fmap.dal.DataStoreParameters;
21
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
22
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
23
import org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer;
24
import static org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer.SHOW_TABLES;
25
import static org.gvsig.fmap.dal.store.jdbc2.JDBCServerExplorer.SHOW_VIEWS;
26
import org.gvsig.fmap.dal.swing.DALSwingLocator;
27
import org.gvsig.fmap.dal.swing.DataSwingManager;
28
import org.gvsig.tools.ToolsLocator;
29
import org.gvsig.tools.dispose.DisposeUtils;
30
import org.gvsig.tools.i18n.I18nManager;
31
import org.gvsig.tools.swing.api.FilteredListController;
32
import org.gvsig.tools.swing.api.JListWithCheckbox;
33
import org.gvsig.tools.swing.api.ToolsSwingLocator;
34
import org.gvsig.tools.swing.api.ToolsSwingManager;
35
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
36
import org.slf4j.Logger;
37
import org.slf4j.LoggerFactory;
38

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

    
46
    protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractWizardDB.class);
47

    
48

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

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

    
66
        this.view = new AbstractWizardDBView();
67

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

    
77
        toolsSwingManager.addClearButton(this.view.txtName);
78
        toolsSwingManager.setDefaultPopupMenu(this.view.txtName);
79

    
80
        this.lwcTables = toolsSwingManager.createJListWithCheckbox(
81
                this.view.lstTables
82
        );
83

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

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

    
94
        this.tablesFilterController = toolsSwingManager.createFilteredListController(
95
                this.view.lstTables, 
96
                this.view.txtTablesFilter, 
97
                this.view.btnTablesFilter
98
        );
99
        
100
        this.tableInfoController = new TableInfoController(
101
                this.view.btnDeselectAllColumns, 
102
                this.view.btnSelectAllColumns, 
103
                this.view.lstColumns, 
104
                this.view.txtName, 
105
                this.view.cboIdField, 
106
                this.view.cboGeometryField, 
107
                this.view.txtProjection, 
108
                this.view.btnProjection, 
109
                this.view.txtFilter, 
110
                this.view.btnFilter, 
111
                this.view.btnFilterBookmarks, 
112
                this.view.btnFilterHistory, 
113
                this.view.btnAdvancedProperties, 
114
                this.view.lblReadOnlyNotification,
115
                this.view.pnlCfgActions
116
        );
117

    
118
        this.clearTables();
119
        this.setEditableTables(false);
120

    
121
        this.setLayout(new BorderLayout());
122
        this.add(this.view, BorderLayout.CENTER);
123
        this.setPreferredSize(new Dimension(500, 400));
124
    }
125
    
126
    private void initializePickerConnection() {
127
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
128
        this.pickerConnection = dataSwingManager.createJDBCConnectionPickerController(
129
                this.view.cboConnection,
130
                this.view.btnConnection
131
        );
132
        this.pickerConnection.addChangeListener((ChangeEvent e) -> {
133
            doUpdateTables();
134
            setEditableTables(true);
135
        });
136
    }
137

    
138
    protected abstract boolean requireGeometry();
139

    
140
    protected Collection<TableInfo> getTablesInformation() {
141
        this.updateTableInfoFromUI();
142
        if( this.tablesInfo == null ) {
143
            this.tablesInfo = new HashMap<>();
144
        }
145
        return this.tablesInfo.values();
146
    }
147
    
148
    private void clearTables() {
149
        this.lwcTables.setModel(new DefaultListModel());
150
        this.lwcTables.getCheckedModel().clearSelection();
151
        this.clearTableConfig();
152
    }
153

    
154
    private void clearTableConfig() {
155
        this.tableInfoController.put(null);
156
    }
157

    
158
    private void setEditableTables(boolean enable) {
159
        this.view.lstTables.setEnabled(enable);
160
        this.tableInfoController.setEditable(enable);
161
    }
162

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

    
202
    private void doChangeTableSelected() {
203
        TableInfo tableInfo = (TableInfo) this.lwcTables.getSelectedValue();
204
        if (tableInfo == null) {
205
            this.clearTableConfig();
206
            this.tableInfoController.setEditable(false);
207
            return;
208
        }
209
        this.updateTableInfoFromUI();
210
        this.tableInfoController.put(tableInfo);
211
    }
212

    
213
    private void doChangeTableChecked(int firstIndex, int lastIndex) {
214
        ListSelectionModel checkedModel = this.lwcTables.getCheckedModel();
215
        for (int i = firstIndex; i <= lastIndex; i++) {
216
            TableInfo tableInfo = (TableInfo) this.lwcTables.getModel().getElementAt(i);
217
            tableInfo.setSelected(checkedModel.isSelectedIndex(i));
218
        }
219
        this.checkFinishable();
220
    }
221
    
222
    private void updateTableInfoFromUI() {
223
        String previousId = this.tableInfoController.getId();
224
        if (previousId == null) {
225
            return;
226
        }
227

    
228
        if (this.tablesInfo != null && !this.tablesInfo.isEmpty()) {
229
            TableInfo previousInfo = this.tablesInfo.get(previousId);
230
            if (previousInfo != null) {
231
                this.tableInfoController.fetch(previousInfo);
232
            }
233
        }
234
    }
235

    
236

    
237
    @Override
238
    public void initWizard() {
239
        I18nManager i18n = ToolsLocator.getI18nManager();
240
        setTabName(i18n.getTranslation("_Database"));
241
    }
242

    
243
    @Override
244
    public boolean areSettingsValid() {
245
        boolean hasInvalidValues = false;
246
        boolean hasSelectedTables = false;
247
        for (TableInfo tableInfo : this.getTablesInformation() ) {
248
            if (tableInfo.isSelected()) {
249
                hasSelectedTables = true;
250
                if (!tableInfo.hasValidValues()) {
251
                    hasInvalidValues = true;
252
                }
253
            }
254
        }
255
        return hasSelectedTables && !hasInvalidValues;
256
    }
257

    
258
    @Override
259
    public DataStoreParameters[] getParameters() {
260
        int sz = 0;
261
        for (TableInfo tableInfo : this.getTablesInformation() ) {
262
            if( tableInfo.isSelected() ) {
263
                sz++;
264
            }
265
        }
266
        if( sz == 0 ) {
267
            return null;
268
        }
269
        DataStoreParameters[] dbParameters = new DataStoreParameters[sz];
270
        int n = 0;
271
        for (TableInfo tableInfo : this.getTablesInformation() ) {
272
            if( tableInfo.isSelected() ) {
273
                dbParameters[n++] = tableInfo.getParameters();
274
            }
275
        }
276
        return dbParameters;
277
    }
278
    
279
    @Override
280
    public void execute() {
281
        executeWizard();
282
    }
283

    
284
    @Override
285
    public void close() {
286
        
287
    }
288
    
289
    protected void checkFinishable() {
290
        boolean finishable = areSettingsValid();
291
        callStateChanged(finishable);
292
    }
293

    
294
}