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 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 45672 jjdelcerro
import org.gvsig.tools.swing.api.ToolsSwingUtils;
37 44533 jjdelcerro
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 45062 jjdelcerro
@SuppressWarnings("UseSpecificCatch")
46 44533 jjdelcerro
public abstract class AbstractWizardDB extends WizardPanel {
47
48
    protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractWizardDB.class);
49
50 45059 jjdelcerro
51 45634 fdiaz
    protected AbstractWizardDBView view;
52 44533 jjdelcerro
    private PickerController<JDBCServerExplorerParameters> pickerConnection;
53 45634 fdiaz
    protected JListWithCheckbox lwcTables;
54
    protected Map<String, TableInfo> tablesInfo = null;
55
    protected FilteredListController tablesFilterController;
56
    protected TableInfoController tableInfoController;
57 45062 jjdelcerro
58 45634 fdiaz
59 44533 jjdelcerro
    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 45062 jjdelcerro
        this.lwcTables.addListSelectionListener((ListSelectionEvent e) -> {
87
            doChangeTableSelected();
88 44533 jjdelcerro
        });
89 45634 fdiaz
90
        this.initializePickerConnection();
91
92 45062 jjdelcerro
        this.lwcTables.addChecksListener((ListSelectionEvent e) -> {
93 45634 fdiaz
            doChangeTableChecked(e.getFirstIndex(), e.getLastIndex());
94 44533 jjdelcerro
        });
95 45634 fdiaz
96 45062 jjdelcerro
        this.tablesFilterController = toolsSwingManager.createFilteredListController(
97
                this.view.lstTables,
98
                this.view.txtTablesFilter,
99
                this.view.btnTablesFilter
100
        );
101 45634 fdiaz
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 45650 jjdelcerro
                this.view.lblReadOnlyNotification,
117
                this.view.pnlCfgActions
118 45634 fdiaz
        );
119 45670 fdiaz
120
        this.tableInfoController.addChangeListener(new ChangeListener() {
121
            @Override
122
            public void stateChanged(ChangeEvent e) {
123
                checkFinishable();
124
            }
125
        });
126 44533 jjdelcerro
127
        this.clearTables();
128
        this.setEditableTables(false);
129
130
        this.setLayout(new BorderLayout());
131
        this.add(this.view, BorderLayout.CENTER);
132 45672 jjdelcerro
//        this.setPreferredSize(new Dimension(500, 400));
133
        this.setPreferredSize(ToolsSwingUtils.ensureRowsCols(this, 30, 80));
134 44533 jjdelcerro
    }
135 45634 fdiaz
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 44533 jjdelcerro
148
    protected abstract boolean requireGeometry();
149
150
    protected Collection<TableInfo> getTablesInformation() {
151 45008 omartinez
        this.updateTableInfoFromUI();
152 44533 jjdelcerro
        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 45634 fdiaz
        this.tableInfoController.put(null);
166 44533 jjdelcerro
    }
167
168
    private void setEditableTables(boolean enable) {
169
        this.view.lstTables.setEnabled(enable);
170 45634 fdiaz
        this.tableInfoController.setEditable(enable);
171 44533 jjdelcerro
    }
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 45627 fdiaz
        JDBCServerExplorer explorer = null;
181 44533 jjdelcerro
        try {
182 45627 fdiaz
            explorer = (JDBCServerExplorer) dataManager.openServerExplorer(
183 44533 jjdelcerro
                    connection.getDataStoreName(),
184
                    connection
185
            );
186
            List<TableInfo> parameters = new ArrayList<>();
187 45627 fdiaz
            for (DataStoreParameters params : explorer.list(MODE_ALL, SHOW_TABLES)) {
188 45634 fdiaz
                JDBCStoreParameters jdbcParams = (JDBCStoreParameters) params;
189
                parameters.add(new TableInfo(jdbcParams.getTable(), jdbcParams, requireGeometry(), false));
190 44533 jjdelcerro
            }
191 45627 fdiaz
            for (DataStoreParameters params : explorer.list(MODE_ALL, SHOW_VIEWS)) {
192 45634 fdiaz
                JDBCStoreParameters jdbcParams = (JDBCStoreParameters) params;
193
                parameters.add(new TableInfo(jdbcParams.getTable(), jdbcParams, requireGeometry(), true));
194 45627 fdiaz
            }
195 45062 jjdelcerro
            parameters.sort((TableInfo o1, TableInfo o2) ->
196
                    o1.getLabel().compareTo(o2.getLabel())
197
            );
198 44533 jjdelcerro
            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 45440 fdiaz
        } finally {
208
            DisposeUtils.disposeQuietly(explorer);
209 44533 jjdelcerro
        }
210
    }
211
212
    private void doChangeTableSelected() {
213
        TableInfo tableInfo = (TableInfo) this.lwcTables.getSelectedValue();
214
        if (tableInfo == null) {
215
            this.clearTableConfig();
216 45634 fdiaz
            this.tableInfoController.setEditable(false);
217 44533 jjdelcerro
            return;
218
        }
219 45008 omartinez
        this.updateTableInfoFromUI();
220 45634 fdiaz
        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 44533 jjdelcerro
        this.checkFinishable();
230
    }
231 45008 omartinez
232
    private void updateTableInfoFromUI() {
233 45634 fdiaz
        String previousId = this.tableInfoController.getId();
234
        if (previousId == null) {
235
            return;
236 45008 omartinez
        }
237 44533 jjdelcerro
238 45634 fdiaz
        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 45627 fdiaz
        }
244 44533 jjdelcerro
    }
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
}