Statistics
| Revision:

gvsig-lrs / org.gvsig.lrs / trunk / org.gvsig.lrs / org.gvsig.lrs.swing / org.gvsig.lrs.swing.impl / src / main / java / org / gvsig / lrs / swing / impl / JLrsGenerateDynamicSegmentationParamsController.java @ 11

History | View | Annotate | Download (30 KB)

1
/*
2
 * Copyright 2015 DiSiD Technologies S.L.L. All rights reserved.
3
 *
4
 * Project  : DiSiD org.gvsig.lrs.swing.impl
5
 * SVN Id   : $Id$
6
 */
7
package org.gvsig.lrs.swing.impl;
8

    
9
import java.awt.event.ActionEvent;
10
import java.awt.event.ActionListener;
11
import java.awt.event.ItemEvent;
12
import java.awt.event.ItemListener;
13
import java.io.File;
14
import java.util.List;
15
import java.util.Locale;
16

    
17
import javax.swing.JComponent;
18
import javax.swing.JOptionPane;
19
import javax.swing.ListCellRenderer;
20

    
21
import org.apache.commons.io.FileUtils;
22
import org.apache.commons.lang3.StringUtils;
23
import org.apache.commons.lang3.mutable.MutableBoolean;
24
import org.cresques.cts.IProjection;
25
import org.gvsig.fmap.dal.DALLocator;
26
import org.gvsig.fmap.dal.DataManager;
27
import org.gvsig.fmap.dal.DataStoreParameters;
28
import org.gvsig.fmap.dal.exception.DataException;
29
import org.gvsig.fmap.dal.exception.ReadException;
30
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
31
import org.gvsig.fmap.dal.feature.FeatureStore;
32
import org.gvsig.fmap.dal.feature.FeatureType;
33
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
34
import org.gvsig.fmap.dal.store.shp.SHPNewStoreParameters;
35
import org.gvsig.fmap.geom.DataTypes;
36
import org.gvsig.fmap.geom.Geometry;
37
import org.gvsig.fmap.mapcontext.layers.FLayer;
38
import org.gvsig.fmap.mapcontext.layers.operations.LayerCollection;
39
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
40
import org.gvsig.lrs.lib.api.LrsAlgorithmParams;
41
import org.gvsig.lrs.lib.api.LrsAlgorithmsLocator;
42
import org.gvsig.lrs.lib.api.LrsAlgorithmsManager;
43
import org.gvsig.lrs.lib.api.LrsGenerateDynamicSegmentationAlgorithmParams;
44
import org.gvsig.lrs.lib.api.exceptions.LrsGettingParametersException;
45
import org.gvsig.lrs.lib.api.exceptions.LrsNeededParameterException;
46
import org.gvsig.lrs.swing.api.JLrsAlgorithmParams;
47
import org.gvsig.tools.ToolsLocator;
48
import org.gvsig.tools.exception.BaseException;
49
import org.gvsig.tools.i18n.I18nManager;
50
import org.gvsig.tools.swing.api.ActionListenerSupport;
51
import org.gvsig.tools.swing.api.ToolsSwingLocator;
52
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
53
import org.gvsig.tools.visitor.VisitCanceledException;
54
import org.gvsig.tools.visitor.Visitor;
55
import org.slf4j.Logger;
56
import org.slf4j.LoggerFactory;
57

    
58
public class JLrsGenerateDynamicSegmentationParamsController extends
59
    JLrsGenerateDynamicSegmentationParamsView implements JLrsAlgorithmParams {
60

    
61
    private static final Logger logger = LoggerFactory
62
        .getLogger(JLrsGenerateDynamicSegmentationParamsController.class);
63

    
64
    private boolean canceled;
65
    private ActionListenerSupport listeners =
66
        ToolsSwingLocator.getToolsSwingManager().createActionListenerSupport();
67

    
68
    private LayerCollection layers;
69
    private List<FeatureStore> tables;
70

    
71
    /**
72
     * @param layers
73
     * @throws LrsNeededParameterException
74
     *
75
     */
76
    public JLrsGenerateDynamicSegmentationParamsController(
77
        LayerCollection layers, List<FeatureStore> tables,
78
        LrsAlgorithmParams params) throws LrsNeededParameterException {
79
        super();
80
        this.layers = layers;
81
        this.tables = tables;
82
        initComponents();
83
        translate();
84
        setParams(params);
85
    }
86

    
87
    public void addActionListener(ActionListener listener) {
88
        listeners.addActionListener(listener);
89
    }
90

    
91
    public void removeActionListener(ActionListener listener) {
92
        listeners.removeActionListener(listener);
93
    }
94

    
95
    private void translate() {
96
        I18nManager i18nManager = ToolsLocator.getI18nManager();
97

    
98
        lblInputLayer
99
            .setText(i18nManager.getTranslation(lblInputLayer.getText()));
100
        lblIdRouteField
101
            .setText(i18nManager.getTranslation(lblIdRouteField.getText()));
102
        lblTable.setText(i18nManager.getTranslation(lblTable.getText()));
103
        lblTableIdRouteField.setText(
104
            i18nManager.getTranslation(lblTableIdRouteField.getText()));
105
        lblLandmarkField
106
            .setText(i18nManager.getTranslation(lblLandmarkField.getText()));
107
        lblFinalLandmarkField.setText(
108
            i18nManager.getTranslation(lblFinalLandmarkField.getText()));
109
        lblValueField
110
            .setText(i18nManager.getTranslation(lblValueField.getText()));
111
        lblOutputFile
112
            .setText(i18nManager.getTranslation(lblOutputFile.getText()));
113

    
114
        btnBrowser.setText("\u2026");
115
        btnAccept.setText(i18nManager.getTranslation(btnAccept.getText()));
116
        btnCancel.setText(i18nManager.getTranslation(btnCancel.getText()));
117

    
118
    }
119

    
120
    /**
121
     *
122
     */
123
    public void setLocate(Locale locale) {
124
        Locale l = super.getLocale();
125
        if (!l.equals(locale)) {
126
            translate();
127
        }
128
        super.setLocale(locale);
129
    }
130

    
131
    /**
132
     * Validates it is a curve layer with at least 1 non-geometric
133
     * field
134
     * if it is not correct throws an exception
135
     *
136
     * @throws LrsNeededParameterException
137
     * @throws ReadException
138
     */
139
    public static void validateLayers(LayerCollection layers)
140
        throws LrsNeededParameterException {
141
        logger.debug("Validating layer for Generate Dynamic Segmentation");
142
        if (layers == null || layers.getLayersCount() < 1) {
143
            logger.error("A layer is needed");
144
            throw new LrsNeededParameterException("a_layer_is_needed", null);
145
        }
146

    
147
        if (!correctLayerFound(layers)) {
148
            logger.error("Impossible to find the layer needed");
149
            throw new LrsNeededParameterException(
150
                "impossible_to_find_needed_layer", null);
151
        }
152
    }
153

    
154
    /**
155
     * Validates if there is a valid table:
156
     * - at least two fields
157
     * - one of them is numeric
158
     * if can't find any throws an exception
159
     *
160
     * @throws LrsNeededParameterException
161
     * @throws ReadException
162
     */
163
    public static void validateTables(List<FeatureStore> tables)
164
        throws LrsNeededParameterException {
165
        logger.debug("Validating tables for Generate Dynamic Segmentation");
166
        if (tables == null || tables.size() < 1) {
167
            logger.error("A table is needed");
168
            throw new LrsNeededParameterException("a_table_is_needed", null);
169
        }
170

    
171
        if (!correctTableFound(tables)) {
172
            logger.error("Impossible to find the layer needed");
173
            throw new LrsNeededParameterException(
174
                "impossible_to_find_needed_layer", null);
175
        }
176
    }
177

    
178
    /**
179
     * @throws LrsNeededParameterException
180
     */
181
    private void initComponents() throws LrsNeededParameterException {
182

    
183
        validateLayers(layers);
184
        validateTables(tables);
185

    
186
        // Modelos de los combos
187
        FLayersComboBoxModel inputLayerModel =
188
            new FLayersComboBoxModel(this.layers);
189
        FeatureAttributeDescriptorsComboBoxModel idRouteFieldComboBoxModel =
190
            new FeatureAttributeDescriptorsComboBoxModel();
191

    
192
        FeatureStoresComboBoxModel tableLayerModel =
193
            new FeatureStoresComboBoxModel(this.tables);
194

    
195
        FeatureAttributeDescriptorsComboBoxModel tableIdRouteFieldComboBoxModel =
196
            new FeatureAttributeDescriptorsComboBoxModel();
197
        FeatureAttributeDescriptorsComboBoxModel landmarkComboBoxModel =
198
            new FeatureAttributeDescriptorsComboBoxModel();
199
        FeatureAttributeDescriptorsComboBoxModel finalLandmarkComboBoxModel =
200
            new FeatureAttributeDescriptorsComboBoxModel();
201
        FeatureAttributeDescriptorsComboBoxModel valueComboBoxModel =
202
            new FeatureAttributeDescriptorsComboBoxModel();
203

    
204
        // Renderer para los combos de attributeDescriptors
205
        ListCellRenderer featureAttributeDescriptorCellRenderer =
206
            new FLayersAttributeDescriptorCellRenderer();
207
        // asignaci?n de renderers y modelos
208
        cmbIdRouteField.setRenderer(featureAttributeDescriptorCellRenderer);
209
        cmbTableIdRouteField
210
            .setRenderer(featureAttributeDescriptorCellRenderer);
211
        cmbLandmarkField.setRenderer(featureAttributeDescriptorCellRenderer);
212
        cmbFinalLandmarkField
213
            .setRenderer(featureAttributeDescriptorCellRenderer);
214
        cmbValueField.setRenderer(featureAttributeDescriptorCellRenderer);
215
        cmbIdRouteField.setModel(idRouteFieldComboBoxModel);
216
        cmbTableIdRouteField.setModel(tableIdRouteFieldComboBoxModel);
217
        cmbLandmarkField.setModel(landmarkComboBoxModel);
218
        cmbFinalLandmarkField.setModel(finalLandmarkComboBoxModel);
219
        cmbValueField.setModel(valueComboBoxModel);
220

    
221
        // renderer para el combo de capas
222
        ListCellRenderer layerNameCellRenderer =
223
            new FLayersLayerNameCellRenderer();
224
        ListCellRenderer featureStorerNameCellRenderer =
225
            new FeatureStoreNameCellRenderer();
226
        cmbInputLayer.setRenderer(layerNameCellRenderer);
227
        cmbTable.setRenderer(featureStorerNameCellRenderer);
228
        // asignaci?n modelo al combo de capas
229
        cmbInputLayer.setModel(inputLayerModel);
230
        cmbTable.setModel(tableLayerModel);
231

    
232
        // listener del combo de capas para que actualice el resto de
233
        // componentes
234
        cmbInputLayer.addItemListener(new ItemListener() {
235

    
236
            public void itemStateChanged(ItemEvent e) {
237
                Object item = e.getItem();
238
                if (item instanceof FLyrVect) {
239
                    FLyrVect layer = (FLyrVect) item;
240
                    updateLayerSource(layer);
241
                }
242
            }
243
        });
244
        cmbTable.addItemListener(new ItemListener() {
245

    
246
            public void itemStateChanged(ItemEvent e) {
247
                Object item = e.getItem();
248
                if (item instanceof FeatureStore) {
249
                    FeatureStore featureStore = (FeatureStore) item;
250
                    updateTable(featureStore);
251
                }
252
            }
253
        });
254

    
255
        this.btnBrowser.addActionListener(new ActionListener() {
256

    
257
            public void actionPerformed(ActionEvent e) {
258
                doSelectOuputFile();
259
            }
260
        });
261

    
262
        this.btnAccept.addActionListener(new ActionListener() {
263

    
264
            public void actionPerformed(ActionEvent e) {
265
                canceled = false;
266
                doClose();
267
                listeners.fireActionEvent(new ActionEvent(
268
                    JLrsGenerateDynamicSegmentationParamsController.this, 0,
269
                    "accept"));
270

    
271
            }
272
        });
273

    
274
        this.btnCancel.addActionListener(new ActionListener() {
275

    
276
            public void actionPerformed(ActionEvent e) {
277
                canceled = true;
278
                doClose();
279
                listeners.fireActionEvent(new ActionEvent(
280
                    JLrsGenerateDynamicSegmentationParamsController.this, 0,
281
                    "cancel"));
282
            }
283
        });
284

    
285
        setVisibleAceptCancel(false);
286
        canceled = false;
287
    }
288

    
289
    private void doSelectOuputFile() {
290
        final I18nManager i18nManager = ToolsLocator.getI18nManager();
291
        ThreadSafeDialogsManager manager =
292
            ToolsSwingLocator.getThreadSafeDialogsManager();
293
        File[] files = manager.showSaveFileDialog(
294
            i18nManager.getTranslation("output_file"), null);
295
        if (files != null && files.length > 0) {
296
            File file = files[0];
297
            String absolutePath = file.getAbsolutePath();
298
            if (!StringUtils.endsWithIgnoreCase(absolutePath, ".shp")) {
299
                absolutePath = new StringBuilder().append(absolutePath)
300
                    .append(".shp").toString();
301
            }
302
            File outputFile = FileUtils.getFile(absolutePath);
303
            if (outputFile.exists()) {
304
                int resp = JOptionPane.showOptionDialog(this.asJComponent(),
305
                    i18nManager.getTranslation(
306
                        "file_already_exists_do_you_want_overwrite_it"),
307
                    i18nManager.getTranslation("output_file"),
308
                    JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,
309
                    null, null, JOptionPane.OK_OPTION);
310
                if (resp == JOptionPane.OK_OPTION) {
311
                    this.txtOutputFile.setText(absolutePath);
312
                } else {
313
                    doSelectOuputFile();
314
                }
315
            } else {
316
                this.txtOutputFile.setText(absolutePath);
317
            }
318
        }
319

    
320
    }
321

    
322
    private void doClose() {
323
        this.setVisible(false);
324
    }
325

    
326
    public boolean isCanceled() {
327
        return this.canceled;
328
    }
329

    
330
    public void setVisibleAceptCancel(boolean visible) {
331
        this.btnAccept.setVisible(visible);
332
        this.btnCancel.setVisible(visible);
333
    }
334

    
335
    public boolean getVisibleAceptCancel() {
336
        return this.btnAccept.isVisible();
337
    }
338

    
339
    public JComponent asJComponent() {
340
        return this;
341
    }
342

    
343
    public LrsAlgorithmParams getParams()  throws LrsGettingParametersException, LrsNeededParameterException {
344
        LrsAlgorithmsManager manager = LrsAlgorithmsLocator.getLrsAlgorithmsManager();
345
        LrsGenerateDynamicSegmentationAlgorithmParams params =manager.createLrsGenerateDynamicSegmentationAlgorithmParams();
346

    
347
        // Recorrer todo del interfaz y rellenar los parametros
348

    
349
        //cmbInputLayer
350
        if (!(this.cmbInputLayer.getSelectedItem() instanceof FLyrVect)){
351
            logger.error("Error getting selected item from cmbInputLayer");
352
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbInputLayer", null);
353
        }
354
        FLyrVect fLyrVect = (FLyrVect) this.cmbIdRouteField.getSelectedItem();
355
        if (!(fLyrVect.getFeatureStore() instanceof FeatureStore)){
356
            logger.error("Error getting selected item from cmbInputLayer");
357
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbInputLayer", null);
358
        }
359
        FeatureStore sourceFeatureStore = (FeatureStore)fLyrVect.getFeatureStore();
360
        if (sourceFeatureStore == null) {
361
            throw new LrsNeededParameterException("need_to_select_a_source_layer", null);
362
        }
363
        params.setSourceFeatureStore(sourceFeatureStore);
364

    
365
        //cmbIdRouteField
366
        if (!(this.cmbIdRouteField.getSelectedItem() instanceof FeatureAttributeDescriptor)){
367
            logger.error("Error getting selected item from cmbIdRouteField");
368
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbIdRouteField", null);
369
        }
370
        FeatureAttributeDescriptor idRouteField = (FeatureAttributeDescriptor) this.cmbIdRouteField.getSelectedItem();
371
        if (idRouteField == null) {
372
            throw new LrsNeededParameterException("need_to_select_a_route_identifier_field", null);
373
        }
374
        params.setIdRouteField(idRouteField);
375

    
376
        //cmbTable
377
        if (!(this.cmbTable.getSelectedItem() instanceof FeatureStore)){
378
            logger.error("Error getting selected item from cmbTable");
379
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbTable", null);
380
        }
381
        FeatureStore tableFeatureStore = (FeatureStore) this.cmbTable.getSelectedItem();
382
        if (tableFeatureStore == null) {
383
            throw new LrsNeededParameterException("need_to_select_a_table", null);
384
        }
385
        params.setValueTableFeatureStore(tableFeatureStore);
386

    
387
        //cmbTableIdRouteField
388
        if (!(this.cmbTableIdRouteField.getSelectedItem() instanceof FeatureAttributeDescriptor)){
389
            logger.error("Error getting selected item from cmbTableIdRouteField");
390
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbTableIdRouteField", null);
391
        }
392
        FeatureAttributeDescriptor tableIdRouteField = (FeatureAttributeDescriptor) this.cmbTableIdRouteField.getSelectedItem();
393
        params.setValueTableIdRouteField(tableIdRouteField);
394

    
395
        //cmbLandmarkField
396
        if (!(this.cmbLandmarkField.getSelectedItem() instanceof FeatureAttributeDescriptor)){
397
            logger.error("Error getting selected item from cmbLandmarkField");
398
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbLandmarkField", null);
399
        }
400
        FeatureAttributeDescriptor landmarkField = (FeatureAttributeDescriptor) this.cmbLandmarkField.getSelectedItem();
401
        if (landmarkField == null) {
402
            throw new LrsNeededParameterException("need_to_select_a_landmark_field", null);
403
        }
404
        params.setLandmarkField(landmarkField);
405

    
406
        //cmbFinalLandmarkField
407
        if (!(this.cmbFinalLandmarkField.getSelectedItem() instanceof FeatureAttributeDescriptor)){
408
            logger.error("Error getting selected item from cmbFinalLandmarkField");
409
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbFinalLandmarkField", null);
410
        }
411
        FeatureAttributeDescriptor finalLandmarkField = (FeatureAttributeDescriptor) this.cmbFinalLandmarkField.getSelectedItem();
412
        params.setFinalLandmarkField(finalLandmarkField);
413

    
414
        //cmbValue
415
        if (!(this.cmbValueField.getSelectedItem() instanceof FeatureAttributeDescriptor)){
416
            logger.error("Error getting selected item from cmbValueField");
417
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbValueField", null);
418
        }
419
        FeatureAttributeDescriptor valueField = (FeatureAttributeDescriptor) this.cmbValueField.getSelectedItem();
420
        if (valueField == null) {
421
            throw new LrsNeededParameterException("need_to_select_a_value_field", null);
422
        }
423
        params.setValueField(valueField);
424

    
425
        //OutputStore
426
        String outputLayerPath = this.txtOutputFile.getText();
427
        if(StringUtils.isEmpty(outputLayerPath)){
428
            throw new LrsNeededParameterException("need_to_fill_the_target_path", null);
429
        }
430
        SHPNewStoreParameters sHPNewStoreParameters=new SHPNewStoreParameters();
431
        sHPNewStoreParameters.setFile(outputLayerPath);
432
        params.setNewFeatureStoreParameters((NewFeatureStoreParameters)sHPNewStoreParameters);
433

    
434
        return params;
435
    }
436

    
437
    public void setParams(LrsAlgorithmParams params) {
438
        if (params == null) {
439
            clear();
440
            return;
441
        }
442
        // Rellena los campos con los valores de params
443
        LrsGenerateDynamicSegmentationAlgorithmParams parameters = (LrsGenerateDynamicSegmentationAlgorithmParams) params;
444

    
445
        FeatureStore sourceFeatureStore = parameters.getSourceFeatureStore();
446
        if(layers!=null && sourceFeatureStore!=null){
447
            FLayer layer = layers.getLayer(sourceFeatureStore.getName());
448
            this.cmbInputLayer.setSelectedItem(layer);
449
        }
450

    
451
        FeatureStore tableFeaturesStore=parameters.getValueTableFeatureStore();
452
        if(tables!=null && tableFeaturesStore!=null){
453
            this.cmbTable.setSelectedItem(tableFeaturesStore.getName());
454
        }
455

    
456
        NewFeatureStoreParameters newFeatureStoreParameters = parameters.getNewFeatureStoreParameters();
457
        if(newFeatureStoreParameters!=null && newFeatureStoreParameters instanceof SHPNewStoreParameters){
458
            this.txtOutputFile.setText(((SHPNewStoreParameters)newFeatureStoreParameters).getSHPFile().getAbsolutePath());
459
        }
460

    
461
        this.cmbIdRouteField.setSelectedItem(parameters.getIdRouteField());
462
        this.cmbTableIdRouteField.setSelectedItem(parameters.getValueTableIdRouteField());
463
        this.cmbLandmarkField.setSelectedItem(parameters.getLandmarkField());
464
        this.cmbFinalLandmarkField.setSelectedItem(parameters.getFinalLandmarkField());
465
        this.cmbValueField.setSelectedItem(parameters.getValueField());
466

    
467
    }
468

    
469
    public void clear() {
470
        this.txtOutputFile.setText("");
471

    
472
        this.cmbInputLayer.setSelectedIndex(0);
473
        Object inputLayerSelected = this.cmbInputLayer.getSelectedItem();
474
        if (inputLayerSelected != null) {
475
            this.updateLayerSource((FLyrVect) inputLayerSelected);
476
        }
477
        this.cmbTable.setSelectedIndex(0);
478
        Object tableSelected = this.cmbTable.getSelectedItem();
479
        if (tableSelected != null) {
480
            this.updateTable((FeatureStore) tableSelected);
481
        }
482
        this.cmbIdRouteField.setSelectedIndex(0);
483
        this.cmbTableIdRouteField.setSelectedIndex(0);
484
        this.cmbLandmarkField.setSelectedIndex(0);
485
        this.cmbFinalLandmarkField.setSelectedIndex(0);
486
        this.cmbValueField.setSelectedIndex(0);
487
    }
488

    
489
    private void updateLayerSource(FLyrVect layer) {
490
        logger.info(new StringBuilder().append("Setting layer ")
491
            .append(layer.getName()).toString());
492
        FeatureStore featureStore = layer.getFeatureStore();
493
        try {
494
            FeatureType type = featureStore.getDefaultFeatureType();
495
            // Se renuevan los combos de attributeDescriptors
496
            FeatureAttributeDescriptorsComboBoxModel idRouteFieldComboBoxModel =
497
                new FeatureAttributeDescriptorsComboBoxModel();
498

    
499
            this.cmbIdRouteField.setModel(idRouteFieldComboBoxModel);
500

    
501
            FeatureAttributeDescriptor[] attributeDescriptors =
502
                type.getAttributeDescriptors();
503
            for (int i = 0; i < attributeDescriptors.length; i++) {
504
                FeatureAttributeDescriptor featureAttributeDescriptor =
505
                    attributeDescriptors[i];
506
                if (featureAttributeDescriptor.getDataType()
507
                    .getType() != DataTypes.GEOMETRY) {
508
                    logger.info(new StringBuilder().append("Adding field ")
509
                        .append(featureAttributeDescriptor.getName())
510
                        .toString());
511

    
512
                    JLrsGenerateDynamicSegmentationParamsController.this.cmbIdRouteField
513
                        .addItem(featureAttributeDescriptor);
514
                }
515
            }
516
            this.cmbIdRouteField.invalidate();
517

    
518
        } catch (DataException e1) {
519
            logger.warn(new StringBuilder()
520
                .append("Error getting default feature type from layer ")
521
                .append(layer.getName()).toString(), e1);
522
        }
523
    }
524

    
525
    private void updateTable(FeatureStore featureStore) {
526
        logger.info(new StringBuilder().append("Setting featureStore ")
527
            .append(featureStore.getName()).toString());
528
        try {
529
            FeatureType type = featureStore.getDefaultFeatureType();
530
            // Se renuevan los combos de attributeDescriptors
531
            FeatureAttributeDescriptorsComboBoxModel tableIdRouteComboBoxModel =
532
                new FeatureAttributeDescriptorsComboBoxModel();
533
            FeatureAttributeDescriptorsComboBoxModel landmarkComboBoxModel =
534
                new FeatureAttributeDescriptorsComboBoxModel();
535
            FeatureAttributeDescriptorsComboBoxModel finalLandmarkComboBoxModel =
536
                new FeatureAttributeDescriptorsComboBoxModel();
537
            FeatureAttributeDescriptorsComboBoxModel valueComboBoxModel =
538
                new FeatureAttributeDescriptorsComboBoxModel();
539

    
540
            this.cmbTableIdRouteField.setModel(tableIdRouteComboBoxModel);
541
            this.cmbLandmarkField.setModel(landmarkComboBoxModel);
542
            this.cmbFinalLandmarkField.setModel(finalLandmarkComboBoxModel);
543
            this.cmbValueField.setModel(valueComboBoxModel);
544

    
545
            FeatureAttributeDescriptor[] attributeDescriptors =
546
                type.getAttributeDescriptors();
547
            for (int i = 0; i < attributeDescriptors.length; i++) {
548
                FeatureAttributeDescriptor featureAttributeDescriptor =
549
                    attributeDescriptors[i];
550
                if (featureAttributeDescriptor.getDataType()
551
                    .getType() != DataTypes.GEOMETRY) {
552
                    logger.info(new StringBuilder().append("Adding field ")
553
                        .append(featureAttributeDescriptor.getName())
554
                        .toString());
555

    
556
                    JLrsGenerateDynamicSegmentationParamsController.this.cmbTableIdRouteField
557
                        .addItem(featureAttributeDescriptor);
558
                    JLrsGenerateDynamicSegmentationParamsController.this.cmbValueField
559
                    .addItem(featureAttributeDescriptor);
560
                    if (featureAttributeDescriptor.getDataType().isNumeric()) {
561
                        JLrsGenerateDynamicSegmentationParamsController.this.cmbLandmarkField
562
                            .addItem(featureAttributeDescriptor);
563
                        JLrsGenerateDynamicSegmentationParamsController.this.cmbFinalLandmarkField
564
                        .addItem(featureAttributeDescriptor);
565
                    }
566
                }
567
            }
568
            this.cmbTableIdRouteField.invalidate();
569
            this.cmbLandmarkField.invalidate();
570
            this.cmbFinalLandmarkField.invalidate();
571
            this.cmbValueField.invalidate();
572

    
573
        } catch (DataException e1) {
574
            logger
575
                .warn(new StringBuilder()
576
                    .append(
577
                        "Error getting default feature type from featureStore ")
578
                    .append(featureStore.getName()).toString(), e1);
579
        }
580
    }
581

    
582
    protected FeatureStore getFeatureStore(String outputLayerPath,
583
        IProjection projection) throws Exception {
584

    
585
        DataManager dataManager = DALLocator.getDataManager();
586
        DataStoreParameters dataStoreParams =
587
            dataManager.createStoreParameters("Shape");
588
        dataStoreParams.setDynValue("shpfile", outputLayerPath);
589
        dataStoreParams.setDynValue("CRS", projection);
590
        dataStoreParams.setDynValue("useNullGeometry", false);
591
        dataStoreParams.validate();
592

    
593
        return (FeatureStore) dataManager.openStore("Shape", dataStoreParams);
594
    }
595

    
596
    /**
597
     * Tries to find a curve M-layer with at least one non-geometrical field
598
     *
599
     * @param layers
600
     * @return
601
     */
602
    private static boolean correctLayerFound(LayerCollection layers) {
603
        final MutableBoolean correctLayerFound=new MutableBoolean(false);
604
        if (layers != null) {
605
            try {
606
                layers.accept(new Visitor() {
607

    
608
                    public void visit(Object obj)
609
                        throws VisitCanceledException, BaseException {
610
                        FLayer layer = (FLayer) obj;
611
                        if (JLrsGenerateDynamicSegmentationParamsController
612
                            .correctLayerFound(layer)) {
613
                            correctLayerFound.setValue(true);
614
                            throw new VisitCanceledException();
615
                        }
616
                    }
617
                });
618
            } catch (VisitCanceledException e) {
619
                //VisitCanceledException is not working properly
620
                //so, we have to use final MutableBoolean correctLayerFound
621
                return true;
622
            }
623
            catch (BaseException e) {
624
                logger.warn("Error visiting layer");
625
            }
626
        }
627
        return correctLayerFound.getValue();
628
    }
629

    
630

    
631
    /**
632
     * Verifies if it is a curve M-layer with at least one non-geometrical field
633
     *
634
     * @param FLayer
635
     * @return
636
     * @throws ReadException
637
     */
638
    public static boolean correctLayerFound(FLayer layer) {
639
        boolean correctLayerFound = false;
640
        // Validates is FLyrVect
641
        FLyrVect lyrVect = null;
642
        if (layer instanceof FLyrVect) {
643
            lyrVect = (FLyrVect) layer;
644
        } else
645
            return false;
646

    
647
        try {
648
            if (lyrVect != null
649
                && (lyrVect.getGeometryType().isTypeOf(Geometry.TYPES.CURVE)
650
                    || lyrVect.getGeometryType()
651
                        .isTypeOf(Geometry.TYPES.MULTICURVE))) {
652
                // TODO M-geometry commented to test button
653
                // if (lyrVect.getGeometryType()
654
                // .isSubTypeOf(Geometry.SUBTYPES.GEOM2DM) ||
655
                // lyrVect.getGeometryType()
656
                // .isSubTypeOf(Geometry.SUBTYPES.GEOM3DM)) {
657
                FeatureStore featureStore = lyrVect.getFeatureStore();
658
                try {
659
                    FeatureType type = featureStore.getDefaultFeatureType();
660

    
661
                    FeatureAttributeDescriptor[] attributeDescriptors =
662
                        type.getAttributeDescriptors();
663
                    for (int i = 0; i < attributeDescriptors.length; i++) {
664
                        FeatureAttributeDescriptor featureAttributeDescriptor =
665
                            attributeDescriptors[i];
666
                        if (featureAttributeDescriptor.getDataType()
667
                            .getType() != DataTypes.GEOMETRY) {
668
                            logger.debug("Correct curve layer found");
669
                            return true;
670
                        }
671
                    }
672
                    // type.getDefaultGeometryAttribute().getGeomType().isSubTypeOf(Geometry.SUBTYPES.GEOM2DM)
673

    
674
                } catch (DataException e1) {
675
                    logger.warn(new StringBuilder()
676
                        .append(
677
                            "Error getting default feature type from layer ")
678
                        .append(lyrVect.getName()).toString(), e1);
679
                }
680

    
681
                // }
682
            }
683
        } catch (Exception e) {
684
            logger.error("Can't get linear vector layers", e);
685
        }
686
        return correctLayerFound;
687
    }
688

    
689
    /**
690
     * Validates if there is a valid table:
691
     * - at least two fields
692
     * - one of them is numeric
693
     * if can't find any throws an exception
694
     *
695
     * @throws LrsNeededParameterException
696
     * @throws ReadException
697
     */
698
    public static boolean correctTableFound(List<FeatureStore> tables) {
699
        for (FeatureStore featureStore : tables) {
700
            try {
701
                FeatureType type = featureStore.getDefaultFeatureType();
702

    
703
                FeatureAttributeDescriptor[] attributeDescriptors =
704
                    type.getAttributeDescriptors();
705
                if (attributeDescriptors.length >= 2) {
706
                    for (int i = 0; i < attributeDescriptors.length; i++) {
707
                        FeatureAttributeDescriptor featureAttributeDescriptor =
708
                            attributeDescriptors[i];
709
                        if (featureAttributeDescriptor.getDataType()
710
                            .isNumeric()) {
711
                            logger.debug("Correct table found");
712
                            return true;
713
                        }
714
                    }
715
                }
716
            } catch (DataException e1) {
717
                logger.warn("Error getting default feature type");
718
            }
719
        }
720
        return false;
721
    }
722
}