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 / JLrsCalibrateRouteParamsController.java @ 11

History | View | Annotate | Download (31.3 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.Iterator;
15
import java.util.Locale;
16

    
17
import javax.swing.ComboBoxModel;
18
import javax.swing.DefaultComboBoxModel;
19
import javax.swing.JComponent;
20
import javax.swing.JOptionPane;
21
import javax.swing.ListCellRenderer;
22

    
23
import org.apache.commons.io.FileUtils;
24
import org.apache.commons.lang3.StringUtils;
25
import org.cresques.cts.IProjection;
26
import org.gvsig.fmap.dal.DALLocator;
27
import org.gvsig.fmap.dal.DataManager;
28
import org.gvsig.fmap.dal.DataStoreParameters;
29
import org.gvsig.fmap.dal.exception.DataException;
30
import org.gvsig.fmap.dal.exception.ReadException;
31
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
32
import org.gvsig.fmap.dal.feature.EditableFeatureType;
33
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
34
import org.gvsig.fmap.dal.feature.FeatureStore;
35
import org.gvsig.fmap.dal.feature.FeatureType;
36
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
37
import org.gvsig.fmap.dal.store.shp.SHPNewStoreParameters;
38
import org.gvsig.fmap.geom.DataTypes;
39
import org.gvsig.fmap.geom.Geometry;
40
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
41
import org.gvsig.fmap.geom.Geometry.TYPES;
42
import org.gvsig.fmap.geom.GeometryException;
43
import org.gvsig.fmap.geom.GeometryLocator;
44
import org.gvsig.fmap.mapcontext.layers.FLayer;
45
import org.gvsig.fmap.mapcontext.layers.operations.LayerCollection;
46
import org.gvsig.fmap.mapcontext.layers.operations.LayersVisitor;
47
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
48
import org.gvsig.lrs.lib.api.DistanceUnits;
49
import org.gvsig.lrs.lib.api.LrsAlgorithmParams;
50
import org.gvsig.lrs.lib.api.LrsAlgorithmsLocator;
51
import org.gvsig.lrs.lib.api.LrsAlgorithmsManager;
52
import org.gvsig.lrs.lib.api.LrsCalibrateRouteAlgorithmParams;
53
import org.gvsig.lrs.lib.api.LrsMeasureCalculationMethods;
54
import org.gvsig.lrs.lib.api.exceptions.LrsGettingParametersException;
55
import org.gvsig.lrs.lib.api.exceptions.LrsNeededParameterException;
56
import org.gvsig.lrs.swing.api.JLrsAlgorithmParams;
57
import org.gvsig.tools.ToolsLocator;
58
import org.gvsig.tools.exception.BaseException;
59
import org.gvsig.tools.i18n.I18nManager;
60
import org.gvsig.tools.locator.LocatorException;
61
import org.gvsig.tools.swing.api.ActionListenerSupport;
62
import org.gvsig.tools.swing.api.ToolsSwingLocator;
63
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
64
import org.gvsig.tools.visitor.VisitCanceledException;
65
import org.slf4j.Logger;
66
import org.slf4j.LoggerFactory;
67

    
68
public class JLrsCalibrateRouteParamsController extends JLrsCalibrateRouteParamsView  implements JLrsAlgorithmParams{
69

    
70
    /**
71
     *
72
     */
73
    private static final long serialVersionUID = -9145489136943076981L;
74

    
75
    private static final Logger logger = LoggerFactory.getLogger(JLrsCalibrateRouteParamsController.class);
76

    
77
    private boolean canceled;
78
    private ActionListenerSupport listeners = ToolsSwingLocator.getToolsSwingManager().createActionListenerSupport();
79

    
80
    private LayerCollection layers;
81

    
82
    /**
83
     * @param layers
84
     * @throws LrsNeededParameterException
85
     *
86
     */
87
    public JLrsCalibrateRouteParamsController(LayerCollection layers, LrsAlgorithmParams params) throws LrsNeededParameterException {
88
        super();
89
        this.layers = layers;
90
        initComponents();
91
        translate();
92
        setParams(params);
93
    }
94

    
95
    public void addActionListener(ActionListener listener) {
96
        listeners.addActionListener(listener);
97
    }
98

    
99
    public void removeActionListener(ActionListener listener) {
100
        listeners.removeActionListener(listener);
101
    }
102

    
103
    private void translate() {
104
        I18nManager i18nManager = ToolsLocator.getI18nManager();
105

    
106
        lblInputLayer.setText(i18nManager.getTranslation(lblInputLayer.getText()));
107
        lblIdRouteField.setText(i18nManager.getTranslation(lblIdRouteField.getText()));
108
        lblCalibratePointLayer.setText(i18nManager.getTranslation(lblCalibratePointLayer.getText()));
109
        lblCalibrationPointIdRouteField.setText(i18nManager.getTranslation(lblCalibrationPointIdRouteField.getText()));
110
        lblFromMeasureField.setText(i18nManager.getTranslation(lblFromMeasureField.getText()));
111
        lblOutputFile.setText(i18nManager.getTranslation(lblOutputFile.getText()));
112
        lblMeasureCalcMethod.setText(i18nManager.getTranslation(lblMeasureCalcMethod.getText()));
113
        lblSearchRadius.setText(i18nManager.getTranslation(lblSearchRadius.getText()));
114
        lblMeasureUnits.setText(i18nManager.getTranslation(lblMeasureUnits.getText()));
115
        chkInterpolateBetweenCalibrationPoints.setText(i18nManager.getTranslation(chkInterpolateBetweenCalibrationPoints.getText()));
116
        chkExtrapolateBeforeCalibrationPoints.setText(i18nManager.getTranslation(chkExtrapolateBeforeCalibrationPoints.getText()));
117
        chkExtrapolateAfterCalibrationPoints.setText(i18nManager.getTranslation(chkExtrapolateAfterCalibrationPoints.getText()));
118
        chkIgnoreSpatialGaps.setText(i18nManager.getTranslation(chkIgnoreSpatialGaps.getText()));
119
        chkIncludeAll.setText(i18nManager.getTranslation(chkIncludeAll.getText()));
120
        btnBrowser.setText("\u2026");
121
        btnAccept.setText(i18nManager.getTranslation(btnAccept.getText()));
122
        btnCancel.setText(i18nManager.getTranslation(btnCancel.getText()));
123

    
124
    }
125

    
126
    /**
127
     *
128
     */
129
    public void setLocate(Locale locale) {
130
        Locale l = super.getLocale();
131
        if (!l.equals(locale)) {
132
            translate();
133
        }
134
        super.setLocale(locale);
135
    }
136

    
137
    /**
138
     * Validates the layers:
139
     *  - At least 2 layers
140
     *  - At least 1 curve layer with at least 1 non-geometric field
141
     *  - At least 1 point layer with at least 1 non-geometric field and 1 numeric field
142
     *  if they are not correct throws an exception
143
     * @throws LrsNeededParameterException
144
     */
145
    public static void validateLayers(LayerCollection layers)throws LrsNeededParameterException {
146
        logger.debug("Validating layers for Calibrate Route");
147
        if (layers==null||layers.getLayersCount()<2){
148
            logger.error("Two or more layers are needed");
149
            throw new LrsNeededParameterException("two_or_more_layers_are_needed", null);
150
        }
151

    
152
        if (!correctLayersFound(layers)){
153
            logger.error("Impossible to find the layers needed");
154
            throw new LrsNeededParameterException("impossible_to_find_needed_layers",null);
155
        }
156
    }
157

    
158
    /**
159
     * @throws LrsNeededParameterException
160
     */
161
    private void initComponents() throws LrsNeededParameterException {
162

    
163
        validateLayers(layers);
164

    
165
        // Modelos de los combos
166
        FLayersComboBoxModel inputLayerModel = new FLayersComboBoxModel(this.layers);
167
        FeatureAttributeDescriptorsComboBoxModel idRouteFieldComboBoxModel =
168
            new FeatureAttributeDescriptorsComboBoxModel();
169

    
170
        PointLayersComboBoxModel calibratePointLayerModel = new PointLayersComboBoxModel(this.layers);
171
        FeatureAttributeDescriptorsComboBoxModel idCalibrationPointFieldComboBoxModel =
172
            new FeatureAttributeDescriptorsComboBoxModel();
173
        FeatureAttributeDescriptorsComboBoxModel fromMeasureFieldComboBoxModel =
174
            new FeatureAttributeDescriptorsComboBoxModel();
175

    
176

    
177
        // Renderer para los combos de attributeDescriptors
178
        ListCellRenderer featureAttributeDescriptorCellRenderer = new FLayersAttributeDescriptorCellRenderer();
179
        // asignaci?n de renderers y modelos
180
        cmbIdRouteField.setRenderer(featureAttributeDescriptorCellRenderer);
181
        cmbCalibrationPointIdRouteField.setRenderer(featureAttributeDescriptorCellRenderer);
182
        cmbFromMeasureField.setRenderer(featureAttributeDescriptorCellRenderer);
183
        cmbIdRouteField.setModel(idRouteFieldComboBoxModel);
184
        cmbCalibrationPointIdRouteField.setModel(idCalibrationPointFieldComboBoxModel);
185
        cmbFromMeasureField.setModel(fromMeasureFieldComboBoxModel);
186

    
187
        // renderer para el combo de capas
188
        ListCellRenderer layerNameCellRenderer=new FLayersLayerNameCellRenderer();
189
        cmbInputLayer.setRenderer(layerNameCellRenderer);
190
        cmbCalibratePointLayer.setRenderer(layerNameCellRenderer);
191
        // asignaci?n modelo al combo de capas
192
        cmbInputLayer.setModel(inputLayerModel);
193
        cmbCalibratePointLayer.setModel(calibratePointLayerModel);
194
        // listener del combo de capas para que actualice el resto de
195
        // componentes
196
        cmbInputLayer.addItemListener(new ItemListener() {
197

    
198
            public void itemStateChanged(ItemEvent e) {
199
                Object item = e.getItem();
200
                if (item instanceof FLyrVect) {
201
                    FLyrVect layer = (FLyrVect) item;
202
                    updateLayerSource(layer);
203
                }
204
            }
205
        });
206
        cmbCalibratePointLayer.addItemListener(new ItemListener() {
207

    
208
            public void itemStateChanged(ItemEvent e) {
209
                Object item = e.getItem();
210
                if (item instanceof FLyrVect) {
211
                    FLyrVect layer = (FLyrVect) item;
212
                    updateLayerCalibratePoint(layer);
213
                }
214
            }
215
        });
216

    
217
        ComboBoxModel<LrsMeasureCalculationMethods> measureCalculationMethodsModel =
218
            new DefaultComboBoxModel<LrsMeasureCalculationMethods>(LrsMeasureCalculationMethods.values());
219

    
220
        cmbMeasureCalcMethod.setModel(measureCalculationMethodsModel);
221

    
222
        ComboBoxModel<DistanceUnits> measureUnitsModel =
223
            new DefaultComboBoxModel<DistanceUnits>(DistanceUnits.values());
224

    
225
        cmbMeasureUnits.setModel(measureUnitsModel);
226

    
227
        txtSearchRadius.setValue(new Double(0));
228

    
229
        this.btnBrowser.addActionListener(new ActionListener() {
230

    
231
            public void actionPerformed(ActionEvent e) {
232
                doSelectOuputFile();
233
            }
234
        });
235

    
236
        this.btnAccept.addActionListener(new ActionListener() {
237

    
238
            public void actionPerformed(ActionEvent e) {
239
                canceled = false;
240
                doClose();
241
                listeners.fireActionEvent(new ActionEvent(JLrsCalibrateRouteParamsController.this, 0, "accept"));
242

    
243
            }
244
        });
245

    
246
        this.btnCancel.addActionListener(new ActionListener() {
247

    
248
            public void actionPerformed(ActionEvent e) {
249
                canceled = true;
250
                doClose();
251
                listeners.fireActionEvent(new ActionEvent(JLrsCalibrateRouteParamsController.this, 0, "cancel"));
252
            }
253
        });
254

    
255
        setVisibleAceptCancel(false);
256
        canceled = false;
257
    }
258

    
259
    private void doSelectOuputFile() {
260
        final I18nManager i18nManager = ToolsLocator.getI18nManager();
261
        ThreadSafeDialogsManager manager = ToolsSwingLocator.getThreadSafeDialogsManager();
262
        File[] files = manager.showSaveFileDialog(i18nManager.getTranslation("output_file"), null);
263
        if (files != null && files.length > 0) {
264
            File file = files[0];
265
            String absolutePath = file.getAbsolutePath();
266
            if(!StringUtils.endsWithIgnoreCase(absolutePath, ".shp")){
267
                absolutePath = new StringBuilder().append(absolutePath).append(".shp").toString();
268
            }
269
            File outputFile = FileUtils.getFile(absolutePath);
270
            if(outputFile.exists()) {
271
                int resp = JOptionPane.showOptionDialog(
272
                    this.asJComponent(),
273
                    i18nManager.getTranslation("file_already_exists_do_you_want_overwrite_it"),
274
                    i18nManager.getTranslation("output_file"),
275
                    JOptionPane.OK_CANCEL_OPTION,
276
                    JOptionPane.QUESTION_MESSAGE,
277
                    null,
278
                    null,
279
                    JOptionPane.OK_OPTION);
280
                if (resp == JOptionPane.OK_OPTION){
281
                    this.txtOutputFile.setText(absolutePath);
282
                } else {
283
                    doSelectOuputFile();
284
                }
285
            } else {
286
                this.txtOutputFile.setText(absolutePath);
287
            }
288
        }
289

    
290
    }
291

    
292
    private void doClose() {
293
        this.setVisible(false);
294
    }
295

    
296
    public boolean isCanceled() {
297
        return this.canceled;
298
    }
299

    
300
    public void setVisibleAceptCancel(boolean visible) {
301
        this.btnAccept.setVisible(visible);
302
        this.btnCancel.setVisible(visible);
303
    }
304

    
305
    public boolean getVisibleAceptCancel() {
306
        return this.btnAccept.isVisible();
307
    }
308

    
309
    public JComponent asJComponent() {
310
        return this;
311
    }
312

    
313
    public LrsAlgorithmParams getParams() throws LrsGettingParametersException, LrsNeededParameterException {
314
        LrsAlgorithmsManager manager = LrsAlgorithmsLocator.getLrsAlgorithmsManager();
315
        LrsCalibrateRouteAlgorithmParams params = manager.createLrsCalibrateRouteAlgorithmParams();
316
        // Recorrer todo del interfaz y rellenar los parametros
317

    
318
        //cmbInputLayer
319
        if (!(this.cmbInputLayer.getSelectedItem() instanceof FLyrVect)){
320
            logger.error("Error getting selected item from cmbInputLayer");
321
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbInputLayer", null);
322
        }
323
        FLyrVect fLyrVect = (FLyrVect) this.cmbIdRouteField.getSelectedItem();
324
        if (!(fLyrVect.getFeatureStore() instanceof FeatureStore)){
325
            logger.error("Error getting selected item from cmbInputLayer");
326
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbInputLayer", null);
327
        }
328
        FeatureStore sourceFeatureStore = (FeatureStore)fLyrVect.getFeatureStore();
329
        if (sourceFeatureStore == null) {
330
            throw new LrsNeededParameterException("need_to_select_a_source_layer", null);
331
        }
332
        params.setSourceFeatureStore(sourceFeatureStore);
333

    
334
        //cmbIdRouteField
335
        if (!(this.cmbIdRouteField.getSelectedItem() instanceof FeatureAttributeDescriptor)){
336
            logger.error("Error getting selected item from cmbIdRouteField");
337
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbIdRouteField", null);
338
        }
339
        FeatureAttributeDescriptor idRouteField = (FeatureAttributeDescriptor) this.cmbIdRouteField.getSelectedItem();
340
        if (idRouteField == null) {
341
            throw new LrsNeededParameterException("need_to_select_a_route_identifier_field", null);
342
        }
343
        params.setIdRouteField(idRouteField);
344

    
345
      //cmbCalibratePointLayer
346
        if (!(this.cmbCalibratePointLayer.getSelectedItem() instanceof FLyrVect)){
347
            logger.error("Error getting selected item from cmbCalibratePointLayer");
348
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbCalibratePointLayer", null);
349
        }
350
        FLyrVect fLyrVectCalibratePoint = (FLyrVect) this.cmbCalibratePointLayer.getSelectedItem();
351
        if (!(fLyrVectCalibratePoint.getFeatureStore() instanceof FeatureStore)){
352
            logger.error("Error getting selected item from cmbCalibratePointLayer");
353
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbCalibratePointLayer", null);
354
        }
355
        FeatureStore calibratePointFeatureStore = (FeatureStore)fLyrVectCalibratePoint.getFeatureStore();
356
        if (calibratePointFeatureStore == null) {
357
            throw new LrsNeededParameterException("need_to_select_a_calibrate_point_layer", null);
358
        }
359
        params.setCalibratePointFeatureStore(calibratePointFeatureStore);
360

    
361
        //cmbCalibrationPointIdRouteField
362
        if (!(this.cmbCalibrationPointIdRouteField.getSelectedItem() instanceof FeatureAttributeDescriptor)){
363
            logger.error("Error getting selected item from cmbCalibrationPointIdRouteField");
364
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbCalibrationPointIdRouteField", null);
365
        }
366
        FeatureAttributeDescriptor idRouteFieldCalibratePoint =
367
            (FeatureAttributeDescriptor) this.cmbCalibrationPointIdRouteField.getSelectedItem();
368
        if (idRouteFieldCalibratePoint == null) {
369
            throw new LrsNeededParameterException("need_to_select_a_route_identifier_calibration_point_field", null);
370
        }
371
        params.setCalibratePointIdRouteField(idRouteFieldCalibratePoint);
372

    
373
        //cmbFromMeasureField
374
        if (!(this.cmbFromMeasureField.getSelectedItem() instanceof FeatureAttributeDescriptor)){
375
            logger.error("Error getting selected item from cmbFromMeasureField");
376
            throw new LrsGettingParametersException("error_getting_selected_item_from_cmbFromMeasureField", null);
377
        }
378
        FeatureAttributeDescriptor fromMeasureField =
379
            (FeatureAttributeDescriptor) this.cmbFromMeasureField.getSelectedItem();
380
        if (fromMeasureField == null) {
381
            throw new LrsNeededParameterException("need_to_select_a_from_Measure_field", null);
382
        }
383
        params.setFromMeasureField(fromMeasureField);
384

    
385
        //OutputStore
386
        String outputLayerPath = this.txtOutputFile.getText();
387
        if(StringUtils.isEmpty(outputLayerPath)){
388
            throw new LrsNeededParameterException("need_to_fill_the_target_path", null);
389
        }
390
        SHPNewStoreParameters sHPNewStoreParameters=new SHPNewStoreParameters();
391
        sHPNewStoreParameters.setFile(outputLayerPath);
392
        params.setNewFeatureStoreParameters((NewFeatureStoreParameters)sHPNewStoreParameters);
393

    
394

    
395
        LrsMeasureCalculationMethods measureCalculationMethods = (LrsMeasureCalculationMethods) this.cmbMeasureCalcMethod.getSelectedItem();
396
        params.setMeasureCalculationMethods(measureCalculationMethods);
397
        DistanceUnits measureUnits = (DistanceUnits) this.cmbMeasureUnits.getSelectedItem();
398
        params.setMeasureUnits(measureUnits);
399

    
400
        Object searchRadius = this.txtSearchRadius.getValue();
401
        if (searchRadius!=null && searchRadius instanceof Double){
402
            params.setSearchRadius((Double)searchRadius);
403
        }else {
404
            params.setSearchRadius(0);
405
        }
406

    
407
        params.setInterpolateBetweenCalibrationPoints(this.chkInterpolateBetweenCalibrationPoints.isSelected());
408
        params.setExtrapolateBeforeCalibrationPoints(this.chkExtrapolateBeforeCalibrationPoints.isSelected());
409
        params.setExtrapolateAfterCalibrationPoints(this.chkExtrapolateAfterCalibrationPoints.isSelected());
410
        params.setIgnoreSpatialGaps(this.chkIgnoreSpatialGaps.isSelected());
411
        params.setIncludeAll(this.chkIncludeAll.isSelected());
412

    
413
        return params;
414
    }
415

    
416
    public void setParams(LrsAlgorithmParams params) {
417
        if (params == null) {
418
            clear();
419
            return;
420
        }
421
        // Rellena los campos con los valores de params
422
        LrsCalibrateRouteAlgorithmParams parameters = (LrsCalibrateRouteAlgorithmParams) params;
423

    
424
        this.cmbMeasureCalcMethod.setSelectedItem(parameters.getMeasureCalculationMethods());
425
        this.cmbMeasureUnits.setSelectedItem(parameters.getMeasureUnits());
426

    
427
        FeatureStore sourceFeatureStore = parameters.getSourceFeatureStore();
428
        if(layers!=null && sourceFeatureStore!=null){
429
            FLayer layer = layers.getLayer(sourceFeatureStore.getName());
430
            this.cmbInputLayer.setSelectedItem(layer);
431
        }
432
        FeatureStore calibratePointFeaturesStore=parameters.getCalibratePointFeatureStore();
433
        if(layers!=null && calibratePointFeaturesStore!=null){
434
            FLayer layer = layers.getLayer(calibratePointFeaturesStore.getName());
435
            this.cmbCalibratePointLayer.setSelectedItem(layer);
436
        }
437
        NewFeatureStoreParameters newFeatureStoreParameters = parameters.getNewFeatureStoreParameters();
438
        if(newFeatureStoreParameters!=null && newFeatureStoreParameters instanceof SHPNewStoreParameters){
439
            this.txtOutputFile.setText(((SHPNewStoreParameters)newFeatureStoreParameters).getSHPFile().getAbsolutePath());
440
        }
441

    
442
        this.cmbIdRouteField.setSelectedItem(parameters.getIdRouteField());
443
        this.cmbCalibrationPointIdRouteField.setSelectedItem(parameters.getCalibratePointIdRouteField());
444
        this.cmbFromMeasureField.setSelectedItem(parameters.getFromMeasureField());
445

    
446
        this.txtSearchRadius.setValue(parameters.getSearchRadius());
447
        this.chkInterpolateBetweenCalibrationPoints.setSelected(parameters.interpolateBetweenCalibrationPoints());
448
        this.chkExtrapolateBeforeCalibrationPoints.setSelected(parameters.extrapolateBeforeCalibrationPoints());
449
        this.chkExtrapolateAfterCalibrationPoints.setSelected(parameters.extrapolateAfterCalibrationPoints());
450
        this.chkIgnoreSpatialGaps.setSelected(parameters.ignoreSpatialGaps());
451
        this.chkIncludeAll.setSelected(parameters.includeAll());
452

    
453
    }
454

    
455
    public void clear() {
456
        this.txtOutputFile.setText("");
457
        this.txtSearchRadius.setValue(0.0);
458

    
459
        this.cmbInputLayer.setSelectedIndex(0);
460
        Object inputLayerSelected = this.cmbInputLayer.getSelectedItem();
461
        if (inputLayerSelected != null) {
462
            this.updateLayerSource((FLyrVect) inputLayerSelected);
463
        }
464
        this.cmbCalibratePointLayer.setSelectedIndex(0);
465
        Object calibratePointLayerSelected = this.cmbCalibratePointLayer.getSelectedItem();
466
        if (calibratePointLayerSelected != null) {
467
            this.updateLayerCalibratePoint((FLyrVect) calibratePointLayerSelected);
468
        }
469
        this.cmbIdRouteField.setSelectedIndex(0);
470
        this.cmbCalibrationPointIdRouteField.setSelectedIndex(0);
471
//        this.cmbFromMeasureField.setSelectedIndex(0);
472
        this.cmbMeasureCalcMethod.setSelectedIndex(0);
473
        this.cmbMeasureUnits.setSelectedIndex(0);
474
        this.chkInterpolateBetweenCalibrationPoints.setSelected(false);
475
        this.chkExtrapolateBeforeCalibrationPoints.setSelected(false);
476
        this.chkExtrapolateAfterCalibrationPoints.setSelected(false);
477
        this.chkIgnoreSpatialGaps.setSelected(false);
478
        this.chkIncludeAll.setSelected(false);
479

    
480
    }
481

    
482
    private void updateLayerSource(FLyrVect layer) {
483
        logger.info(new StringBuilder().append("Setting layer ").append(layer.getName()).toString());
484
        FeatureStore featureStore = layer.getFeatureStore();
485
        try {
486
            FeatureType type = featureStore.getDefaultFeatureType();
487
            // Se renuevan los combos de attributeDescriptors
488
            FeatureAttributeDescriptorsComboBoxModel idRouteFieldComboBoxModel =
489
                new FeatureAttributeDescriptorsComboBoxModel();
490

    
491
            this.cmbIdRouteField.setModel(idRouteFieldComboBoxModel);
492

    
493
            FeatureAttributeDescriptor[] attributeDescriptors = type.getAttributeDescriptors();
494
            for (int i = 0; i < attributeDescriptors.length; i++) {
495
                FeatureAttributeDescriptor featureAttributeDescriptor = attributeDescriptors[i];
496
                if (featureAttributeDescriptor.getDataType().getType() != DataTypes.GEOMETRY) {
497
                    logger.info(new StringBuilder().append("Adding field ")
498
                        .append(featureAttributeDescriptor.getName()).toString());
499

    
500
                    JLrsCalibrateRouteParamsController.this.cmbIdRouteField.addItem(featureAttributeDescriptor);
501
                }
502
            }
503
            this.cmbIdRouteField.invalidate();
504

    
505
        } catch (DataException e1) {
506
            logger.warn(
507
                new StringBuilder().append("Error getting default feature type from layer ").append(layer.getName())
508
                    .toString(), e1);
509
        }
510
    }
511

    
512

    
513

    
514
    private void updateLayerCalibratePoint(FLyrVect layer) {
515
        logger.info(new StringBuilder().append("Setting layer ").append(layer.getName()).toString());
516
        FeatureStore featureStore = layer.getFeatureStore();
517
        try {
518
            FeatureType type = featureStore.getDefaultFeatureType();
519
            // Se renuevan los combos de attributeDescriptors
520
            FeatureAttributeDescriptorsComboBoxModel calibrationPointIdRouteFieldComboBoxModel =
521
                new FeatureAttributeDescriptorsComboBoxModel();
522
            FeatureAttributeDescriptorsComboBoxModel fromMeasureFieldComboBoxModel =
523
                new FeatureAttributeDescriptorsComboBoxModel();
524

    
525
            this.cmbCalibrationPointIdRouteField.setModel(calibrationPointIdRouteFieldComboBoxModel);
526
            this.cmbFromMeasureField.setModel(fromMeasureFieldComboBoxModel);
527

    
528
            FeatureAttributeDescriptor[] attributeDescriptors = type.getAttributeDescriptors();
529
            for (int i = 0; i < attributeDescriptors.length; i++) {
530
                FeatureAttributeDescriptor featureAttributeDescriptor = attributeDescriptors[i];
531
                if (featureAttributeDescriptor.getDataType().getType() != DataTypes.GEOMETRY) {
532
                    logger.info(new StringBuilder().append("Adding field ")
533
                        .append(featureAttributeDescriptor.getName()).toString());
534

    
535
                    JLrsCalibrateRouteParamsController.this.cmbCalibrationPointIdRouteField.addItem(featureAttributeDescriptor);
536
                    if (featureAttributeDescriptor.getDataType().isNumeric()) {
537
                        JLrsCalibrateRouteParamsController.this.cmbFromMeasureField.addItem(featureAttributeDescriptor);
538
                    }
539
                }
540
            }
541
            this.cmbCalibrationPointIdRouteField.invalidate();
542
            this.cmbFromMeasureField.invalidate();
543

    
544
        } catch (DataException e1) {
545
            logger.warn(
546
                new StringBuilder().append("Error getting default feature type from layer ").append(layer.getName())
547
                    .toString(), e1);
548
        }
549
    }
550

    
551

    
552
    protected FeatureStore getFeatureStore(String outputLayerPath, IProjection projection) throws Exception {
553

    
554
        DataManager dataManager = DALLocator.getDataManager();
555
        DataStoreParameters dataStoreParams = dataManager.createStoreParameters("Shape");
556
        dataStoreParams.setDynValue("shpfile", outputLayerPath);
557
        dataStoreParams.setDynValue("CRS", projection);
558
        dataStoreParams.setDynValue("useNullGeometry", false);
559
        dataStoreParams.validate();
560

    
561
        return (FeatureStore) dataManager.openStore("Shape", dataStoreParams);
562
    }
563

    
564

    
565
    /**
566
     * Tries to find the correct layers:
567
     *  - At least 2 layers
568
     *  - At least 1 curve layer with at least 1 non-geometrical field
569
     *  - At least 1 point layer with at least 1 non-geometrical field and 1 numeric field
570
     * @param LayerCollection layers
571
     * @return true if finds the correct layers
572
     */
573
    private static boolean correctLayersFound(LayerCollection layers){
574
        boolean correctCurveLayerFound = false;
575
        boolean correctPointLayerFound = false;
576
        boolean layersFound=false;
577

    
578
        for (int i = 0; i < layers.getLayersCount() && !layersFound; i++) {
579
            FLayer layer = layers.getLayer(i);
580
            if (layer instanceof FLyrVect) {
581
                FLyrVect lyrVect = (FLyrVect) layer;
582
                try {
583
                    if (!correctCurveLayerFound) {
584
                        logger.debug(
585
                            "Finding a curve layer with at least one non-geometrical field");
586
                        correctCurveLayerFound =
587
                            correctCurveLayerFound(lyrVect);
588
                    }
589
                    if (!correctPointLayerFound) {
590
                        logger.debug(
591
                            "Finding a point layer with at least one non-geometrical field and a numeric one");
592
                        correctPointLayerFound=correctPointLayerFound(lyrVect);
593
                    }
594
                } catch (BaseException e1) {
595
                    logger.error("Can't get linear vector layers", e1);
596
                }
597
            }
598
            layersFound=correctCurveLayerFound && correctPointLayerFound;
599
        }
600
        return correctCurveLayerFound && correctPointLayerFound;
601
    }
602

    
603
    /**
604
     * Tries to find one curve layer with at least one non-geometrical field
605
     * @param lyrVect
606
     * @return
607
     * @throws ReadException
608
     */
609
    private static boolean correctCurveLayerFound(FLyrVect lyrVect) throws ReadException{
610
        boolean correctCurveLayerFound = false;
611
        if (lyrVect!=null&&(lyrVect.getGeometryType().isTypeOf(Geometry.TYPES.CURVE)
612
            || lyrVect.getGeometryType()
613
                .isTypeOf(Geometry.TYPES.MULTICURVE))) {
614

    
615
            FeatureStore featureStore = lyrVect.getFeatureStore();
616
            try {
617
                FeatureType type = featureStore.getDefaultFeatureType();
618

    
619
                FeatureAttributeDescriptor[] attributeDescriptors = type.getAttributeDescriptors();
620
                for (int i = 0; i < attributeDescriptors.length; i++) {
621
                    FeatureAttributeDescriptor featureAttributeDescriptor = attributeDescriptors[i];
622
                    if (featureAttributeDescriptor.getDataType().getType() != DataTypes.GEOMETRY) {
623
                        logger.debug("Correct curve layer found");
624
                        correctCurveLayerFound = true;
625
                    }
626
                }
627
            } catch (DataException e1) {
628
                logger.warn(
629
                    new StringBuilder().append("Error getting default feature type from layer ").append(lyrVect.getName())
630
                        .toString(), e1);
631
            }
632

    
633

    
634
        }
635
        return correctCurveLayerFound;
636
    }
637

    
638

    
639
    /**
640
     * Tries to find one point layer with at least 1 non-geometrical field and 1 numeric field
641
     * @param lyrVect
642
     * @return
643
     * @throws ReadException
644
     */
645
    private static boolean correctPointLayerFound(FLyrVect lyrVect) throws ReadException{
646
        boolean correctPointLayerFound=false;
647
        if (lyrVect!=null&&(lyrVect.getGeometryType().isTypeOf(Geometry.TYPES.POINT)
648
            || lyrVect.getGeometryType().isTypeOf(Geometry.TYPES.MULTIPOINT))) {
649
            FeatureStore featureStore = lyrVect.getFeatureStore();
650
            try {
651
                FeatureType type = featureStore.getDefaultFeatureType();
652

    
653
                FeatureAttributeDescriptor[] attributeDescriptors = type.getAttributeDescriptors();
654
                Boolean nonGeometricDataTypeFound=false;
655
                Boolean numericDataTypeFound=false;
656
                Boolean dataTypesFound=false;
657
                Boolean validateNext=true;
658
                for (int i = 0; i < attributeDescriptors.length&&!dataTypesFound; i++) {
659
                    FeatureAttributeDescriptor featureAttributeDescriptor = attributeDescriptors[i];
660
                    validateNext=true;
661
                    if (featureAttributeDescriptor.getDataType().isNumeric()&&!numericDataTypeFound) {
662
                        numericDataTypeFound = true;
663
                        validateNext=false;
664
                    }
665
                    //This is done to avoid to validate twice the same numeric field
666
                    if (validateNext){
667
                        if (featureAttributeDescriptor.getDataType().getType() != DataTypes.GEOMETRY) {
668
                            nonGeometricDataTypeFound = true;
669
                        }
670
                    }
671
                    dataTypesFound=nonGeometricDataTypeFound&&numericDataTypeFound;
672
                }
673
                if(dataTypesFound){
674
                    logger.debug("Correct point layer found");
675
                    correctPointLayerFound=true;
676
                }
677
            } catch (DataException e1) {
678
                logger.warn(
679
                    new StringBuilder().append("Error getting default feature type from layer ").append(lyrVect.getName())
680
                        .toString(), e1);
681
            }
682
        }
683
        return correctPointLayerFound;
684
    }
685

    
686
}