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

History | View | Annotate | Download (10.6 KB)

1 44533 jjdelcerro
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 45670 fdiaz
import javax.swing.event.ChangeListener;
14 44533 jjdelcerro
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 45627 fdiaz
import static org.gvsig.fmap.dal.DataServerExplorer.MODE_ALL;
21 44533 jjdelcerro
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 45627 fdiaz
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 44533 jjdelcerro
import org.gvsig.fmap.dal.swing.DALSwingLocator;
28
import org.gvsig.fmap.dal.swing.DataSwingManager;
29
import org.gvsig.tools.ToolsLocator;
30 45440 fdiaz
import org.gvsig.tools.dispose.DisposeUtils;
31 44533 jjdelcerro
import org.gvsig.tools.i18n.I18nManager;
32 45062 jjdelcerro
import org.gvsig.tools.swing.api.FilteredListController;
33 44533 jjdelcerro
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.pickercontroller.PickerController;
37
import org.slf4j.Logger;
38
import org.slf4j.LoggerFactory;
39
40
/**
41
 *
42
 * @author jjdelcerro
43
 */
44 45062 jjdelcerro
@SuppressWarnings("UseSpecificCatch")
45 44533 jjdelcerro
public abstract class AbstractWizardDB extends WizardPanel {
46
47
    protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractWizardDB.class);
48
49 45059 jjdelcerro
50 45634 fdiaz
    protected AbstractWizardDBView view;
51 44533 jjdelcerro
    private PickerController<JDBCServerExplorerParameters> pickerConnection;
52 45634 fdiaz
    protected JListWithCheckbox lwcTables;
53
    protected Map<String, TableInfo> tablesInfo = null;
54
    protected FilteredListController tablesFilterController;
55
    protected TableInfoController tableInfoController;
56 45062 jjdelcerro
57 45634 fdiaz
58 44533 jjdelcerro
    public AbstractWizardDB() {
59
        initComponents();
60
    }
61
62
    private void initComponents() {
63
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
64
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
65
        ExpressionEvaluatorSwingManager expressionSwingManager = ExpressionEvaluatorSwingLocator.getManager();
66
67
        this.view = new AbstractWizardDBView();
68
69
        toolsSwingManager.translate(this.view.lblColumns);
70
        toolsSwingManager.translate(this.view.lblConnection);
71
        toolsSwingManager.translate(this.view.lblFilter);
72
        toolsSwingManager.translate(this.view.lblGeometryField);
73
        toolsSwingManager.translate(this.view.lblIdField);
74
        toolsSwingManager.translate(this.view.lblName);
75
        toolsSwingManager.translate(this.view.lblProjection);
76
        toolsSwingManager.translate(this.view.lblTable);
77
78
        toolsSwingManager.addClearButton(this.view.txtName);
79
        toolsSwingManager.setDefaultPopupMenu(this.view.txtName);
80
81
        this.lwcTables = toolsSwingManager.createJListWithCheckbox(
82
                this.view.lstTables
83
        );
84
85 45062 jjdelcerro
        this.lwcTables.addListSelectionListener((ListSelectionEvent e) -> {
86
            doChangeTableSelected();
87 44533 jjdelcerro
        });
88 45634 fdiaz
89
        this.initializePickerConnection();
90
91 45062 jjdelcerro
        this.lwcTables.addChecksListener((ListSelectionEvent e) -> {
92 45634 fdiaz
            doChangeTableChecked(e.getFirstIndex(), e.getLastIndex());
93 44533 jjdelcerro
        });
94 45634 fdiaz
95 45062 jjdelcerro
        this.tablesFilterController = toolsSwingManager.createFilteredListController(
96
                this.view.lstTables,
97
                this.view.txtTablesFilter,
98
                this.view.btnTablesFilter
99
        );
100 45634 fdiaz
101
        this.tableInfoController = new TableInfoController(
102
                this.view.btnDeselectAllColumns,
103
                this.view.btnSelectAllColumns,
104
                this.view.lstColumns,
105
                this.view.txtName,
106
                this.view.cboIdField,
107
                this.view.cboGeometryField,
108
                this.view.txtProjection,
109
                this.view.btnProjection,
110
                this.view.txtFilter,
111
                this.view.btnFilter,
112
                this.view.btnFilterBookmarks,
113
                this.view.btnFilterHistory,
114
                this.view.btnAdvancedProperties,
115 45650 jjdelcerro
                this.view.lblReadOnlyNotification,
116
                this.view.pnlCfgActions
117 45634 fdiaz
        );
118 45670 fdiaz
119
        this.tableInfoController.addChangeListener(new ChangeListener() {
120
            @Override
121
            public void stateChanged(ChangeEvent e) {
122
                checkFinishable();
123
            }
124
        });
125 44533 jjdelcerro
126
        this.clearTables();
127
        this.setEditableTables(false);
128
129
        this.setLayout(new BorderLayout());
130
        this.add(this.view, BorderLayout.CENTER);
131
        this.setPreferredSize(new Dimension(500, 400));
132
    }
133 45634 fdiaz
134
    private void initializePickerConnection() {
135
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
136
        this.pickerConnection = dataSwingManager.createJDBCConnectionPickerController(
137
                this.view.cboConnection,
138
                this.view.btnConnection
139
        );
140
        this.pickerConnection.addChangeListener((ChangeEvent e) -> {
141
            doUpdateTables();
142
            setEditableTables(true);
143
        });
144
    }
145 44533 jjdelcerro
146
    protected abstract boolean requireGeometry();
147
148
    protected Collection<TableInfo> getTablesInformation() {
149 45008 omartinez
        this.updateTableInfoFromUI();
150 44533 jjdelcerro
        if( this.tablesInfo == null ) {
151
            this.tablesInfo = new HashMap<>();
152
        }
153
        return this.tablesInfo.values();
154
    }
155
156
    private void clearTables() {
157
        this.lwcTables.setModel(new DefaultListModel());
158
        this.lwcTables.getCheckedModel().clearSelection();
159
        this.clearTableConfig();
160
    }
161
162
    private void clearTableConfig() {
163 45634 fdiaz
        this.tableInfoController.put(null);
164 44533 jjdelcerro
    }
165
166
    private void setEditableTables(boolean enable) {
167
        this.view.lstTables.setEnabled(enable);
168 45634 fdiaz
        this.tableInfoController.setEditable(enable);
169 44533 jjdelcerro
    }
170
171
    private void doUpdateTables() {
172
        JDBCServerExplorerParameters connection = this.pickerConnection.get();
173
        if (connection == null) {
174
            this.clearTables();
175
            return;
176
        }
177
        DataManager dataManager = DALLocator.getDataManager();
178 45627 fdiaz
        JDBCServerExplorer explorer = null;
179 44533 jjdelcerro
        try {
180 45627 fdiaz
            explorer = (JDBCServerExplorer) dataManager.openServerExplorer(
181 44533 jjdelcerro
                    connection.getDataStoreName(),
182
                    connection
183
            );
184
            List<TableInfo> parameters = new ArrayList<>();
185 45627 fdiaz
            for (DataStoreParameters params : explorer.list(MODE_ALL, SHOW_TABLES)) {
186 45634 fdiaz
                JDBCStoreParameters jdbcParams = (JDBCStoreParameters) params;
187
                parameters.add(new TableInfo(jdbcParams.getTable(), jdbcParams, requireGeometry(), false));
188 44533 jjdelcerro
            }
189 45627 fdiaz
            for (DataStoreParameters params : explorer.list(MODE_ALL, SHOW_VIEWS)) {
190 45634 fdiaz
                JDBCStoreParameters jdbcParams = (JDBCStoreParameters) params;
191
                parameters.add(new TableInfo(jdbcParams.getTable(), jdbcParams, requireGeometry(), true));
192 45627 fdiaz
            }
193 45062 jjdelcerro
            parameters.sort((TableInfo o1, TableInfo o2) ->
194
                    o1.getLabel().compareTo(o2.getLabel())
195
            );
196 44533 jjdelcerro
            this.tablesInfo = new HashMap<>();
197
            DefaultListModel<TableInfo> model = new DefaultListModel<>();
198
            for (TableInfo x : parameters) {
199
                model.addElement(x);
200
                this.tablesInfo.put(x.getDocumentName(), x);
201
            }
202
            this.lwcTables.setModel(model);
203
            this.lwcTables.getCheckedModel().clearSelection();
204
        } catch (Exception ex) {
205 45440 fdiaz
        } finally {
206
            DisposeUtils.disposeQuietly(explorer);
207 44533 jjdelcerro
        }
208
    }
209
210
    private void doChangeTableSelected() {
211
        TableInfo tableInfo = (TableInfo) this.lwcTables.getSelectedValue();
212
        if (tableInfo == null) {
213
            this.clearTableConfig();
214 45634 fdiaz
            this.tableInfoController.setEditable(false);
215 44533 jjdelcerro
            return;
216
        }
217 45008 omartinez
        this.updateTableInfoFromUI();
218 45634 fdiaz
        this.tableInfoController.put(tableInfo);
219
    }
220
221
    private void doChangeTableChecked(int firstIndex, int lastIndex) {
222
        ListSelectionModel checkedModel = this.lwcTables.getCheckedModel();
223
        for (int i = firstIndex; i <= lastIndex; i++) {
224
            TableInfo tableInfo = (TableInfo) this.lwcTables.getModel().getElementAt(i);
225
            tableInfo.setSelected(checkedModel.isSelectedIndex(i));
226
        }
227 44533 jjdelcerro
        this.checkFinishable();
228
    }
229 45008 omartinez
230
    private void updateTableInfoFromUI() {
231 45634 fdiaz
        String previousId = this.tableInfoController.getId();
232
        if (previousId == null) {
233
            return;
234 45008 omartinez
        }
235 44533 jjdelcerro
236 45634 fdiaz
        if (this.tablesInfo != null && !this.tablesInfo.isEmpty()) {
237
            TableInfo previousInfo = this.tablesInfo.get(previousId);
238
            if (previousInfo != null) {
239
                this.tableInfoController.fetch(previousInfo);
240
            }
241 45627 fdiaz
        }
242 44533 jjdelcerro
    }
243
244
245
    @Override
246
    public void initWizard() {
247
        I18nManager i18n = ToolsLocator.getI18nManager();
248
        setTabName(i18n.getTranslation("_Database"));
249
    }
250
251
    @Override
252
    public boolean areSettingsValid() {
253
        boolean hasInvalidValues = false;
254
        boolean hasSelectedTables = false;
255
        for (TableInfo tableInfo : this.getTablesInformation() ) {
256
            if (tableInfo.isSelected()) {
257
                hasSelectedTables = true;
258
                if (!tableInfo.hasValidValues()) {
259
                    hasInvalidValues = true;
260
                }
261
            }
262
        }
263
        return hasSelectedTables && !hasInvalidValues;
264
    }
265
266
    @Override
267
    public DataStoreParameters[] getParameters() {
268
        int sz = 0;
269
        for (TableInfo tableInfo : this.getTablesInformation() ) {
270
            if( tableInfo.isSelected() ) {
271
                sz++;
272
            }
273
        }
274
        if( sz == 0 ) {
275
            return null;
276
        }
277
        DataStoreParameters[] dbParameters = new DataStoreParameters[sz];
278
        int n = 0;
279
        for (TableInfo tableInfo : this.getTablesInformation() ) {
280
            if( tableInfo.isSelected() ) {
281
                dbParameters[n++] = tableInfo.getParameters();
282
            }
283
        }
284
        return dbParameters;
285
    }
286
287
    @Override
288
    public void execute() {
289
        executeWizard();
290
    }
291
292
    @Override
293
    public void close() {
294
295
    }
296
297
    protected void checkFinishable() {
298
        boolean finishable = areSettingsValid();
299
        callStateChanged(finishable);
300
    }
301
302
}