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

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
        );
116

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

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

    
137
    protected abstract boolean requireGeometry();
138

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

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

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

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

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

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

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

    
235

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

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

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

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

    
293
}