Revision 3444

View differences:

org.gvsig.vcsgis/tags/org.gvsig.vcsgis-1.0.11/pom.xml
1
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
2
    <modelVersion>4.0.0</modelVersion>
3
    <groupId>org.gvsig</groupId>
4
    <artifactId>org.gvsig.vcsgis</artifactId>
5
    <version>1.0.11</version>
6
    <packaging>pom</packaging>
7
    <name>${project.artifactId}</name>
8
    <description />
9
    <parent>
10
        <groupId>org.gvsig</groupId>
11
        <artifactId>org.gvsig.desktop</artifactId>
12
        <version>2.0.318</version>
13
    </parent>
14

  
15
    <properties>
16
        <jettyVersion>9.4.34.v20201102</jettyVersion>
17
        <org.gvsig.h2spatial.provider>org.gvsig.h2spatial.h2gis132.provider</org.gvsig.h2spatial.provider>
18
        <gvsig.topology.version>1.0.56</gvsig.topology.version>
19
    </properties>
20

  
21
    <url>https://devel.gvsig.org/sites/org.gvsig.vcsgis/${project.version}</url>
22
    <scm>
23
        <connection>scm:svn:https://devel.gvsig.org/svn/gvsig-projects-pool/org.gvsig.vcsgis/tags/org.gvsig.vcsgis-1.0.11</connection>
24
        <developerConnection>scm:svn:https://devel.gvsig.org/svn/gvsig-projects-pool/org.gvsig.vcsgis/tags/org.gvsig.vcsgis-1.0.11</developerConnection>
25
        <url>https://devel.gvsig.org/svn/gvsig-projects-pool/org.gvsig.vcsgis/tags/org.gvsig.vcsgis-1.0.11</url>
26
    </scm>
27

  
28
    <repositories>
29
        <repository>
30
            <id>gvsig-public-http-repository</id>
31
            <name>gvSIG maven public HTTP repository</name>
32
            <url>http://devel.gvsig.org/m2repo/j2se</url>
33
            <releases>
34
                <enabled>true</enabled>
35
                <updatePolicy>daily</updatePolicy>
36
                <checksumPolicy>warn</checksumPolicy>
37
            </releases>
38
            <snapshots>
39
                <enabled>true</enabled>
40
                <updatePolicy>daily</updatePolicy>
41
                <checksumPolicy>warn</checksumPolicy>
42
            </snapshots>
43
        </repository>
44
    </repositories>
45

  
46
    <distributionManagement>
47
        <site>
48
            <id>gvsig-repository</id>
49
            <url>dav:https://devel.gvsig.org/download/projects/gvsig-vcsgis/pool/${project.artifactId}/${project.version}</url>
50
        </site>
51
    </distributionManagement>
52

  
53
    <build>
54
        <pluginManagement>
55
            <plugins>
56

  
57
                <plugin>
58
                    <groupId>org.apache.maven.plugins</groupId>
59
                    <artifactId>maven-compiler-plugin</artifactId>
60
                    <configuration>
61
                        <encoding>UTF-8</encoding>
62
                    </configuration>
63
                </plugin>
64
            </plugins>
65
        </pluginManagement>
66
        <plugins>
67
            <plugin>
68
                <groupId>org.apache.maven.plugins</groupId>
69
                <artifactId>maven-release-plugin</artifactId>
70
                <configuration>
71
                    <tagBase>https://devel.gvsig.org/svn/gvsig-projects-pool/${project.artifactId}/tags</tagBase>
72
                </configuration>
73
            </plugin>
74
        </plugins>
75
    </build>
76

  
77

  
78

  
79
    <dependencyManagement>
80
        <dependencies>
81
	    <dependency>
82
                <groupId>org.gvsig</groupId>
83
                <artifactId>org.gvsig.topology</artifactId>
84
                <version>${gvsig.topology.version}</version>
85
                <type>pom</type>
86
                <scope>import</scope>
87
	    </dependency>
88
            <dependency>
89
                <groupId>org.gvsig</groupId>
90
                <artifactId>org.gvsig.vcsgis.lib.api</artifactId>
91
                <version>1.0.11</version>
92
            </dependency>
93
            <dependency>
94
                <groupId>org.gvsig</groupId>
95
                <artifactId>org.gvsig.vcsgis.lib.impl</artifactId>
96
                <version>1.0.11</version>
97
            </dependency>
98
            <dependency>
99
                <groupId>org.gvsig</groupId>
100
                <artifactId>org.gvsig.vcsgis.swing.api</artifactId>
101
                <version>1.0.11</version>
102
            </dependency>
103
            <dependency>
104
                <groupId>org.gvsig</groupId>
105
                <artifactId>org.gvsig.vcsgis.swing.impl</artifactId>
106
                <version>1.0.11</version>
107
            </dependency>
108
            <dependency>
109
                <groupId>org.gvsig</groupId>
110
                <artifactId>org.gvsig.vcsgis.server.webapp</artifactId>
111
                <version>1.0.11</version>
112
                <type>war</type>
113
            </dependency>
114
            <dependency>
115
                <groupId>org.gvsig</groupId>
116
                <artifactId>org.gvsig.vcsgis.server.lib</artifactId>
117
                <version>1.0.11</version>
118
            </dependency>
119
<!--            <dependency>
120
                <groupId>org.apache.httpcomponents</groupId>
121
                <artifactId>httpclient</artifactId>
122
            </dependency>-->
123
        </dependencies>
124
    </dependencyManagement>
125
    
126
    <modules>
127
        <module>org.gvsig.vcsgis.lib</module>
128
        <module>org.gvsig.vcsgis.swing</module>
129
        <module>org.gvsig.vcsgis.app</module>
130
        <module>org.gvsig.vcsgis.server</module>
131
    </modules>
132
</project>
org.gvsig.vcsgis/tags/org.gvsig.vcsgis-1.0.11/org.gvsig.vcsgis.app/org.gvsig.vcsgis.app.mainplugin/src/main/assembly/gvsig-plugin-package.xml
1
<!-- gvSIG. Desktop Geographic Information System. Copyright (C) 2007-2013 gvSIG
2
  Association. This program is free software; you can redistribute it and/or modify
3
  it under the terms of the GNU General Public License as published by the Free Software
4
  Foundation; either version 3 of the License, or (at your option) any later version.
5
  This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
6
  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
7
  PURPOSE. See the GNU General Public License for more details. You should have received
8
  a copy of the GNU General Public License along with this program; if not, write to
9
  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
10
  USA. For any additional information, do not hesitate to contact us at info AT gvsig.com,
11
  or visit our website www.gvsig.com. -->
12
<assembly>
13
  <id>gvsig-plugin-package</id>
14
  <formats>
15
    <format>zip</format>
16
  </formats>
17
  <baseDirectory>${project.artifactId}</baseDirectory>
18
  <includeBaseDirectory>true</includeBaseDirectory>
19
  <files>
20
    <file>
21
      <source>target/${project.artifactId}-${project.version}.jar</source>
22
      <outputDirectory>lib</outputDirectory>
23
    </file>
24
    <file>
25
      <source>target/package.info</source>
26
    </file>
27
  </files>
28

  
29
  <fileSets>
30
    <fileSet>
31
      <directory>src/main/resources-plugin</directory>
32
      <outputDirectory>.</outputDirectory>
33
    </fileSet>
34
  </fileSets>
35

  
36

  
37
  <dependencySets>
38
    <dependencySet>
39
      <useProjectArtifact>false</useProjectArtifact>
40
      <useTransitiveDependencies>false</useTransitiveDependencies>
41
      <outputDirectory>lib</outputDirectory>
42
      <includes>
43
        <include>org.gvsig:org.gvsig.vcsgis.lib.api</include>
44
        <include>org.gvsig:org.gvsig.vcsgis.lib.impl</include>
45
        <include>org.gvsig:org.gvsig.vcsgis.swing.api</include>
46
        <include>org.gvsig:org.gvsig.vcsgis.swing.impl</include>
47
        <!--<include>org.apache.httpcomponents:httpclient</include>-->
48

  
49
        
50
      </includes>
51
    </dependencySet>
52
  </dependencySets>
53

  
54
</assembly>
55

  
org.gvsig.vcsgis/tags/org.gvsig.vcsgis-1.0.11/org.gvsig.vcsgis.app/org.gvsig.vcsgis.app.mainplugin/src/main/java/org/gvsig/vcsgis/app/addlayer/AbstractWizardVCSGis.java
1
package org.gvsig.vcsgis.app.addlayer;
2

  
3
import java.awt.BorderLayout;
4
import java.awt.Cursor;
5
import java.awt.Dimension;
6
import java.awt.event.ActionEvent;
7
import java.awt.event.ItemEvent;
8
import java.net.URL;
9
import java.util.ArrayList;
10
import java.util.Collection;
11
import java.util.HashMap;
12
import java.util.List;
13
import java.util.Map;
14
import javax.swing.ComboBoxModel;
15
import javax.swing.DefaultComboBoxModel;
16
import javax.swing.DefaultListModel;
17
import javax.swing.DefaultListSelectionModel;
18
import javax.swing.ImageIcon;
19
import javax.swing.JOptionPane;
20
import javax.swing.ListModel;
21
import javax.swing.ListSelectionModel;
22
import javax.swing.SwingUtilities;
23
import javax.swing.event.ChangeEvent;
24
import javax.swing.event.ListSelectionEvent;
25
import org.apache.commons.io.FilenameUtils;
26
import org.apache.commons.lang3.StringUtils;
27
import org.cresques.cts.IProjection;
28
import org.gvsig.app.gui.WizardPanel;
29
import org.gvsig.expressionevaluator.Expression;
30
import org.gvsig.expressionevaluator.ExpressionUtils;
31
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingLocator;
32
import org.gvsig.expressionevaluator.swing.ExpressionEvaluatorSwingManager;
33
import org.gvsig.expressionevaluator.swing.ExpressionPickerController;
34
import org.gvsig.fmap.dal.DALLocator;
35
import org.gvsig.fmap.dal.DataManager;
36
import org.gvsig.fmap.dal.DataStoreParameters;
37
import org.gvsig.fmap.dal.DataTypes;
38
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
39
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
40
import org.gvsig.fmap.dal.feature.FeatureStore;
41
import org.gvsig.fmap.dal.feature.FeatureType;
42
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
43
import org.gvsig.fmap.dal.swing.DALSwingLocator;
44
import org.gvsig.fmap.dal.swing.DataSwingManager;
45
import org.gvsig.fmap.dal.swing.dataStoreParameters.DataStoreParametersPanel;
46
import org.gvsig.fmap.dal.swing.dataStoreParameters.DataStoreParametersPanelManager;
47
import org.gvsig.tools.ToolsLocator;
48
import org.gvsig.tools.i18n.I18nManager;
49
import org.gvsig.tools.swing.api.FilteredListController;
50
import org.gvsig.tools.swing.api.JListWithCheckbox;
51
import org.gvsig.tools.swing.api.ToolsSwingLocator;
52
import org.gvsig.tools.swing.api.ToolsSwingManager;
53
import org.gvsig.tools.swing.api.pickercontroller.PickerController;
54
import org.gvsig.tools.swing.api.task.TaskStatusController;
55
import org.gvsig.tools.swing.api.task.TaskStatusSwingManager;
56
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
57
import org.gvsig.tools.swing.api.windowmanager.Dialog;
58
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
59
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
60
import org.gvsig.tools.swing.icontheme.IconTheme;
61
import org.gvsig.tools.util.LabeledValue;
62
import org.gvsig.tools.util.LabeledValueImpl;
63
import org.gvsig.vcsgis.lib.VCSGisEntity;
64
import static org.gvsig.vcsgis.lib.VCSGisManager.ERR_OK;
65
import org.gvsig.vcsgis.lib.workspace.VCSGisWorkspace;
66
import org.gvsig.vcsgis.lib.workspace.VCSGisWorkspaceEntity;
67
import org.gvsig.vcsgis.swing.VCSGisJInitWorkspace;
68
import org.gvsig.vcsgis.swing.VCSGisSwingLocator;
69
import org.gvsig.vcsgis.swing.VCSGisSwingManager;
70
import org.slf4j.Logger;
71
import org.slf4j.LoggerFactory;
72

  
73
/**
74
 *
75
 * @author jjdelcerro
76
 */
77
@SuppressWarnings("UseSpecificCatch")
78
public abstract class AbstractWizardVCSGis extends WizardPanel {
79

  
80
    protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractWizardVCSGis.class);
81

  
82
    protected class TableInfo extends LabeledValueImpl<JDBCStoreParameters> {
83

  
84
        private final ListSelectionModel columnChecksModel;
85
        private FeatureType featureType;
86
        private int geomFieldSelected = -1;
87
        private int idFieldSelected = -1;
88
        private ComboBoxModel<String> idFieldComboModel;
89
        private ComboBoxModel<String> geomFieldComboModel;
90
        private List<FeatureAttributeDescriptor> attributeDescriptors;
91
        private ListModel<LabeledValue<FeatureAttributeDescriptor>> columnsListModel;
92
        private Expression filter;
93
        private IProjection projection;
94
        private boolean selected;
95
        private String documentName;
96

  
97
        public TableInfo(JDBCStoreParameters parameters) {
98
            super(getLabelForTable(parameters), parameters);
99
            this.columnChecksModel = new DefaultListSelectionModel();
100
            this.selected = false;
101
            this.documentName = parameters.getTable();
102
            this.projection = parameters.getCRS();
103
        }
104

  
105
        public String getDocumentName() {
106
            return this.documentName;
107
        }
108

  
109
        public void setDocumentName(String name) {
110
            this.documentName = name;
111
        }
112

  
113
        public boolean isSelected() {
114
            return selected;
115
        }
116

  
117
        public void setSelected(boolean selected) {
118
            this.selected = selected;
119
        }
120

  
121
        public ListSelectionModel getColumnChecksModel() {
122
            return this.columnChecksModel;
123
        }
124

  
125
        public JDBCStoreParameters getParameters() {
126
            JDBCStoreParameters p = this.getValue();
127
            StringBuilder fields = new StringBuilder();
128
            List<FeatureAttributeDescriptor> attributes = this.getAttributeDescriptors();
129
            boolean allSelected = true;
130
            for (int i = 0; i < attributes.size(); i++) {
131
                if (this.columnChecksModel.isSelectedIndex(i)) {
132
                    if (fields.length() > 0) {
133
                        fields.append(",");
134
                    }
135
                    fields.append(attributes.get(i).getName());
136
                    
137
                } else {
138
                    allSelected = false;
139
                }
140
            }
141
            if( !allSelected ) {
142
                p.setFields(fields.toString());
143
            }
144
            p.setPkFields(this.getFieldId());
145
            p.setCRS(this.getProjection());
146
            p.setDefaultGeometryField(this.getGeomField());
147
            if (!ExpressionUtils.isEmpty(this.filter)) {
148
                p.setBaseFilter(this.filter.toString());
149
            } else {
150
                p.setBaseFilter(null);
151
            }
152
            return p;
153
        }
154

  
155
        public void setProjection(IProjection projection) {
156
            this.projection = projection;
157
        }
158

  
159
        public IProjection getProjection() {
160
            return projection;
161
        }
162

  
163
        public String getFieldId() {
164
            if (this.idFieldSelected < 0) {
165
                return null;
166
            }
167
            return this.idFieldComboModel.getElementAt(this.idFieldSelected);
168
        }
169

  
170
        public String getGeomField() {
171
            if (this.geomFieldSelected < 0) {
172
                return null;
173
            }
174
            return this.geomFieldComboModel.getElementAt(this.geomFieldSelected);
175
        }
176

  
177
        public FeatureType getFeatureType() {
178
            if (this.featureType == null) {
179
                DataManager dataManager = DALLocator.getDataManager();
180
                try {
181
                    JDBCStoreParameters params = this.getValue();
182
                    FeatureStore store = (FeatureStore) dataManager.openStore(
183
                            params.getDataStoreName(),
184
                            params
185
                    );
186
                    this.featureType = store.getDefaultFeatureType();
187
                } catch (Exception ex) {
188
                    LOGGER.trace("Can't get feature type.",ex); // To allow set break points
189
                }
190
            }
191
            return this.featureType;
192
        }
193

  
194
        public ComboBoxModel getGeomFieldComboModel() {
195
            if (this.geomFieldComboModel == null) {
196
                DefaultComboBoxModel<String> geomModel = new DefaultComboBoxModel<>();
197
                geomModel.addElement(" ");
198
                int geomIndex = -1;
199
                int n = 1;
200
                for (FeatureAttributeDescriptor attr : this.getAttributeDescriptors()) {
201
                    if (geomIndex < 0 && attr.getType() == DataTypes.GEOMETRY) {
202
                        geomIndex = n;
203
                    }
204
                    int dataType = attr.getType();
205
                    if (dataType == DataTypes.GEOMETRY
206
                            || dataType == DataTypes.BYTEARRAY
207
                            || dataType == DataTypes.STRING) {
208
                        geomModel.addElement(attr.getName());
209
                        n++;
210
                    }
211
                }
212
                if (geomIndex < 0) {
213
                    geomIndex = 0;
214
                }
215
                this.geomFieldComboModel = geomModel;
216
                this.geomFieldSelected = geomIndex;
217
            }
218
            return this.geomFieldComboModel;
219
        }
220

  
221
        public int getGeomFieldSelected() {
222
            return this.geomFieldSelected;
223
        }
224

  
225
        public ComboBoxModel getIdFieldComboModel() {
226
            if (this.idFieldComboModel == null) {
227
                StringBuilder pkName = new StringBuilder();
228
                for (FeatureAttributeDescriptor attr : this.getAttributeDescriptors()) {
229
                    if (attr.isPrimaryKey()) {
230
                        if (!StringUtils.isBlank(pkName)) {
231
                            pkName.append(",");
232
                        }
233
                        pkName.append(attr.getName());
234
                    }
235
                }
236
                DefaultComboBoxModel<String> idsModel = new DefaultComboBoxModel<>();
237
                idsModel.addElement(" ");
238
                int idsIndex = -1;
239
                int n = 1;
240
                if (!StringUtils.isBlank(pkName) && StringUtils.contains(pkName, "/")) {
241
                    idsModel.addElement(pkName.toString());
242
                    idsIndex = n++;
243
                }
244
                for (FeatureAttributeDescriptor attr : getAttributeDescriptors()) {
245
                    if (idsIndex < 0 && attr.isPrimaryKey()) {
246
                        idsIndex = n;
247
                    }
248
                    idsModel.addElement(attr.getName());
249
                    n++;
250
                }
251
                if (idsIndex < 0) {
252
                    idsIndex = 0;
253
                }
254
                this.idFieldComboModel = idsModel;
255
                this.idFieldSelected = idsIndex;
256
            }
257
            return this.idFieldComboModel;
258
        }
259

  
260
        public List<FeatureAttributeDescriptor> getAttributeDescriptors() {
261
            if (this.attributeDescriptors == null) {
262
                List<FeatureAttributeDescriptor> attrs = new ArrayList<>();
263
                for (FeatureAttributeDescriptor attr : this.getFeatureType()) {
264
                    attrs.add(attr);
265
                }
266
                attrs.sort((FeatureAttributeDescriptor o1, FeatureAttributeDescriptor o2) -> 
267
                        o1.getName().compareTo(o2.getName())
268
                );
269
                this.columnChecksModel.setSelectionInterval(0, attrs.size());
270
                this.attributeDescriptors = attrs;
271
            }
272
            return this.attributeDescriptors;
273
        }
274

  
275
        public ListModel<LabeledValue<FeatureAttributeDescriptor>> getColumnsListModel() {
276
            if (this.columnsListModel == null) {
277
                DefaultListModel<LabeledValue<FeatureAttributeDescriptor>> model = new DefaultListModel<>();
278
                for (FeatureAttributeDescriptor attr : this.getAttributeDescriptors()) {
279
                    model.addElement(new LabeledValueImpl<>(
280
                            attr.getName() + " [" + attr.getDataTypeName() + "]",
281
                            attr
282
                    )
283
                    );
284
                }
285
                this.columnsListModel = model;
286
            }
287
            return this.columnsListModel;
288
        }
289

  
290
        public FeatureAttributeDescriptor getAttributeDescriptor(String attrName) {
291
            return this.getFeatureType().getAttributeDescriptor(attrName);
292
        }
293

  
294
        public int getIdFieldSelected() {
295
            return this.idFieldSelected;
296
        }
297

  
298
        public Expression getFilter() {
299
            return this.filter;
300
        }
301

  
302
        public void setFilter(Expression filter) {
303
            this.filter = filter;
304
        }
305

  
306
        private void setIdFieldSelected(int selectedIndex) {
307
            this.idFieldSelected = selectedIndex;
308
        }
309

  
310
        private void setGeomFieldSelected(int selectedIndex) {
311
            this.geomFieldSelected = selectedIndex;
312
        }
313

  
314
        private boolean hasValidValues() {
315
            if (this.getGeomFieldSelected() < 0 && requireGeometry()) {
316
                return false;
317
            }
318
            JDBCStoreParameters p = this.getParameters();
319
            try {
320
                p.validate();
321
                return true;
322
            } catch (ValidateDataParametersException ex) {
323
                return false;
324
            }
325
        }
326

  
327
    }
328

  
329
    private WizardVCSGisViewExtended view;
330
    private PickerController<VCSGisWorkspace> workspacePicker;
331
    private PickerController<IProjection> pickerProjection;
332
    private ExpressionPickerController pickerFilter;
333
    private JListWithCheckbox lwcTables;
334
    private JListWithCheckbox lwcColumns;
335
    protected Map<String, TableInfo> tablesInfo = null;
336
    protected FilteredListController tablesFilterController;
337
    private boolean processing;
338
    private TaskStatusController taskStatusController;
339
    
340
    public AbstractWizardVCSGis() {
341
        initComponents();
342
    }
343

  
344
    private void initComponents() {
345
        DataSwingManager dataSwingManager = DALSwingLocator.getDataSwingManager();
346
        ToolsSwingManager toolsSwingManager = ToolsSwingLocator.getToolsSwingManager();
347
        ExpressionEvaluatorSwingManager expressionSwingManager = ExpressionEvaluatorSwingLocator.getManager();
348
        VCSGisSwingManager swingManager = VCSGisSwingLocator.getVCSGisSwingManager();
349

  
350
        this.view = new WizardVCSGisViewExtended();
351
        
352
        TaskStatusSwingManager taskStatusManager = ToolsSwingLocator.getTaskStatusSwingManager();
353
        
354
        this.taskStatusController = taskStatusManager.createTaskStatusController(
355
                this.view.lblStatusTitle,
356
                this.view.lblStatusMessages,
357
                this.view.pbStatus
358
        );
359
        this.taskStatusController.setShowCancelButton(false);
360
        this.taskStatusController.setShowRemoveTaskButton(false);
361
        this.taskStatusController.bind(ToolsLocator.getTaskStatusManager());
362

  
363
        toolsSwingManager.translate(this.view.btnDeselectAllColumns);
364
        toolsSwingManager.translate(this.view.btnSelectAllColumns);
365
        toolsSwingManager.translate(this.view.lblColumns);
366
        toolsSwingManager.translate(this.view.lblWorkspace);
367
        toolsSwingManager.translate(this.view.lblFilter);
368
        toolsSwingManager.translate(this.view.lblGeometryField);
369
        toolsSwingManager.translate(this.view.lblIdField);
370
        toolsSwingManager.translate(this.view.lblName);
371
        toolsSwingManager.translate(this.view.lblProjection);
372
        toolsSwingManager.translate(this.view.lblTable);
373
        toolsSwingManager.translate(this.view.cboWorkspaces);
374
        toolsSwingManager.translate(this.view.btnAddWorkspace);
375
        toolsSwingManager.translate(this.view.btnCheckout);
376
        toolsSwingManager.translate(this.view.btnAdvancedProperties);
377
        toolsSwingManager.translate(this.view.btnInitWorkspace);
378
        this.view.btnInitWorkspace.setText(toHTML(this.view.btnInitWorkspace.getText()));
379
        toolsSwingManager.translate(this.view.txtRepositoryInfo);
380

  
381
        toolsSwingManager.addClearButton(this.view.txtName);
382
        toolsSwingManager.setDefaultPopupMenu(this.view.txtName);
383
        
384
        this.view.btnInitWorkspace.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
385
        this.view.btnAddWorkspace.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
386
        this.view.btnSelectAllColumns.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
387
        this.view.btnDeselectAllColumns.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
388
        this.view.btnProjection.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
389
        this.view.btnFilter.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
390
        this.view.btnFilterBookmarks.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
391
        this.view.btnFilterHistory.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
392
        this.view.btnAdvancedProperties.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
393
        this.view.btnAdvancedProperties.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
394

  
395
        
396
        
397

  
398
        this.lwcTables = toolsSwingManager.createJListWithCheckbox(
399
                this.view.lstTables
400
        );
401
        this.lwcColumns = toolsSwingManager.createJListWithCheckbox(
402
                this.view.lstColumns
403
        );
404
        
405
        this.workspacePicker = swingManager.createWorkspacePickerController(
406
            this.view.cboWorkspaces,
407
            this.view.btnAddWorkspace
408
        );
409

  
410
        this.workspacePicker.addChangeListener((ChangeEvent e) -> {
411
            doChangeWorkspace();
412
            setEditableTables(true);
413
        });
414

  
415
        
416
        this.pickerProjection = dataSwingManager.createProjectionPickerController(
417
                this.view.txtProjection,
418
                this.view.btnProjection
419
        );
420
        
421
        this.pickerFilter = expressionSwingManager.createExpressionPickerController(
422
                this.view.txtFilter,
423
                this.view.btnFilter,
424
                this.view.btnFilterBookmarks,
425
                this.view.btnFilterHistory
426
        );
427
        this.lwcTables.addListSelectionListener((ListSelectionEvent e) -> {
428
            doChangeTableSelected();
429
        });
430
        this.lwcTables.addChecksListener((ListSelectionEvent e) -> {
431
            doChangeTableSelected();
432
        });
433
        this.view.cboGeometryField.addItemListener((ItemEvent e) -> {
434
            if (e.getStateChange() == ItemEvent.SELECTED) {
435
                doChangeGeometryField();
436
            }
437
        });
438
        this.view.btnDeselectAllColumns.addActionListener((ActionEvent e) -> {
439
            doDeselectAllColumns();
440
        });
441
        this.view.btnSelectAllColumns.addActionListener((ActionEvent e) -> {
442
            doSelectAllColumns();
443
        });
444
        this.view.btnAdvancedProperties.addActionListener((ActionEvent e) -> {
445
            doShowAdvancedProperties();
446
        });
447
        this.view.btnInitWorkspace.addActionListener((ActionEvent e) -> {
448
            doShowInitWorkspace();
449
        });
450

  
451
        this.view.btnCheckout.addActionListener((ActionEvent e) -> {
452
            doCheckout();
453
        });
454

  
455
        
456
        
457
        this.tablesFilterController = toolsSwingManager.createFilteredListController(
458
                this.view.lstTables, 
459
                this.view.txtTablesFilter, 
460
                this.view.btnTablesFilter
461
        );
462

  
463
        this.clearTables();
464
        this.setEditableTables(false);
465

  
466
        this.setLayout(new BorderLayout());
467
        this.add(this.view, BorderLayout.CENTER);
468
        this.setPreferredSize(new Dimension(500, 400));
469
        doUpdateComponents();
470
    }
471

  
472
    protected abstract boolean requireGeometry();
473

  
474
    protected Collection<TableInfo> getTablesInformation() {
475
        this.updateTableInfoFromUI();
476
        if( this.tablesInfo == null ) {
477
            this.tablesInfo = new HashMap<>();
478
        }
479
        return this.tablesInfo.values();
480
    }
481
    
482
    private void doDeselectAllColumns() {
483
        TableInfo info = this.getCurrentTableInfo();
484
        if (info == null) {
485
            return;
486
        }
487
        info.getColumnChecksModel().clearSelection();
488
    }
489

  
490
    private void doSelectAllColumns() {
491
        TableInfo info = this.getCurrentTableInfo();
492
        if (info == null) {
493
            return;
494
        }
495
        info.getColumnChecksModel().setSelectionInterval(0, info.getAttributeDescriptors().size());
496
    }
497

  
498
    private void doShowAdvancedProperties() {
499
        final TableInfo info = this.getCurrentTableInfo();
500
        if (info == null) {
501
            return;
502
        }
503
        this.fetch(info);
504
        I18nManager i18n = ToolsLocator.getI18nManager();
505
        WindowManager_v2 winmgr = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
506
        DataStoreParametersPanelManager paramsPanelManager = DALSwingLocator.getDataStoreParametersPanelManager();
507
        
508
        final DataStoreParametersPanel panel = paramsPanelManager.createDataStoreParametersPanel(info.getParameters());
509
        final Dialog dialog = winmgr.createDialog(
510
                panel.asJComponent(),
511
                i18n.getTranslation("_Connection_parameters"),
512
                null, 
513
                WindowManager_v2.BUTTONS_OK_CANCEL
514
        );
515
        dialog.addActionListener((ActionEvent e) -> {
516
            if( dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
517
                panel.fetchParameters(info.getParameters());
518
            }
519
        });
520
        dialog.show(WindowManager.MODE.DIALOG);
521
    }
522

  
523
    private void clearTables() {
524
        this.lwcTables.setModel(new DefaultListModel());
525
        this.lwcTables.getCheckedModel().clearSelection();
526
        this.clearTableConfig();
527
    }
528

  
529
    private void clearTableConfig() {
530
        this.lwcColumns.setModel(new DefaultListModel());
531
        this.lwcColumns.getCheckedModel().clearSelection();
532
        this.view.txtName.setText("");
533
        this.view.cboGeometryField.setModel(new DefaultComboBoxModel());
534
        this.view.cboIdField.setModel(new DefaultComboBoxModel());
535
        this.pickerProjection.set(null);
536
        this.pickerFilter.set(null);
537
    }
538

  
539
    private void setEditableTables(boolean enable) {
540
        this.view.lstTables.setEnabled(enable);
541
        this.setEditableTableConfig(enable);
542
        this.view.btnDeselectAllColumns.setEnabled(enable);
543
        this.view.btnSelectAllColumns.setEnabled(enable);
544
    }
545

  
546
    private void setEditableTableConfig(boolean enable) {
547
        this.view.lstColumns.setEnabled(enable);
548
        this.view.txtName.setEditable(enable);
549
        this.view.cboGeometryField.setEnabled(enable);
550
        this.view.cboIdField.setEnabled(enable);
551
        this.pickerProjection.setEditable(enable);
552
        this.pickerFilter.setEditable(enable);
553
        this.view.btnAdvancedProperties.setEnabled(enable);
554
    }
555

  
556
    private TableInfo getCurrentTableInfo() {
557
        VCSGisEntity rEntity = getRemoteEntity();
558
        if(rEntity == null){
559
            return null;
560
        }
561
        
562
        TableInfo xx = this.tablesInfo.get(rEntity.getEntityName());
563
        return xx;
564
    }
565

  
566
    private void doChangeGeometryField() {
567
        TableInfo info = this.getCurrentTableInfo();
568
        if (info == null) {
569
            return;
570
        }
571
        String attrName = (String) this.view.cboGeometryField.getSelectedItem();
572
        if (StringUtils.isBlank(attrName)) {
573
            return;
574
        }
575
        FeatureAttributeDescriptor attr = info.getAttributeDescriptor(attrName);
576
        IProjection srs = attr.getSRS();
577
        if (srs == null) {
578
            return;
579
        }
580
        this.pickerProjection.set(srs);
581
    }
582

  
583
    private void doChangeWorkspace() {
584
        if (notInSwingThreadInvokeLater(this::doChangeWorkspace)) {
585
            return;
586
        }
587

  
588
        I18nManager i18n = ToolsLocator.getI18nManager();
589
        VCSGisWorkspace workspace = workspacePicker.get();
590
        this.tablesFilterController.getModel().clear();
591
        if (workspace == null) {
592
            return;
593
        }
594

  
595
        this.view.txtRepositoryInfo.setText(workspace.getRepository().getLabel());
596

  
597
        this.tablesInfo = new HashMap<>();
598
        
599
        //Rellenamos la lista de entidades
600
        Thread task = new Thread(() -> {
601
            try {
602
                processing = true;
603
                doUpdateComponents();
604
                List<VCSGisEntity> repoEntities = workspace.getRepositoryEntities();
605
                List<VCSGisWorkspaceEntity> wsEntities = workspace.getWorkspaceEntities();
606
                doReloadEntitiesList(repoEntities, wsEntities);
607
                
608

  
609
            } catch (Exception e) {
610
                LOGGER.warn("_Cant_retrieve_entities_from_repository", e);
611
                ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
612
                dialogs.messageDialog(
613
                        i18n.getTranslation("_Cant_retrieve_entities_from_repository") + "\n" + e.getMessage(),
614
                        i18n.getTranslation("_Add_table"),
615
                        JOptionPane.WARNING_MESSAGE
616
                );
617

  
618
            } finally {
619
                processing = false;
620
                doUpdateComponents();
621
            }
622
        }, "VCSGisAddTable_getRepositoryEntities");
623

  
624
        processing = true;
625
        doUpdateComponents();
626
        task.start();
627
    }
628
    
629
    
630
//    private void doUpdateTables() {
631
//        JDBCServerExplorerParameters connection = this.pickerConnection.get();
632
//        if (connection == null) {
633
//            this.clearTables();
634
//            return;
635
//        }
636
//        DataManager dataManager = DALLocator.getDataManager();
637
//        DataServerExplorer explorer = null;
638
//        try {
639
//            explorer = dataManager.openServerExplorer(
640
//                    connection.getDataStoreName(),
641
//                    connection
642
//            );
643
//            List<TableInfo> parameters = new ArrayList<>();
644
//            for (DataStoreParameters params : explorer.list()) {
645
//                parameters.add(new TableInfo((JDBCStoreParameters) params));
646
//            }
647
//            parameters.sort((TableInfo o1, TableInfo o2) -> 
648
//                    o1.getLabel().compareTo(o2.getLabel())
649
//            );
650
//            this.tablesInfo = new HashMap<>();
651
//            DefaultListModel<TableInfo> model = new DefaultListModel<>();
652
//            for (TableInfo x : parameters) {
653
//                model.addElement(x);
654
//                this.tablesInfo.put(x.getDocumentName(), x);
655
//            }
656
//            this.lwcTables.setModel(model);
657
//            this.lwcTables.getCheckedModel().clearSelection();
658
//        } catch (Exception ex) {
659
//        } finally {
660
//            DisposeUtils.disposeQuietly(explorer);
661
//        }
662
//    }
663

  
664
    private void doChangeTableSelected() {
665
        if( notInSwingThreadInvokeLater(() -> {doChangeTableSelected();}) ) {
666
            return;
667
        }
668

  
669
        VCSGisEntity rEntity = getRemoteEntity();
670
        VCSGisWorkspaceEntity lEntity;
671
        lEntity = getWorkspace().getWorkspaceEntity(rEntity.getEntityName());
672
        if (lEntity == null) {
673
            this.clearTableConfig();
674
            int index = this.lwcTables.getSelectedIndex();
675
            this.lwcTables.getCheckedModel().removeIndexInterval(index, index);
676
        } else {
677
            TableInfo tableInfo = tablesInfo.get(rEntity.getEntityName());
678
            this.updateTableInfoFromUI();
679
            this.put(tableInfo);
680
        }
681
        showMessage("");
682
        doUpdateComponents();
683
    }
684
    
685
    private void updateTableInfoFromUI() {
686
         String previousTableName = this.view.txtName.getText();
687
         if (this.tablesInfo!=null && !this.tablesInfo.isEmpty()) {
688
         TableInfo previousInfo = this.tablesInfo.get(previousTableName);
689
            if (previousInfo != null) {
690
               this.fetch(previousInfo);
691
           }
692
        }
693
    }
694

  
695
    private void put(TableInfo tableInfo) {
696
        this.lwcColumns.setModel(tableInfo.getColumnsListModel());
697
        this.lwcColumns.setCheckedModel(tableInfo.getColumnChecksModel());
698

  
699
        this.view.cboGeometryField.setModel(tableInfo.getGeomFieldComboModel());
700
        this.view.cboGeometryField.setSelectedIndex(tableInfo.getGeomFieldSelected());
701

  
702
        this.view.cboIdField.setModel(tableInfo.getIdFieldComboModel());
703
        this.view.cboIdField.setSelectedIndex(tableInfo.getIdFieldSelected());
704

  
705
        this.pickerProjection.set(tableInfo.getProjection());
706
        this.pickerFilter.set(tableInfo.getFilter());
707
        this.view.txtName.setText(tableInfo.getDocumentName());
708
    }
709

  
710
    private void fetch(TableInfo tableInfo) {
711
        tableInfo.setIdFieldSelected(this.view.cboIdField.getSelectedIndex());
712
        tableInfo.setGeomFieldSelected(this.view.cboGeometryField.getSelectedIndex());
713
        tableInfo.setFilter(this.pickerFilter.get());
714
        tableInfo.setProjection(this.pickerProjection.get());
715
        tableInfo.setDocumentName(this.view.txtName.getText());
716
        int index = this.lwcTables.getSelectedIndex();
717
        tableInfo.setSelected(this.lwcTables.getCheckedModel().isSelectedIndex(index));
718
    }
719

  
720
    @Override
721
    public void initWizard() {
722
        I18nManager i18n = ToolsLocator.getI18nManager();
723
        setTabName(i18n.getTranslation("_VCSGis"));
724
    }
725

  
726
    @Override
727
    public boolean areSettingsValid() {
728
        if(processing){
729
            return false;
730
        }
731
        boolean hasInvalidValues = false;
732
        boolean hasSelectedTables = false;
733
        for (TableInfo tableInfo : this.getTablesInformation() ) {
734
            if (tableInfo.isSelected()) {
735
                hasSelectedTables = true;
736
                if (!tableInfo.hasValidValues()) {
737
                    hasInvalidValues = true;
738
                }
739
            }
740
        }
741
        return hasSelectedTables && !hasInvalidValues;
742
    }
743

  
744
    @Override
745
    public DataStoreParameters[] getParameters() {
746
        int sz = 0;
747
        for (TableInfo tableInfo : this.getTablesInformation() ) {
748
            if( tableInfo.isSelected() ) {
749
                sz++;
750
            }
751
        }
752
        if( sz == 0 ) {
753
            return null;
754
        }
755
        DataStoreParameters[] dbParameters = new DataStoreParameters[sz];
756
        int n = 0;
757
        for (TableInfo tableInfo : this.getTablesInformation() ) {
758
            if( tableInfo.isSelected() ) {
759
                dbParameters[n++] = tableInfo.getParameters();
760
            }
761
        }
762
        return dbParameters;
763
    }
764
    
765
    @Override
766
    public void execute() {
767
        executeWizard();
768
    }
769

  
770
    @Override
771
    public void close() {
772
        
773
    }
774
    
775
    protected void checkFinishable() {
776
        boolean finishable = areSettingsValid();
777
        callStateChanged(finishable);
778
    }
779
    
780
    private static String getLabelForTable(JDBCStoreParameters parameters) {
781
        String schema = parameters.getSchema();
782
        String tableName = parameters.getTable();
783
        if( StringUtils.isBlank(schema) ) {
784
            return tableName;
785
        }
786
        return schema +"."+tableName;
787
    }
788

  
789
    private void doUpdateComponents() {
790
        VCSGisEntity rEntity = getRemoteEntity();
791
        boolean enabled = (rEntity != null);
792
        VCSGisWorkspace ws = getWorkspace();
793
        if(enabled){
794
            VCSGisWorkspaceEntity lEntity;
795
            lEntity = ws.getWorkspaceEntity(rEntity.getEntityName());
796
            if (lEntity == null) {
797
                this.view.btnCheckout.setEnabled(!processing);
798
                this.setEditableTables(false);
799
            } else {
800
                this.view.btnCheckout.setEnabled(false);
801
                this.setEditableTables(!processing);
802
            }
803
        } else {
804
            this.view.btnCheckout.setEnabled(false);
805
            this.setEditableTables(false);
806
        }
807
//        this.lwcTables.setEnabled(!processing);
808
        this.tablesFilterController.setEnabled(!processing && ws != null);
809
        this.workspacePicker.setEnabled(!processing);
810
        this.view.btnInitWorkspace.setEnabled(!processing);
811
        this.view.txtRepositoryInfo.setEnabled(!processing && ws != null);
812
        this.view.btnAdvancedProperties.setEnabled(!processing && enabled);
813
        this.setVisibleStatus(processing);
814
        this.checkFinishable();
815
    }
816

  
817
    private void doShowInitWorkspace() {
818
        I18nManager i18nManager = ToolsLocator.getI18nManager();
819
        WindowManager_v2 winManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
820
        VCSGisSwingManager swingManager = VCSGisSwingLocator.getVCSGisSwingManager();
821

  
822
        final VCSGisJInitWorkspace panelInitWorkspace = swingManager.createInitWorkspacePanel();
823
        final Dialog dialogInitWorkspace = winManager.createDialog(
824
                panelInitWorkspace.asJComponent(),
825
                i18nManager.getTranslation("_VCS_Initialize_workspace"),
826
                i18nManager.getTranslation("_VCS_Initialize_workspace"),
827
                WindowManager_v2.BUTTONS_OK_CANCEL
828
        );
829

  
830
        panelInitWorkspace.setDialog(dialogInitWorkspace);
831
        dialogInitWorkspace.setButtonLabel(
832
                WindowManager_v2.BUTTON_OK,
833
                i18nManager.getTranslation("_VCS_Initialize_workspace")
834
        );
835
        dialogInitWorkspace.addActionListener((ActionEvent e) -> {
836
            switch (dialogInitWorkspace.getAction()) {
837
                case WindowManager_v2.BUTTON_OK:
838
                    int r = panelInitWorkspace.initializeWorkspace();
839
                    if (r != 0) {
840
                        String message = "_Cant_initialize_workspace_{0}";
841

  
842
                        StringBuilder compoundMessage = new StringBuilder();
843
                        String[] messageArgs = new String[]{panelInitWorkspace.getWorkspaceName()};
844

  
845
                        compoundMessage.append(i18nManager.getTranslation(
846
                                message,
847
                                messageArgs
848
                        ));
849

  
850
                        ThreadSafeDialogsManager dialogsManager = ToolsSwingLocator.getThreadSafeDialogsManager();
851
                        dialogsManager.messageDialog(
852
                                compoundMessage.toString(),
853
                                i18nManager.getTranslation("_VCS_Initialize_workspace"),
854
                                JOptionPane.WARNING_MESSAGE
855
                        );
856
                    }
857

  
858
                    break;
859

  
860
            }
861
        });
862
        dialogInitWorkspace.show(WindowManager.MODE.DIALOG);
863
    }
864

  
865
    public VCSGisWorkspace getWorkspace() {
866
        return this.workspacePicker.get();
867
    }
868

  
869
    private void doReloadEntitiesList(List<VCSGisEntity> repoEntities, List<VCSGisWorkspaceEntity> wsEntities) {
870
        if (notInSwingThreadInvokeLater(() -> {doReloadEntitiesList(repoEntities, wsEntities);}) ) {
871
            return;
872
        }
873
        
874
        I18nManager i18n = ToolsLocator.getI18nManager();
875
        VCSGisSwingManager swingManager = VCSGisSwingLocator.getVCSGisSwingManager();
876
        try {
877
            this.tablesFilterController.getModel().clear();
878
            //Si estamos añadiendo capas, comprobamos que las entidades que tengan geometría (si no, no son capas)
879
            for (VCSGisWorkspaceEntity lEntity : wsEntities) {
880
                if(StringUtils.isNotBlank(lEntity.getGeometryFieldName()) || !requireGeometry()){
881
                    this.tablesFilterController.getModel().addElement(
882
                            new LabeledValueImpl(
883
                                    swingManager.getHTMLColoredForEntity(lEntity, lEntity.getEntityName()),
884
                                    lEntity
885
                            )
886
                    );
887
                        JDBCStoreParameters parameters = getWorkspace().getExplorer().get(lEntity.getEntityName());
888
                        this.tablesInfo.put(lEntity.getEntityName(), new TableInfo(parameters));
889
                }
890
            }
891
            // Si estamos añadiendo capas, comprobamos que las entidades que tengan geometría (si no, no son capas)
892
            // Además, si ya pertenecen al workspace nos las saltamos
893
            for (VCSGisEntity rEntity : repoEntities) {
894
                if(StringUtils.isNotBlank(rEntity.getGeometryFieldName()) || !requireGeometry()){
895
                    VCSGisWorkspaceEntity lEntity = getWorkspace().getWorkspaceEntity(rEntity.getEntityName());
896
                    if(lEntity == null){
897
                        this.tablesFilterController.getModel().addElement(
898
                                new LabeledValueImpl(
899
                                        swingManager.getHTMLColoredForEntity(lEntity, rEntity.getEntityName()),
900
                                        rEntity
901
                                )
902
                        );
903
                    }
904
                }
905
            }
906
        } catch (Exception e) {
907
            LOGGER.warn("_Cant_update_layers_list", e);
908
            ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
909
            dialogs.messageDialog(
910
                    i18n.getTranslation("_Cant_update_layers_list")+"\n"+e.getMessage(), 
911
                    i18n.getTranslation("_Add_layer"), 
912
                    JOptionPane.WARNING_MESSAGE
913
            );
914
        }
915
    }
916

  
917
    private void doCheckout() {
918
        VCSGisWorkspace workspace = getWorkspace();
919
        if (workspace == null) {
920
            return;
921
        }
922
        ThreadSafeDialogsManager dialogs = ToolsSwingLocator.getThreadSafeDialogsManager();
923
        I18nManager i18n = ToolsLocator.getI18nManager();
924
        VCSGisEntity rEntity = getRemoteEntity();
925
        VCSGisWorkspaceEntity lEntity = workspace.getWorkspaceEntity(rEntity.getEntityName());
926
        if (lEntity != null) {
927
            return;
928
        }
929
        Thread task = new Thread(() -> {
930
            try {
931
                processing = true;
932
                doUpdateComponents();
933

  
934
                showMessage(i18n.getTranslation("_Checking_out"));
935
                int res = workspace.checkout(
936
                        rEntity.getEntityName(),
937
                        null,
938
                        this.getTaskStatusController().getSimpleTaskStatus()
939
                );
940
                if (res != ERR_OK) {
941
                    LOGGER.warn("_Cant_checkout_table");
942
                    dialogs.messageDialog(
943
                            i18n.getTranslation("_Cant_checkout_table") + "\n" + workspace.getErrorMessage(res),
944
                            i18n.getTranslation("_Add_table"),
945
                            JOptionPane.WARNING_MESSAGE
946
                    );
947
                    return;
948
                }
949
                showMessage(i18n.getTranslation("_Checkout_finished"));
950
                JDBCStoreParameters parameters = getWorkspace().getExplorer().get(rEntity.getEntityName());
951
                this.tablesInfo.put(rEntity.getEntityName(), new TableInfo(parameters));
952
                doChangeTableSelected();
953
            } catch (Exception e) {
954
                LOGGER.warn("_Cant_add_table");
955
                dialogs.messageDialog(
956
                        i18n.getTranslation("_Cant_add_table") + "\n" + e.getMessage(),
957
                        i18n.getTranslation("_Add_table"),
958
                        JOptionPane.WARNING_MESSAGE
959
                );
960
            } finally {
961
                processing = false;
962
                doUpdateComponents();
963
            }
964
        }, "VCSGisAddTableCheckout");
965
        processing = true;
966
        doUpdateComponents();
967
        task.start();
968
    }
969

  
970
    private VCSGisEntity getRemoteEntity() {
971
        LabeledValue<VCSGisEntity> value = (LabeledValue<VCSGisEntity>) this.lwcTables.getSelectedValue();
972
        if(value == null){
973
            return null;
974
        }
975
        return value.getValue();
976
    }
977
    
978
    private void showMessage(String message) {
979
        if( notInSwingThreadInvokeLater(() -> {showMessage(message);}) ) {
980
            return;
981
        }
982
        this.view.lblStatusMessages.setText(message);
983
    }
984
    
985
        public boolean isProcessing() {
986
        return processing;
987
    }
988
    
989
    public void setVisibleStatus(boolean visible) {
990
        if( notInSwingThreadInvokeLater(() -> {setVisibleStatus(visible);}) ) {
991
            return;
992
        }
993
        this.view.lblStatusTitle.setVisible(visible);
994
        this.view.pbStatus.setVisible(visible);
995
        this.view.lblStatusMessages.setVisible(true);
996
    }
997

  
998
    public TaskStatusController getTaskStatusController() {
999
        return this.taskStatusController;
1000
    }
1001

  
1002
    public static boolean notInSwingThreadInvokeLater(Runnable x) {
1003
        if( SwingUtilities.isEventDispatchThread() ) {
1004
            return false;
1005
        }
1006
        SwingUtilities.invokeLater(x);
1007
        return true;
1008
    }
1009
    
1010
    private static class WizardVCSGisViewExtended extends AbstractWizardVCSGisView {
1011

  
1012
        @Override
1013
        public ImageIcon loadImage(String imageName) {
1014
            String name = FilenameUtils.getBaseName(imageName);
1015
            IconTheme theme = ToolsSwingLocator.getIconThemeManager().getDefault();
1016
            if (theme.exists(name)) {
1017
                return theme.get(name);
1018
            }
1019
            URL url = WizardVCSGisViewExtended.class.getResource("images/" + name + ".png");
1020
            if (url == null) {
1021
                return null;
1022
            }
1023
            return new ImageIcon(url);
1024
        }
1025
    }
1026

  
1027
    private String toHTML(String s) {
1028
      s = StringUtils.replace(s, "\n", "<br>");
1029
      s = StringUtils.replace(s, "<html>", "");
1030
      s = StringUtils.replace(s, "</html>", "");
1031
      s = "<html>"+s+"</html>";
1032
      return s;
1033
    }
1034

  
1035
}
org.gvsig.vcsgis/tags/org.gvsig.vcsgis-1.0.11/org.gvsig.vcsgis.app/org.gvsig.vcsgis.app.mainplugin/src/main/java/org/gvsig/vcsgis/app/addlayer/WizardVCSGisVectorial.java
1
package org.gvsig.vcsgis.app.addlayer;
2

  
3
import java.awt.event.ActionEvent;
4
import java.util.ArrayList;
5
import java.util.Arrays;
6
import java.util.List;
7
import java.util.Map;
8
import javax.swing.SwingUtilities;
9
import org.apache.commons.codec.binary.Hex;
10
import org.apache.commons.lang3.StringUtils;
11
import org.gvsig.andami.PluginServices;
12
import org.gvsig.andami.PluginsLocator;
13
import org.gvsig.andami.PluginsManager;
14
import org.gvsig.fmap.dal.DALLocator;
15
import org.gvsig.fmap.dal.DataManager;
16
import org.gvsig.fmap.dal.DataStore;
17
import org.gvsig.fmap.dal.DataStoreParameters;
18
import org.gvsig.fmap.dal.exception.DataException;
19
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
20
import org.gvsig.fmap.dal.feature.FeatureSet;
21
import org.gvsig.fmap.dal.feature.FeatureStore;
22
import org.gvsig.fmap.dal.store.db.DBStoreParameters;
23
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorer;
24
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
25
import org.gvsig.fmap.mapcontext.MapContext;
26
import org.gvsig.fmap.mapcontext.MapContextLocator;
27
import org.gvsig.fmap.mapcontext.MapContextManager;
28
import org.gvsig.fmap.mapcontext.layers.CancelationException;
29
import org.gvsig.fmap.mapcontext.layers.FLayer;
30
import org.gvsig.fmap.mapcontext.layers.FLayers;
31
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
32
import org.gvsig.fmap.mapcontrol.MapControl;
33
import org.gvsig.geodb.ExtDB_Spatial;
34
import org.gvsig.geodb.vectorialdb.visibility.LayerScaleVisibility;
35
import org.gvsig.geodb.vectorialdb.visibility.VisibilityScaleSelector;
36
import org.gvsig.tools.ToolsLocator;
37
import org.gvsig.tools.dispose.DisposeUtils;
38
import org.gvsig.tools.dynobject.DynObject;
39
import org.gvsig.tools.i18n.I18nManager;
40
import org.gvsig.tools.swing.api.ToolsSwingLocator;
41
import org.gvsig.tools.swing.api.windowmanager.Dialog;
42
import org.gvsig.tools.swing.api.windowmanager.WindowManager;
43
import org.gvsig.tools.swing.api.windowmanager.WindowManager_v2;
44
import org.gvsig.vcsgis.app.VCSGisExtension;
45
import static org.gvsig.vcsgis.app.addlayer.AbstractWizardVCSGis.LOGGER;
46

  
47
/**
48
 *
49
 * @author gvSIG Team
50
 */
51
@SuppressWarnings("UseSpecificCatch")
52
public class WizardVCSGisVectorial extends AbstractWizardVCSGis {
53
    
54
    public static final int NUMBER_OF_FEATURES_TO_ASK_FOR_VISIBILITY_SCALE = 10000;
55
    public static final String LAYERS_SCALE_VISIBILITY_PARAMETER="layersScaleVisibility";
56

  
57
    public WizardVCSGisVectorial() {
58
        super();
59
    }
60

  
61
    @Override
62
    protected boolean requireGeometry() {
63
        return true;
64
    }
65

  
66
    @Override
67
    public Object executeWizard() {
68
        DataManager man = DALLocator.getDataManager();
69
        MapContextManager mapContextManager = MapContextLocator.getMapContextManager();
70

  
71
        MapControl mapControl = this.getMapCtrl();
72
        MapContext mapContext = mapControl.getMapContext();
73

  
74
        String groupName = null;
75
        List<FLayer> all_layers = new ArrayList();
76

  
77
        try {
78
            FLayer layer = null;
79
            for (TableInfo tableInfo : this.getTablesInformation()) {
80
                if (!tableInfo.isSelected()) {
81
                    continue;
82
                }
83
                DBStoreParameters parameter = tableInfo.getParameters();
84
                if (groupName == null) {
85
                    String dbname = parameter.getDBName();
86
                    if (StringUtils.isEmpty(dbname)) {
87
                        dbname = "Group";
88
                    }
89
                    String host = parameter.getHost();
90
                    if (StringUtils.isEmpty(host)) {
91
                        groupName = dbname;
92
                    } else {
93
                        groupName = dbname + " (" + host + ")";
94
                    }
95
                }
96
                FeatureStore store;
97
                try {
98
                    store = (FeatureStore) man.openStore(
99
                            parameter.getDataStoreName(),
100
                            parameter);
101
                } catch (Exception e) {
102
                    LOGGER.warn("While opening DB store.", e);
103
                    return null;
104
                }
105
                try {
106

  
107
                    layer = mapContextManager.createLayer(
108
                            tableInfo.getDocumentName(),
109
                            store
110
                    );
111
                    checkForVisibilityScale(layer);
112
                    all_layers.add(layer);
113
                } catch (Exception e) {
114
                    LOGGER.warn("Can't create layer '" + tableInfo.getDocumentName() + "'.", e);
115
                } finally {
116
                    DisposeUtils.disposeQuietly(store);
117
                }
118
            }
119

  
120
            if (all_layers.size() > 1) {
121
                FLayers group = new FLayers();
122
                group.setMapContext(mapContext);
123
                group.setParentLayer(mapContext.getLayers());
124
                group.setName(groupName);
125

  
126
                for (FLayer aLayer : all_layers) {
127
                    group.addLayer(aLayer);
128
                }
129
                if ( group.isOk() ) {
130
                    group.setVisible(true);
131
                    mapContext.beginAtomicEvent();
132
                    try {
133
                        mapControl.addLayer(group);
134
                        group.dispose();
135
                    } catch (CancelationException e) {
136
                        LOGGER.warn("Can't add group to mapcontext layers.", e);
137
                    } finally {
138
                        mapContext.endAtomicEvent();
139
                    }
140
                } else {
141
                    fireLayerErrorEvent(layer, mapControl);
142
                }
143

  
144
            } else if (all_layers.size() == 1) {
145
                layer = (FLayer) all_layers.get(0);
146
                if ( layer.isOk() ) {
147
                    layer.setVisible(true);
148
                    mapContext.beginAtomicEvent();
149
                    try {
150
                        mapControl.addLayer(layer);
151
                    } catch (CancelationException e) {
152
                        LOGGER.warn("Can't add group to mapcontext layers.", e);
153
                    } finally {
154
                        mapContext.endAtomicEvent();
155
                    }
156
                } else {
157
                    fireLayerErrorEvent(layer, mapControl);
158
                }
159
            }
160

  
161
        } finally {
162
            // Dispose all created layers. If they have been included into
163
            // a FLayers object, they will have been binded there.
164
            for (FLayer layer : all_layers) {
165
                layer.dispose();
166
            }
167
        }
168
        return null;
169
    }
170

  
171
    private void fireLayerErrorEvent(FLayer lyr, MapControl mapControl) {
172
        mapControl.getMapContext().callNewErrorEvent(null);
173
    }
174
    
175
    
176
    private void checkForVisibilityScale(FLayer layer) throws DataException, ValidateDataParametersException {
177
        
178
        PluginsManager pluginManager = PluginsLocator.getPluginsManager();
179
        PluginServices plugin = pluginManager.getPlugin(ExtDB_Spatial.class);
180
        DynObject pluginProperties = plugin.getPluginProperties();
181
        
182
        Map<String, LayerScaleVisibility> layersScaleVisibility = (Map) pluginProperties.getDynValue(LAYERS_SCALE_VISIBILITY_PARAMETER);
183
        String layerKey = buildLayerKey(layer);
184
        if(layerKey != null) {
185
            LayerScaleVisibility layerScaleVisibility = layersScaleVisibility.get(layerKey);
186
            if(layerScaleVisibility!=null){
187
                int scaleAboveDenominator = layerScaleVisibility.getScaleAboveDenominator();
188
                int scaleBelowDenominator = layerScaleVisibility.getScaleBelowDenominator();
189

  
190
                layer.setMaxScale(scaleAboveDenominator);
191
                layer.setMinScale(scaleBelowDenominator);
192
                return;
193
            }
194
        }
195
        
196
        if (layer instanceof FLyrVect) {
197
            FLyrVect lyrVect = (FLyrVect)layer;
198
            FeatureStore store = lyrVect.getFeatureStore();
199
            
200
            if(store.getExplorer() instanceof JDBCServerExplorer) {
201
                FeatureSet fset = store.getFeatureSet();
202
                if(fset.size()>NUMBER_OF_FEATURES_TO_ASK_FOR_VISIBILITY_SCALE) {
203
                    askUserForVisibilityScale(layer);
204
                }
205
                DisposeUtils.disposeQuietly(fset);
206
            }
207
        }
208
    }
209

  
210
    private void askUserForVisibilityScale(FLayer layer) {
211
        if (!SwingUtilities.isEventDispatchThread()) {
212
            try {
213
                SwingUtilities.invokeAndWait(() -> {askUserForVisibilityScale(layer);});
214
            } catch (Exception ex) {
215
                LOGGER.warn("Con show selection wisivility scale dialog.", ex);
216
            }
217
            return;
218
        }
219
        I18nManager i18n = ToolsLocator.getI18nManager();
220
        WindowManager_v2 winManager = (WindowManager_v2) ToolsSwingLocator.getWindowManager();
221
        
222
        VisibilityScaleSelector visibilityScaleSelector = new VisibilityScaleSelector();
223
        Dialog dialog = winManager.createDialog(
224
                visibilityScaleSelector.asJComponent(), 
225
                i18n.getTranslation("select_visibility_scale"), 
226
                null, 
227
                WindowManager_v2.BUTTONS_OK_CANCEL
228
        );
229
        dialog.addActionListener((ActionEvent e) -> {
230
            if (dialog.getAction()==WindowManager_v2.BUTTON_OK ) {
231
                layer.setMaxScale(visibilityScaleSelector.getScaleAboveDenominator());
232
                layer.setMinScale(visibilityScaleSelector.getScaleBelowDenominator());
233
                if(visibilityScaleSelector.getRememberAnswer()){
234
                    PluginsManager pluginManager = PluginsLocator.getPluginsManager();
235
                    PluginServices plugin = pluginManager.getPlugin(ExtDB_Spatial.class);
236
                    DynObject pluginProperties = plugin.getPluginProperties();
237
                    String layerKey = buildLayerKey(layer);
238
                    String layerLabel = buildLayerLabel(layer);
239
                    if(layerKey != null && layerLabel != null){
240
                        Map<String, LayerScaleVisibility> layersScaleVisibility = (Map) pluginProperties.getDynValue(LAYERS_SCALE_VISIBILITY_PARAMETER);
241
                        LayerScaleVisibility layerScaleVisibility = new LayerScaleVisibility();
242
                        layerScaleVisibility.setScaleAboveDenominator(visibilityScaleSelector.getScaleAboveDenominator());
243
                        layerScaleVisibility.setScaleBelowDenominator(visibilityScaleSelector.getScaleBelowDenominator());
244
                        layerScaleVisibility.setLabel(layerLabel);
245
                        layersScaleVisibility.put(layerKey, layerScaleVisibility);
246
                    }
247
                }
248
            }
249
        });
250
        dialog.show(WindowManager.MODE.DIALOG);
251
    }
252

  
253
    private String buildLayerKey(FLayer layer) {
254
        if(layer!=null){
255
            DataStore dataStore = ((FLyrVect)layer).getDataStore();
256
            if(dataStore != null){
257
                DataStoreParameters parameters = dataStore.getParameters();
258
                if(parameters != null){
259
                    return Arrays.toString(Hex.encodeHex(parameters.toByteArray()));
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff