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 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
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 45627 fdiaz
import static org.gvsig.fmap.dal.DataServerExplorer.MODE_ALL;
20 44533 jjdelcerro
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 45627 fdiaz
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 44533 jjdelcerro
import org.gvsig.fmap.dal.swing.DALSwingLocator;
27
import org.gvsig.fmap.dal.swing.DataSwingManager;
28
import org.gvsig.tools.ToolsLocator;
29 45440 fdiaz
import org.gvsig.tools.dispose.DisposeUtils;
30 44533 jjdelcerro
import org.gvsig.tools.i18n.I18nManager;
31 45062 jjdelcerro
import org.gvsig.tools.swing.api.FilteredListController;
32 44533 jjdelcerro
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 45062 jjdelcerro
@SuppressWarnings("UseSpecificCatch")
44 44533 jjdelcerro
public abstract class AbstractWizardDB extends WizardPanel {
45
46
    protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractWizardDB.class);
47
48 45059 jjdelcerro
49 45634 fdiaz
    protected AbstractWizardDBView view;
50 44533 jjdelcerro
    private PickerController<JDBCServerExplorerParameters> pickerConnection;
51 45634 fdiaz
    protected JListWithCheckbox lwcTables;
52
    protected Map<String, TableInfo> tablesInfo = null;
53
    protected FilteredListController tablesFilterController;
54
    protected TableInfoController tableInfoController;
55 45062 jjdelcerro
56 45634 fdiaz
57 44533 jjdelcerro
    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 45062 jjdelcerro
        this.lwcTables.addListSelectionListener((ListSelectionEvent e) -> {
85
            doChangeTableSelected();
86 44533 jjdelcerro
        });
87 45634 fdiaz
88
        this.initializePickerConnection();
89
90 45062 jjdelcerro
        this.lwcTables.addChecksListener((ListSelectionEvent e) -> {
91 45634 fdiaz
            doChangeTableChecked(e.getFirstIndex(), e.getLastIndex());
92 44533 jjdelcerro
        });
93 45634 fdiaz
94 45062 jjdelcerro
        this.tablesFilterController = toolsSwingManager.createFilteredListController(
95
                this.view.lstTables,
96
                this.view.txtTablesFilter,
97
                this.view.btnTablesFilter
98
        );
99 45634 fdiaz
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 45650 jjdelcerro
                this.view.lblReadOnlyNotification,
115
                this.view.pnlCfgActions
116 45634 fdiaz
        );
117 44533 jjdelcerro
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 45634 fdiaz
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 44533 jjdelcerro
138
    protected abstract boolean requireGeometry();
139
140
    protected Collection<TableInfo> getTablesInformation() {
141 45008 omartinez
        this.updateTableInfoFromUI();
142 44533 jjdelcerro
        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 45634 fdiaz
        this.tableInfoController.put(null);
156 44533 jjdelcerro
    }
157
158
    private void setEditableTables(boolean enable) {
159
        this.view.lstTables.setEnabled(enable);
160 45634 fdiaz
        this.tableInfoController.setEditable(enable);
161 44533 jjdelcerro
    }
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 45627 fdiaz
        JDBCServerExplorer explorer = null;
171 44533 jjdelcerro
        try {
172 45627 fdiaz
            explorer = (JDBCServerExplorer) dataManager.openServerExplorer(
173 44533 jjdelcerro
                    connection.getDataStoreName(),
174
                    connection
175
            );
176
            List<TableInfo> parameters = new ArrayList<>();
177 45627 fdiaz
            for (DataStoreParameters params : explorer.list(MODE_ALL, SHOW_TABLES)) {
178 45634 fdiaz
                JDBCStoreParameters jdbcParams = (JDBCStoreParameters) params;
179
                parameters.add(new TableInfo(jdbcParams.getTable(), jdbcParams, requireGeometry(), false));
180 44533 jjdelcerro
            }
181 45627 fdiaz
            for (DataStoreParameters params : explorer.list(MODE_ALL, SHOW_VIEWS)) {
182 45634 fdiaz
                JDBCStoreParameters jdbcParams = (JDBCStoreParameters) params;
183
                parameters.add(new TableInfo(jdbcParams.getTable(), jdbcParams, requireGeometry(), true));
184 45627 fdiaz
            }
185 45062 jjdelcerro
            parameters.sort((TableInfo o1, TableInfo o2) ->
186
                    o1.getLabel().compareTo(o2.getLabel())
187
            );
188 44533 jjdelcerro
            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 45440 fdiaz
        } finally {
198
            DisposeUtils.disposeQuietly(explorer);
199 44533 jjdelcerro
        }
200
    }
201
202
    private void doChangeTableSelected() {
203
        TableInfo tableInfo = (TableInfo) this.lwcTables.getSelectedValue();
204
        if (tableInfo == null) {
205
            this.clearTableConfig();
206 45634 fdiaz
            this.tableInfoController.setEditable(false);
207 44533 jjdelcerro
            return;
208
        }
209 45008 omartinez
        this.updateTableInfoFromUI();
210 45634 fdiaz
        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 44533 jjdelcerro
        this.checkFinishable();
220
    }
221 45008 omartinez
222
    private void updateTableInfoFromUI() {
223 45634 fdiaz
        String previousId = this.tableInfoController.getId();
224
        if (previousId == null) {
225
            return;
226 45008 omartinez
        }
227 44533 jjdelcerro
228 45634 fdiaz
        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 45627 fdiaz
        }
234 44533 jjdelcerro
    }
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
}