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
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.ChangeListener;
14
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
import static org.gvsig.fmap.dal.DataServerExplorer.MODE_ALL;
21
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
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
import org.gvsig.fmap.dal.swing.DALSwingLocator;
28
import org.gvsig.fmap.dal.swing.DataSwingManager;
29
import org.gvsig.tools.ToolsLocator;
30
import org.gvsig.tools.dispose.DisposeUtils;
31
import org.gvsig.tools.i18n.I18nManager;
32
import org.gvsig.tools.swing.api.FilteredListController;
33
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
@SuppressWarnings("UseSpecificCatch")
45
public abstract class AbstractWizardDB extends WizardPanel {
46

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

    
49

    
50
    protected AbstractWizardDBView view;
51
    private PickerController<JDBCServerExplorerParameters> pickerConnection;
52
    protected JListWithCheckbox lwcTables;
53
    protected Map<String, TableInfo> tablesInfo = null;
54
    protected FilteredListController tablesFilterController;
55
    protected TableInfoController tableInfoController;
56
    
57
    
58
    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
        this.lwcTables.addListSelectionListener((ListSelectionEvent e) -> {
86
            doChangeTableSelected();
87
        });
88
        
89
        this.initializePickerConnection();
90

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

    
95
        this.tablesFilterController = toolsSwingManager.createFilteredListController(
96
                this.view.lstTables, 
97
                this.view.txtTablesFilter, 
98
                this.view.btnTablesFilter
99
        );
100
        
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
                this.view.lblReadOnlyNotification,
116
                this.view.pnlCfgActions
117
        );
118
        
119
        this.tableInfoController.addChangeListener(new ChangeListener() {
120
            @Override
121
            public void stateChanged(ChangeEvent e) {
122
                checkFinishable();
123
            }
124
        });
125

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

    
146
    protected abstract boolean requireGeometry();
147

    
148
    protected Collection<TableInfo> getTablesInformation() {
149
        this.updateTableInfoFromUI();
150
        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
        this.tableInfoController.put(null);
164
    }
165

    
166
    private void setEditableTables(boolean enable) {
167
        this.view.lstTables.setEnabled(enable);
168
        this.tableInfoController.setEditable(enable);
169
    }
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
        JDBCServerExplorer explorer = null;
179
        try {
180
            explorer = (JDBCServerExplorer) dataManager.openServerExplorer(
181
                    connection.getDataStoreName(),
182
                    connection
183
            );
184
            List<TableInfo> parameters = new ArrayList<>();
185
            for (DataStoreParameters params : explorer.list(MODE_ALL, SHOW_TABLES)) {
186
                JDBCStoreParameters jdbcParams = (JDBCStoreParameters) params;
187
                parameters.add(new TableInfo(jdbcParams.getTable(), jdbcParams, requireGeometry(), false));
188
            }
189
            for (DataStoreParameters params : explorer.list(MODE_ALL, SHOW_VIEWS)) {
190
                JDBCStoreParameters jdbcParams = (JDBCStoreParameters) params;
191
                parameters.add(new TableInfo(jdbcParams.getTable(), jdbcParams, requireGeometry(), true));
192
            }
193
            parameters.sort((TableInfo o1, TableInfo o2) -> 
194
                    o1.getLabel().compareTo(o2.getLabel())
195
            );
196
            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
        } finally {
206
            DisposeUtils.disposeQuietly(explorer);
207
        }
208
    }
209

    
210
    private void doChangeTableSelected() {
211
        TableInfo tableInfo = (TableInfo) this.lwcTables.getSelectedValue();
212
        if (tableInfo == null) {
213
            this.clearTableConfig();
214
            this.tableInfoController.setEditable(false);
215
            return;
216
        }
217
        this.updateTableInfoFromUI();
218
        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
        this.checkFinishable();
228
    }
229
    
230
    private void updateTableInfoFromUI() {
231
        String previousId = this.tableInfoController.getId();
232
        if (previousId == null) {
233
            return;
234
        }
235

    
236
        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
        }
242
    }
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
}