Revision 47436

View differences:

trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.fmap.control/src/main/java/org/gvsig/fmap/mapcontrol/dal/feature/swing/FeatureTable.java
209 209
        // Add a cell renderer for Geometries and Features
210 210
        setDefaultRenderer(Geometry.class, new GeometryWKTCellRenderer());
211 211
        setDefaultEditor(Geometry.class, new GeometryWKTCellEditor());
212

  
212 213
        setDefaultRenderer(Feature.class, new FeatureCellRenderer());
214
        setDefaultRenderer(BigDecimal.class, new FormattedCellRenderer());
215
        setDefaultRenderer(Double.class, new FormattedCellRenderer());
216
        setDefaultRenderer(Float.class, new FormattedCellRenderer());
217
        setDefaultRenderer(Integer.class, new FormattedCellRenderer());
218
        setDefaultRenderer(Long.class, new FormattedCellRenderer());
219
        setDefaultRenderer(Date.class, new FormattedCellRenderer());
220
        setDefaultRenderer(Boolean.class, new BooleanCellRenderer());
221
        setDefaultRenderer(String.class, new FeatureAttributeCellRenderer());
222
        setDefaultRenderer(Byte.class, new FeatureAttributeCellRenderer());
213 223

  
214 224
        if( this.getModel() instanceof ConfigurableFeatureTableModel ) {
215 225
            ConfigurableFeatureTableModel model = (ConfigurableFeatureTableModel)this.getModel();
216
            setDefaultRenderer(BigDecimal.class, new FormattedCellRenderer(model));
217
            setDefaultRenderer(Double.class, new FormattedCellRenderer(model));
218
            setDefaultRenderer(Float.class, new FormattedCellRenderer(model));
219
            setDefaultRenderer(Integer.class, new FormattedCellRenderer(model));
220
            setDefaultRenderer(Long.class, new FormattedCellRenderer(model));
221
            setDefaultRenderer(Date.class, new FormattedCellRenderer(model));
222
            setDefaultRenderer(Boolean.class, new BooleanCellRenderer());
223
            setDefaultRenderer(String.class, new FeatureAttributeCellRenderer(model));
224 226
            setDefaultEditor(Double.class, new FormattedCellEditor(model));
225 227
            setDefaultEditor(Float.class, new FormattedCellEditor(model));
226 228
            setDefaultEditor(Integer.class, new FormattedCellEditor(model));
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.fmap.control/src/main/java/org/gvsig/fmap/mapcontrol/dal/feature/swing/table/BooleanCellRenderer.java
5 5
 */
6 6
package org.gvsig.fmap.mapcontrol.dal.feature.swing.table;
7 7

  
8
import java.awt.Color;
9 8
import java.awt.Component;
10 9
import javax.swing.JCheckBox;
11 10
import javax.swing.JLabel;
......
13 12
import javax.swing.UIManager;
14 13
import javax.swing.border.Border;
15 14
import javax.swing.border.EmptyBorder;
16
import javax.swing.plaf.UIResource;
17
import javax.swing.table.TableCellRenderer;
18
import org.gvsig.fmap.dal.feature.Feature;
19
import static org.gvsig.fmap.dal.feature.Feature.CHECK_BASIC;
20
import static org.gvsig.fmap.dal.feature.Feature.CHECK_REQUIREDS;
21
import org.gvsig.tools.swing.api.ToolsSwingLocator;
22 15

  
23 16
/**
24 17
 *
25 18
 * @author fdiaz
26 19
 */
27
public class BooleanCellRenderer extends JCheckBox implements TableCellRenderer, UIResource {
20
public class BooleanCellRenderer extends FeatureAttributeCellRenderer { // implements TableCellRenderer, UIResource {
28 21

  
29 22
    private static final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
30
    protected final Color backgroundColorWarning;
23
    private final JCheckBox chkBox;
31 24

  
32 25
    @SuppressWarnings("OverridableMethodCallInConstructor")
33 26
    public BooleanCellRenderer() {
34
        super();
35
        setHorizontalAlignment(JLabel.CENTER);
36
        setBorderPainted(true);
37
        this.backgroundColorWarning = ToolsSwingLocator.getToolsSwingManager().getWarningBackgroundColor();
27
        this.chkBox = new JCheckBox();
28
        this.chkBox.setHorizontalAlignment(JLabel.CENTER);
29
        this.chkBox.setBorderPainted(true);
38 30
    }
39 31

  
40 32
    @Override
41 33
    public Component getTableCellRendererComponent(JTable table, Object value,
42 34
            boolean isSelected, boolean hasFocus, int row, int column) {
43 35
        try {
36
            this.chkBox.setBackground(this.getBackgroundColor(table, isSelected, row, column));
44 37
            if (isSelected) {
45
                setForeground(table.getSelectionForeground());
46
                super.setBackground(table.getSelectionBackground());
38
                this.chkBox.setForeground(table.getSelectionForeground());
47 39
            } else {
48
                ConfigurableFeatureTableModel tableModel = (ConfigurableFeatureTableModel) table.getModel();
49

  
50
                Feature feature = tableModel.getFeatureAt(row);
51
                setForeground(table.getForeground());
52
                setBackground(table.getBackground());
53
                if (tableModel.getFeatureStore().isFeatureModified(feature)) {
54
                    try {
55
                        feature.validate(Feature.CHECK_RULES_AT_FINISH | CHECK_REQUIREDS | CHECK_BASIC);
56
                    } catch (Exception ex) {
57
                        this.setBackground(this.backgroundColorWarning);
58
                    }
59
                }
40
                this.chkBox.setForeground(table.getForeground());
60 41
            }
61
            setSelected((value != null && ((Boolean) value)));
42
            this.chkBox.setSelected((value != null && ((Boolean) value)));
62 43

  
63 44
            if (hasFocus) {
64
                setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
45
                this.chkBox.setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
65 46
            } else {
66
                setBorder(noFocusBorder);
47
                this.chkBox.setBorder(noFocusBorder);
67 48
            }
68 49
        } catch (Exception e) {
69 50
            
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.fmap.control/src/main/java/org/gvsig/fmap/mapcontrol/dal/feature/swing/table/FeatureAttributeCellRenderer.java
2 2

  
3 3
import java.awt.Color;
4 4
import java.awt.Component;
5
import javax.swing.JLabel;
5 6
import javax.swing.JTable;
6
import javax.swing.UIManager;
7 7
import javax.swing.table.DefaultTableCellRenderer;
8 8
import org.gvsig.fmap.dal.feature.Feature;
9 9
import static org.gvsig.fmap.dal.feature.Feature.CHECK_BASIC;
10 10
import static org.gvsig.fmap.dal.feature.Feature.CHECK_REQUIREDS;
11 11
import org.gvsig.tools.swing.api.ToolsSwingLocator;
12
import org.gvsig.tools.swing.api.ToolsSwingManager;
13 12

  
14 13
/**
15 14
 *
......
18 17
@SuppressWarnings("UseSpecificCatch")
19 18
public class FeatureAttributeCellRenderer extends DefaultTableCellRenderer {
20 19

  
21
    protected ConfigurableFeatureTableModel tableModel;
22
    protected final Color backgroundColorOk;
23
    protected final Color backgroundColorWarning;
24

  
25
    public FeatureAttributeCellRenderer(ConfigurableFeatureTableModel tableModel) {
26
        this.tableModel = tableModel;
27
        this.backgroundColorOk = UIManager.getColor(ToolsSwingManager.COLOR_TABLE_BACKGROUND);
28
        this.backgroundColorWarning = ToolsSwingLocator.getToolsSwingManager().getWarningBackgroundColor();
20
    public FeatureAttributeCellRenderer() {
29 21
    }
30 22

  
31 23
    @Override
32 24
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
33
        super.getTableCellRendererComponent(table,value, isSelected, hasFocus,row, column);
25
        JLabel c = (JLabel) super.getTableCellRendererComponent(table,value, isSelected, hasFocus,row, column);
26
        c.setBackground(getBackgroundColor(table, isSelected, row, column));
27
        return c;
28
    }
29
    
30
    protected Color getBackgroundColor(JTable table, boolean isSelected, int row, int column){
34 31
        try {
35
            if( !isSelected ) {
36
                Feature feature = this.tableModel.getFeatureAt(row);
37
                this.setBackground(this.backgroundColorOk);
38
                if( tableModel.getFeatureStore().isFeatureModified(feature) ) {
39
                    try {
40
                        feature.validate(Feature.CHECK_RULES_AT_FINISH|CHECK_REQUIREDS|CHECK_BASIC);
41
                    } catch(Exception ex) {
42
                        this.setBackground(this.backgroundColorWarning);
32
            if( isSelected ) {
33
                return table.getSelectionBackground();
34
            } else {
35
                FeatureTableModel tableModel = getTableModel(table);
36
                Feature feature = tableModel.getFeatureAt(row);
37
                if(feature.isBroken()){
38
                    return ToolsSwingLocator.getToolsSwingManager().getWarningBackgroundColor();
39
                } else {
40
                    if( tableModel.getFeatureStore().isFeatureModified(feature) ) {
41
                        try {
42
                            feature.validate(Feature.CHECK_RULES_AT_FINISH|CHECK_REQUIREDS|CHECK_BASIC);
43
                        } catch(Exception ex) {
44
                            return ToolsSwingLocator.getToolsSwingManager().getWarningBackgroundColor();
45
                        }
43 46
                    }
44 47
                }
45 48
            }
46 49
        } catch (Exception ex) {
47
            // Do nothing, use values from default renderer
50
            return table.getBackground();
48 51
        }
49
        return this;
52
        return table.getBackground();
50 53
    }
54
    
55
    
56
    public ConfigurableFeatureTableModel getTableModel(JTable table){
57
        return (ConfigurableFeatureTableModel) table.getModel();
58
    }
51 59

  
52 60
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.fmap.control/src/main/java/org/gvsig/fmap/mapcontrol/dal/feature/swing/table/FormattedCellRenderer.java
6 6
import java.text.NumberFormat;
7 7
import java.text.SimpleDateFormat;
8 8
import java.util.Date;
9
import javax.swing.JLabel;
9 10
import javax.swing.JTable;
10 11
import javax.swing.SwingConstants;
11 12
import org.apache.commons.lang3.StringUtils;
......
13 14
@SuppressWarnings("UseSpecificCatch")
14 15
public class FormattedCellRenderer extends FeatureAttributeCellRenderer {
15 16

  
16
    private final DecimalFormat decimalFormat;
17
    private final SimpleDateFormat dateFormat;
17
    private DecimalFormat decimalFormat;
18
    private SimpleDateFormat dateFormat;
18 19

  
19
    public FormattedCellRenderer(ConfigurableFeatureTableModel tableModel) {
20
        super(tableModel);
21
        this.decimalFormat = (DecimalFormat) NumberFormat.getInstance(this.tableModel.getLocaleOfData());
22
        this.dateFormat = (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.MEDIUM, this.tableModel.getLocaleOfData());
20
    public FormattedCellRenderer() {
23 21
    }
24 22

  
25 23
    @Override
26 24
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
27
        super.getTableCellRendererComponent(table,value, isSelected, hasFocus,row, column);
25
        JLabel c = (JLabel) super.getTableCellRendererComponent(table,value, isSelected, hasFocus,row, column);
28 26
        try {
27
            ConfigurableFeatureTableModel tableModel = this.getTableModel(table);
28
            if(this.decimalFormat == null){
29
                this.decimalFormat = (DecimalFormat) NumberFormat.getInstance(tableModel.getLocaleOfData());
30
                this.dateFormat = (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.MEDIUM, tableModel.getLocaleOfData());
31
            }
29 32
            if ( value instanceof Number ) {
30
                String pattern = this.tableModel.getFormattingPattern(column);
33
                String pattern = this.getTableModel(table).getFormattingPattern(column);
31 34
                if ( !StringUtils.isBlank(pattern) ) {
32 35
                    this.decimalFormat.applyPattern(pattern);
33 36
                    String formated = this.decimalFormat.format(value);
34
                    this.setHorizontalAlignment(SwingConstants.RIGHT);
35
                    this.setText(formated);
37
                    c.setHorizontalAlignment(SwingConstants.RIGHT);
38
                    c.setText(formated);
36 39
                    return this;
37 40
                }
38 41
            }
39 42
            if ( value instanceof Date ) {
40
                String pattern = this.tableModel.getFormattingPattern(column);
43
                String pattern = this.getTableModel(table).getFormattingPattern(column);
41 44
                if ( !StringUtils.isBlank(pattern) ) {
42 45
                    this.dateFormat.applyPattern(pattern);
43 46
                    String formated = this.dateFormat.format(value);
44
                    this.setHorizontalAlignment(SwingConstants.RIGHT);
45
                    this.setText(formated);
47
                    c.setHorizontalAlignment(SwingConstants.RIGHT);
48
                    c.setText(formated);
46 49
                    return this;
47 50
                }
48 51
            }
49 52
        } catch (Exception ex) {
50 53
            // Do nothing, use values from default renderer
51 54
        }
52
        return this;
55
        return c;
53 56
    }
54 57

  
55 58
}
trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.fmap.control/src/main/java/org/gvsig/fmap/mapcontrol/dal/feature/swing/table/FeatureCellRenderer.java
49 49
 */
50 50
package org.gvsig.fmap.mapcontrol.dal.feature.swing.table;
51 51

  
52
import javax.swing.table.DefaultTableCellRenderer;
53

  
54 52
import org.gvsig.fmap.dal.feature.Feature;
55 53

  
56 54
/**
......
58 56
 * 
59 57
 * @author <a href="mailto:cordin@disid.com">C?sar Ordi?ana</a>
60 58
 */
61
public class FeatureCellRenderer extends DefaultTableCellRenderer {
59
public class FeatureCellRenderer extends FeatureAttributeCellRenderer {
62 60

  
63 61
    /**
64 62
     * Generated Serial UID.
65 63
     */
66 64
    private static final long serialVersionUID = 3547431185199502021L;
67 65

  
66
    public FeatureCellRenderer() {
67
    }
68

  
69
    @Override
68 70
    protected void setValue(Object value) {
69 71
        // TODO: change the current dumb implementation with something
70 72
        // more useful, as a link or button to show the Feature details
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/impl/JDBCSetProvider.java
144 144
    
145 145
    @Override
146 146
    public boolean canFilter() {
147
        return this.getHelper().supportFilter(this.getFeatureType(), getQuery().getFilter());
147
        return this.getHelper().supportFilter(this.getProviderFeatureType(), getQuery().getFilter());
148 148
    }
149 149

  
150 150
    @Override
151 151
    public boolean canOrder() {
152
        return this.getHelper().supportOrder(this.getFeatureType(), getQuery().getOrder());
152
        return this.getHelper().supportOrder(this.getProviderFeatureType(), getQuery().getOrder());
153 153
    }
154 154
    
155 155
    public ResulSetControler getResulSetControler() {
......
181 181
        if (size == null) {
182 182
            JDBCStoreParameters params = this.getJDBCStore().getParameters();
183 183
            CountOperation selectCount = this.getOperations().createCount(
184
                    this.getFeatureType(),
184
                    this.getProviderFeatureType(),
185 185
                    this.getOperations().createTableReference(params),
186 186
                    params.getBaseFilter(), 
187 187
                    this.getQuery()
......
202 202
//                    filtersql = filter.getSQL();
203 203
//                }
204 204
                TableIsEmptyOperation isEmpty_ = this.getOperations().createTableIsEmpty(
205
                        this.getFeatureType(),
205
                        this.getProviderFeatureType(),
206 206
                        this.getOperations().createTableReference(params),
207 207
                        params.getBaseFilter(), 
208 208
                        this.getQuery()
......
230 230
        JDBCStoreParameters params = this.getJDBCStore().getParameters();
231 231
        FeatureType storeType = this.getStore()
232 232
                .getStoreServices()
233
		.getProviderFeatureType(this.getFeatureType().getId());
233
		.getProviderFeatureType(this.getProviderFeatureType().getId());
234 234
        ResultSetForSetProviderOperation createResultSet 
235 235
            = getOperations().createResultSetForSetProvider(
236 236
                    this.getOperations().createTableReference(params),
......
238 238
                    params.getBaseOrder(), 
239 239
                    this.getQuery(), 
240 240
                    storeType, 
241
                    this.getFeatureType(), 
241
                    this.getProviderFeatureType(), 
242 242
                    elements, 
243 243
                    index, 
244 244
                    this.getFetchSize()
......
250 250
        return new JDBCFastIterator(
251 251
                this.getJDBCStore(), 
252 252
                this, 
253
                this.getFeatureType(),
253
                this.getProviderFeatureType(),
254 254
                resultSetEntry
255 255
        );
256 256
    }
......
268 268
        JDBCStoreParameters params = this.getJDBCStore().getParameters();
269 269
        FeatureType storeType = this.getStore()
270 270
                .getStoreServices()
271
		.getProviderFeatureType(this.getFeatureType().getId());
271
		.getProviderFeatureType(this.getProviderFeatureType().getId());
272 272
        ResultSetForSetProviderOperation createResultSet 
273 273
            = getOperations().createResultSetForSetProvider(
274 274
                    this.getOperations().createTableReference(params),
......
276 276
                    params.getBaseOrder(), 
277 277
                    this.getQuery(), 
278 278
                    storeType, 
279
                    this.getFeatureType(), 
279
                    this.getProviderFeatureType(), 
280 280
                    elements, 
281 281
                    index, 
282 282
                    this.getDefaultFetchSize()
......
287 287
        return new JDBCIterator(
288 288
                this.getJDBCStore(), 
289 289
                this, 
290
                this.getFeatureType(),
290
                this.getProviderFeatureType(),
291 291
                resultSetEntry
292 292
        );
293 293
    }
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.api/src/main/java/org/gvsig/fmap/dal/feature/Feature.java
496 496

  
497 497
    public Expression createFilter();
498 498
    
499
    public boolean isBroken();
500
    
499 501
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/AbstractFeatureSetProvider.java
63 63
                
64 64
	private final AbstractFeatureStoreProvider store;
65 65
	private final FeatureQuery query;
66
	private final FeatureType featureType;
66
	private final FeatureType providerFeatureType;
67
        private final FeatureType storeFeatureType;
67 68

  
68 69
	/**
69 70
	 * Creates a new {@link FeatureSetProvider}.
......
73 74
	 *            from
74 75
	 * @param query
75 76
	 *            used to create the {@link FeatureSetProvider}
76
	 * @param featureType
77
	 * @param providerFeatureType
77 78
	 *            the type of feature to get
78 79
	 */
79 80
	public AbstractFeatureSetProvider(AbstractFeatureStoreProvider store,
80
			FeatureQuery query, FeatureType featureType) {
81
			FeatureQuery query, FeatureType providerFeatureType, FeatureType storeFeatureType) {
81 82
		this.store = store;
82 83
		this.query = query;
83
		this.featureType = featureType;
84
		this.providerFeatureType = providerFeatureType;
85
		this.storeFeatureType = storeFeatureType;
84 86
	}
85

  
87
	public AbstractFeatureSetProvider(AbstractFeatureStoreProvider store,
88
			FeatureQuery query, FeatureType providerFeatureType) {
89
            this(store, query, providerFeatureType, null);
90
        }
86 91
	/**
87 92
	 * Return the {@link AbstractFeatureStoreProvider}.
88 93
	 * 
......
102 107
	}
103 108
    
104 109
	/**
105
	 * Returns the type of features to load.
110
	 * Returns the type of features from provider to load.
106 111
	 * 
107
	 * @return the featureType
112
	 * @return the providerFeatureType
108 113
	 */
109
	protected FeatureType getFeatureType() {
110
		return featureType;
114
	protected FeatureType getProviderFeatureType() {
115
		return providerFeatureType;
111 116
	}
112 117
    
118
	/**
119
	 * Returns the type of features from store to load.
120
	 * 
121
	 * @return the storeFeatureType
122
	 */
123
	protected FeatureType getStoreFeatureType() {
124
		return storeFeatureType;
125
	}
126
    
113 127
    @Override
114 128
	public final DisposableIterator fastIterator() throws DataException {
115 129
		return fastIterator(0);
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/FeatureProvider.java
90 90
  public Object getExtraValue(String name);
91 91

  
92 92
  public boolean hasExtraValue(String name);
93
  
94
  public boolean isBroken();
93 95

  
94 96
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/AbstractFeatureStoreProvider.java
52 52
import org.gvsig.fmap.dal.exception.ReadException;
53 53
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
54 54
import org.gvsig.fmap.dal.feature.FeatureLocks;
55
import org.gvsig.fmap.dal.feature.FeatureQuery;
55 56
import org.gvsig.fmap.dal.feature.FeatureReference;
56 57
import org.gvsig.fmap.dal.feature.FeatureSelection;
57 58
import org.gvsig.fmap.dal.feature.FeatureStore;
......
648 649
            return super.toString();
649 650
        }
650 651
    }
652

  
653
    @Override
654
    public FeatureSetProvider createSet(FeatureQuery query, FeatureType providerFeatureType, FeatureType storeFeatureType) throws DataException {
655
        return this.createSet(query, storeFeatureType);
656
    }
657
    
658
    
651 659
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/DefaultFeatureProvider.java
22 22
 */
23 23
package org.gvsig.fmap.dal.feature.spi;
24 24

  
25
import java.math.BigDecimal;
25 26
import org.apache.commons.lang3.ArrayUtils;
26 27
import org.apache.commons.lang3.StringUtils;
27 28
import org.gvsig.fmap.dal.DataTypes;
......
34 35
import org.gvsig.tools.ToolsLocator;
35 36
import org.gvsig.tools.dataTypes.Coercion;
36 37
import org.gvsig.tools.dataTypes.CoercionException;
38
import org.gvsig.tools.math.BigDecimalUtils;
37 39

  
38 40
/**
39 41
 * Default implementation for {@link FeatureProvider}
......
51 53
    
52 54
    private String[] extraValuesNames;
53 55
    private Object[] extraValues;
56
    
57
    protected boolean broken;
54 58

  
55 59
    public DefaultFeatureProvider(FeatureType type) {
56
        if (type instanceof EditableFeatureType) {
57
            throw new IllegalArgumentException("type can't by editable.");
58
        }
60
//        if (type instanceof EditableFeatureType) {
61
//            throw new IllegalArgumentException("type can't be editable.");
62
//        }
59 63
        this.featureType = type;
60 64
        this.values = new Object[featureType.size()];
61 65
        this.nulls = new boolean[featureType.size()];
......
63 67
        this.envelope = null;
64 68
        this.defaultGeometry = null;
65 69
        this.oid = null;
70
        this.broken = false;
66 71
    }
67 72

  
68 73
    public DefaultFeatureProvider(FeatureType type, Object oid) {
......
124 129
                                + value.toString()
125 130
                                + "' and context '"
126 131
                                + attribute.getCoercionContext()
127
                                + "'.");
132
                                + "' to assign to '"
133
                                + attribute.getName()
134
                                + "'.",e);
128 135
                    }
136
                } else {
137
                    try {
138
                        switch(attribute.getType()){
139
                            case DataTypes.DECIMAL:
140
                                value = BigDecimalUtils.force((BigDecimal) value, attribute.getScale(), attribute.getPrecision());
141
                                break;
142
                        }
143
                    } catch(Throwable th) {
144
                            throw new IllegalArgumentException("Can't assign "
145
                                + value.toString()
146
                                + " to '"
147
                                + attribute.getName()
148
                                + "'.",th);
149

  
150
                    }
129 151
                }
130 152
            }
131 153
        }
......
211 233
        } else {
212 234
            data.extraValuesNames = null;
213 235
        }
236
        data.broken = this.broken;
214 237
        return data;
215 238
    }
216 239

  
......
369 392
        this.extraValuesNames = extraValueNames;
370 393
        this.extraValues = new Object[this.extraValuesNames.length];
371 394
    }
395

  
396
    @Override
397
    public boolean isBroken() {
398
        return this.broken;
399
    }
372 400
    
373 401
    
374 402
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/FeatureStoreProvider.java
116 116
	public FeatureSetProvider createSet(FeatureQuery query,
117 117
			FeatureType featureType) throws DataException;
118 118

  
119
	public FeatureSetProvider createSet(FeatureQuery query,
120
			FeatureType providerFeatureType, FeatureType storeFeatureType) throws DataException;
121

  
119 122
	/**
120 123
	 * Return {@link FeatureProvider} from a
121 124
	 * {@link FeatureReferenceProviderServices} using
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/memory/MemoryFeatureProviderAttributeMapper.java
262 262
  public boolean hasExtraValue(String name) {
263 263
    return this.original.hasExtraValue(name);
264 264
  }
265

  
266
    @Override
267
    public boolean isBroken() {
268
        return false;
269
    }
265 270
    
266 271
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/memory/MemoryFeatureSet.java
101 101
		}
102 102
		Iterator iter =
103 103
				index <= 0 ? data.iterator() : data.listIterator((int) index);
104
		if (getFeatureType() == null) {
104
		if (getProviderFeatureType() == null) {
105 105
			return new DelegatedDisposableIterator(getStore(), iter);
106 106
		} else {
107 107
			return new DelegatedDisposableWrappedIterator(getStore(), iter,
108
					getFeatureType());
108
					getProviderFeatureType());
109 109
		}
110 110
	}
111 111

  
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.shp/src/main/java/org/gvsig/fmap/dal/store/shp/SHPFeatureProvider.java
1 1
/**
2 2
 * gvSIG. Desktop Geographic Information System.
3 3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
4
 * Copyright (C) 2007-2023 gvSIG Association.
5 5
 *
6 6
 * This program is free software; you can redistribute it and/or
7 7
 * modify it under the terms of the GNU General Public License
......
26 26
import org.gvsig.fmap.dal.exception.DataException;
27 27
import org.gvsig.fmap.dal.exception.ReadRuntimeException;
28 28
import org.gvsig.fmap.dal.feature.FeatureType;
29
import org.gvsig.fmap.dal.feature.spi.DefaultFeatureProvider;
30
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
29
import org.gvsig.fmap.dal.store.dbf.DBFFeatureProvider;
31 30
import org.gvsig.fmap.geom.Geometry;
32 31
import org.gvsig.fmap.geom.primitive.Envelope;
33 32

  
34
public class SHPFeatureProvider extends DefaultFeatureProvider {
35
	protected SHPStoreProvider store;
36
	protected boolean loading;
37
	protected boolean loaded;
33
public class SHPFeatureProvider extends DBFFeatureProvider {
38 34

  
35
    public SHPFeatureProvider(SHPStoreProvider store, FeatureType providerFeatureType, FeatureType storeFeatureType) {
36
        super(store, providerFeatureType, storeFeatureType);
37
    }
39 38

  
40
	public SHPFeatureProvider(SHPStoreProvider store, FeatureType type) {
41
		super(type);
42
		this.store = store;
43
		loading = false;
44
		loaded = false;
45
	}
46

  
47
	protected void load() {
48
		if (loading || loaded || this.isNew()) {
49
			return;
50
		}
51
		loading = true;
52
		try {
53
			this.store.loadFeatureProviderByIndex(this);
54
		} catch (DataException e) {
55
                    throw new ReadRuntimeException(getNameForMessages(), this.getOID(), e);
56
		} finally {
57
			loading = false;
58
			loaded = true;
59
		}
60
	}
61
        
62
        protected String getNameForMessages() {
63
            // Solo con proposito de mostrar en mensajes de error.
64
            try {
65
                return this.store.getName();
66
            } catch(Exception ex) {
67
                return "unknown";
68
            }
39
    @Override
40
    protected void load() {
41
        if (loading || loaded || this.isNew()) {
42
                return;
69 43
        }
44
        loading = true;
45
        try {
46
            ((SHPStoreProvider)this.store).loadFeatureProviderByIndex(this);
47
        } catch (DataException e) {
48
            throw new ReadRuntimeException(getNameForMessages(), this.getOID(), e);
49
        } finally {
50
                loading = false;
51
                loaded = true;
52
        }
53
    }
70 54

  
71
	public void set(int i, Object value) {
72
		this.load();
73
		super.set(i, value);
74
	}
75 55

  
76
	public void set(String name, Object value) {
77
		this.load();
78
		super.set(featureType.getIndex(name), value);
79
	}
56
    @Override
57
    public Geometry getDefaultGeometry() {
58
        this.load();
59
        Geometry geom = this.defaultGeometry;
60
        if (geom != null && geom.getProjection() == null) {
61
            geom.setProjection(((SHPStoreProvider) this.store).getProjection());
62
        }
63
        return geom;
64
    }
80 65

  
81
	public Object get(int i) {
82
		this.load();
83
		return super.get(i);
84
	}
66
    @Override
67
    public Envelope getDefaultEnvelope() {
68
        return this.envelope;
69
    }
85 70

  
86
	public Object get(String name) {
87
		this.load();
88
		return super.get(name);
89
	}
90

  
91
	public Geometry getDefaultGeometry() {
92
		this.load();
93
                Geometry geom = this.defaultGeometry;
94
                if( geom!=null && geom.getProjection()==null ) {
95
                    geom.setProjection(this.store.getProjection());
96
                }
97
		return geom;
98
	}
99

  
100
	public Envelope getDefaultEnvelope() {
101
		return this.envelope;
102
	}
103

  
104
	public void setOID(Object oid) {
105
		this.loaded = false;
106
		super.setOID(oid);
107
	}
108

  
109
	public FeatureProvider getCopy() {
110
		this.load();
111
		return super.getCopy();
112
	}
113

  
114 71
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.shp/src/main/java/org/gvsig/fmap/dal/store/shp/SHPStoreProvider.java
62 62
import org.gvsig.fmap.dal.resource.spi.MultiResource;
63 63
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
64 64
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
65
import org.gvsig.fmap.dal.store.dbf.DBFFeatureProvider;
65 66
import org.gvsig.fmap.dal.store.dbf.DBFStoreParameters;
66 67
import org.gvsig.fmap.dal.store.dbf.DBFStoreProvider;
67 68
import org.gvsig.fmap.dal.store.shp.utils.ISHPFile;
......
313 314
    /**
314 315
     *
315 316
     * @param index
316
     * @param featureType
317
     * @param providerFeatureType
317 318
     * @return
318 319
     * @throws ReadException
319 320
     */
320
    protected FeatureProvider getFeatureProviderByIndex(long index, FeatureType featureType) throws DataException {
321
    protected FeatureProvider getFeatureProviderByIndex(long index, FeatureType providerFeatureType, FeatureType storeFeatureType) throws DataException {
321 322
        this.open();
322 323
        try {
323 324

  
324
            FeatureProvider featureProvider = super.getFeatureProviderByIndex(index, featureType);
325
            FeatureProvider featureProvider = super.getFeatureProviderByIndex(index, providerFeatureType, storeFeatureType);
325 326
            featureProvider.setDefaultEnvelope(this.shpFile.getBoundingBox(index));
326 327
            return featureProvider;
327 328
        } catch (DataException e) {
......
407 408
        return true;
408 409
    }
409 410

  
410
    protected void loadValue(FeatureProvider featureProvider, long rowIndex, FeatureAttributeDescriptor descriptor)
411
    @Override
412
    protected void loadValue(DBFFeatureProvider featureProvider, long rowIndex, FeatureAttributeDescriptor descriptor)
411 413
        throws ReadException {
412
        if (descriptor.getType() == DataTypes.GEOMETRY) {
413
            return;
414
        } else {
415
            super.loadValue(featureProvider, rowIndex, descriptor);
414
        if (descriptor.getType() != DataTypes.GEOMETRY) {
415
            super.loadValue((DBFFeatureProvider) featureProvider, rowIndex, descriptor);
416 416
        }
417 417
    }
418 418

  
419 419
    public FeatureProvider createFeatureProvider(FeatureType type) throws DataException {
420
        FeatureProvider data = new SHPFeatureProvider(this, type);
420
        FeatureProvider data = new SHPFeatureProvider(this, type, null);
421 421
        return data;
422 422
    }
423 423

  
424
    public FeatureProvider createFeatureProvider(FeatureType providerFeatureType, FeatureType storeFeatureType) throws DataException {
425
        return new SHPFeatureProvider(this, providerFeatureType, storeFeatureType);
426
    }
427

  
428
    
424 429
    protected void openFile() throws IOException, DataException {
425 430
        super.openFile();
426 431
        this.shpFile.open();
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.csv/src/main/java/org/gvsig/fmap/dal/store/csv/CSVSetProvider.java
233 233
        return new CSVIterator(
234 234
                getStore(),
235 235
                getQuery(),
236
                getFeatureType(),
236
                getProviderFeatureType(),
237 237
                index
238 238
        );
239 239
    }
......
244 244
        return new FastCSVIterator(
245 245
                getStore(),
246 246
                getQuery(),
247
                getFeatureType(),
247
                getProviderFeatureType(),
248 248
                index
249 249
        );
250 250
    }
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.dbf/src/main/java/org/gvsig/fmap/dal/store/dbf/DBFStoreParameters.java
54 54
	public static final String HANDLE_DATES_AS_STRINGS = "handleDatesAsStrings";
55 55
	public static final String DATE_FORMAT = "dateFormat";
56 56
	public static final String LOCALE = "locale";
57
	public static final String ALLOW_DECIMAL_INCONSISTENCIES_PARAMTER_NAME = "allowInconsistenciesInDecimals";
57 58
    public static final String ALLOW_DUPLICATED_FIELD_NAMES = "allowDuplicatedFieldNames";
58 59

  
59 60
    // We don't want to persist or show effective encoding in the store parameters dialog
......
258 259
                }
259 260
            }
260 261
        }
262
        
263
        public boolean allowInconsistenciesInDecimals() {
264
            Boolean x = (Boolean) this.getDynValue(ALLOW_DECIMAL_INCONSISTENCIES_PARAMTER_NAME);
265
            if(x == null){
266
                return false;
267
            }
268
            return x;
269
        }
261 270

  
262 271
        private static class InvalidDateFormatException extends ValidateDataParametersException {
263 272

  
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.dbf/src/main/java/org/gvsig/fmap/dal/store/dbf/DBFFeatureProvider.java
32 32
import org.gvsig.fmap.geom.primitive.Envelope;
33 33

  
34 34
public class DBFFeatureProvider extends DefaultFeatureProvider {
35
	protected DBFStoreProvider store;
36
	protected boolean loading;
37
	protected boolean loaded;
38 35

  
39
	public DBFFeatureProvider(DBFStoreProvider store, FeatureType type) {
40
		super(type);
41
		this.store = store;
42
		loading = false;
43
		loaded = false;
44
	}
36
    protected DBFStoreProvider store;
37
    protected boolean loading;
38
    protected boolean loaded;
39
    private final FeatureType storeFeatureType;
45 40

  
46
	protected void load() {
47
		if (loading || loaded || this.isNew()) {
48
			return;
49
		}
50
		loading = true;
51
		try {
52
			this.store.loadFeatureProviderByIndex(this);
53
		} catch (DataException e) {
54
			throw new ReadRuntimeException(getNameForMessages(), this.getOID(), e);
55
		} finally {
56
			loading = false;
57
			loaded = true;
58
		}
59
	}
60
        
61
        protected String getNameForMessages() {
62
            // Solo con proposito de mostrar en mensajes de error.
63
            try {
64
                return this.store.getName();
65
            } catch(Exception ex) {
66
                return "unknown";
67
            }
41
    public DBFFeatureProvider(DBFStoreProvider store, FeatureType providerFeatureType, FeatureType storeFeatureType) {
42
        super(providerFeatureType);
43
        this.store = store;
44
        this.storeFeatureType = storeFeatureType;
45
        loading = false;
46
        loaded = false;
47
    }
48

  
49
    protected void load() {
50
        if (loading || loaded || this.isNew()) {
51
            return;
68 52
        }
53
        loading = true;
54
        try {
55
            this.store.loadFeatureProviderByIndex(this);
56
        } catch (DataException e) {
57
            throw new ReadRuntimeException(getNameForMessages(), this.getOID(), e);
58
        } finally {
59
            loading = false;
60
            loaded = true;
61
        }
62
    }
69 63

  
70
	public void set(int i, Object value) {
71
		this.load();
72
		super.set(i, value);
73
	}
64
    protected String getNameForMessages() {
65
        // Solo con proposito de mostrar en mensajes de error.
66
        try {
67
            return this.store.getName();
68
        } catch (Exception ex) {
69
            return "unknown";
70
        }
71
    }
74 72

  
75
	public void set(String name, Object value) {
76
		this.load();
77
		super.set(featureType.getIndex(name), value);
78
	}
73
    @Override
74
    public void set(int i, Object value) {
75
        this.load();
76
        super.set(i, value);
77
    }
79 78

  
80
	public Object get(int i) {
81
		this.load();
82
		return super.get(i);
83
	}
79
    @Override
80
    public void set(String name, Object value) {
81
        this.load();
82
        super.set(featureType.getIndex(name), value);
83
    }
84 84

  
85
	public Object get(String name) {
86
		this.load();
87
		return super.get(name);
88
	}
85
    @Override
86
    public Object get(int i) {
87
        this.load();
88
        return super.get(i);
89
    }
89 90

  
90
	public Geometry getDefaultGeometry() {
91
		return null;
92
	}
91
    @Override
92
    public Object get(String name) {
93
        this.load();
94
        return super.get(name);
95
    }
93 96

  
94
	public Envelope getDefaultEnvelope() {
95
		return null;
96
	}
97
    @Override
98
    public Geometry getDefaultGeometry() {
99
        return null;
100
    }
97 101

  
98
	public void setOID(Object oid) {
99
		this.loaded = false;
100
		super.setOID(oid);
101
	}
102
    @Override
103
    public Envelope getDefaultEnvelope() {
104
        return null;
105
    }
102 106

  
103
	public FeatureProvider getCopy() {
104
		this.load();
105
		return super.getCopy();
106
	}
107
    @Override
108
    public void setOID(Object oid) {
109
        this.loaded = false;
110
        super.setOID(oid);
111
    }
107 112

  
113
    @Override
114
    public FeatureProvider getCopy() {
115
        this.load();
116
        return super.getCopy();
117
    }
108 118

  
119
    public void setProviderFeatureType(FeatureType featureType) {
120
        this.featureType = featureType;
121
    }
109 122

  
123
    void setBroken(boolean b) {
124
        this.broken = b;
125
    }
110 126

  
127
    public FeatureType getStoreFeatureType() {
128
        return this.storeFeatureType;
129
    }
130

  
131
    public FeatureType getProviderFeatureType() {
132
        return this.getType();
133
    }
134

  
111 135
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.dbf/src/main/java/org/gvsig/fmap/dal/store/dbf/DBFSetProvider.java
41 41
public class DBFSetProvider extends AbstractFeatureSetProvider {
42 42

  
43 43
	public DBFSetProvider(DBFStoreProvider store, FeatureQuery query,
44
			FeatureType featureType)
44
			FeatureType providerFeatureType, FeatureType storeFeatureType)
45 45
			throws DataException {
46
		super(store, query, featureType);
46
//		super(store, query, providerFeatureType, storeFeatureType);
47
		super(store, query, getEditable(providerFeatureType), storeFeatureType);
47 48
	}
49
        
50
        private static FeatureType getEditable(FeatureType type) {
51
            try {
52
//                return type;
53
                return type.getEditable();
54
            } catch (UnsupportedOperationException ex) {
55
                return type.getCopy().getEditable();
56
            }
57
        }
48 58

  
49 59
	public boolean canFilter() {
50 60
		return false;
......
72 82

  
73 83
	protected AbstractFeatureProviderIterator createIterator(long index)
74 84
			throws DataException {
75
		return new DBFIterator((DBFStoreProvider) getStore(), getFeatureType(),
85
		return new DBFIterator((DBFStoreProvider) getStore(), getProviderFeatureType(),
76 86
				index);
77 87
	}
78 88

  
79 89
	protected AbstractFeatureProviderIterator createFastIterator(long index)
80 90
			throws DataException {
81 91
		return new FastDBFIterator((DBFStoreProvider) getStore(),
82
				getFeatureType(), index);
92
				getProviderFeatureType(), index);
83 93
	}
84 94

  
85 95
	protected class DBFIterator extends AbstractFeatureProviderIterator {
......
107 117

  
108 118
				FeatureProvider ret =
109 119
						getDBFStoreProvider().getFeatureProviderByIndex(index,
110
								this.type);
120
								this.type, getStoreFeatureType());
111 121
				index++;
112 122
				return ret;
113 123
			} catch (DataException e) {
......
148 158
		public FastDBFIterator(DBFStoreProvider store, FeatureType type,
149 159
				long startOn) throws DataException {
150 160
			super(store, type, startOn);
151
			this.data = getFeatureStoreProvider().createFeatureProvider(type);
161
			this.data = getDBFStoreProvider().createFeatureProvider(type, getStoreFeatureType());
152 162
		}
153 163

  
154 164
		protected Object internalNext() {
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.dbf/src/main/java/org/gvsig/fmap/dal/store/dbf/DBFStoreProvider.java
27 27
import java.math.BigDecimal;
28 28
import java.nio.charset.Charset;
29 29
import java.util.ArrayList;
30
import java.util.Date;
30 31
import java.util.Iterator;
31 32
import java.util.List;
32
import java.util.logging.Level;
33

  
33
import java.util.Locale;
34 34
import org.apache.commons.io.FileUtils;
35
import org.apache.commons.lang3.StringUtils;
36

  
35
import org.apache.commons.lang3.mutable.MutableInt;
37 36
import org.gvsig.fmap.dal.DALLocator;
38 37
import org.gvsig.fmap.dal.DataManager;
39 38
import org.gvsig.fmap.dal.DataServerExplorer;
......
49 48
import org.gvsig.fmap.dal.exception.ReadException;
50 49
import org.gvsig.fmap.dal.exception.UnsupportedVersionException;
51 50
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
51
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
52 52
import org.gvsig.fmap.dal.feature.EditableFeatureType;
53 53
import org.gvsig.fmap.dal.feature.Feature;
54 54
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
......
82 82
import org.gvsig.metadata.MetadataLocator;
83 83
import org.gvsig.metadata.MetadataManager;
84 84
import org.gvsig.metadata.exceptions.MetadataException;
85
import org.gvsig.tools.dataTypes.CoercionContext;
86
import org.gvsig.tools.dataTypes.CoercionContextDecimal;
85 87
import org.gvsig.tools.dataTypes.CoercionException;
86 88
import org.gvsig.tools.dispose.DisposableIterator;
87 89
import org.gvsig.tools.dynobject.DynObject;
88 90
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
89 91
import org.gvsig.tools.exception.BaseException;
90 92
import org.gvsig.tools.logger.FilteredLogger;
91

  
93
import org.gvsig.tools.math.BigDecimalUtils;
92 94
import org.slf4j.Logger;
93 95
import org.slf4j.LoggerFactory;
96
import sun.security.ec.point.ProjectivePoint;
94 97

  
95 98
public class DBFStoreProvider extends AbstractFeatureStoreProvider implements
96 99
        ResourceConsumer {
......
170 173

  
171 174
    }
172 175

  
176
    @Override
173 177
    public Object getDynValue(String name) throws DynFieldNotFoundException {
174 178
        try {
175 179
            this.open();
......
201 205
        dbfResource.addConsumer(this);
202 206
    }
203 207

  
208
    @Override
204 209
    public String getProviderName() {
205 210
        return NAME;
206 211
    }
......
209 214
        return (DBFStoreParameters) super.getParameters();
210 215
    }
211 216

  
217
    @Override
212 218
    public DataServerExplorer getExplorer() throws ReadException {
213 219
        DataManager manager = DALLocator.getDataManager();
214 220
        FilesystemServerExplorerParameters params;
......
222 228
        }
223 229
    }
224 230

  
231
    @Override
225 232
    protected FeatureProvider internalGetFeatureProviderByReference(
226 233
            FeatureReferenceProviderServices reference, FeatureType featureType)
227 234
            throws DataException {
228 235
        return this.getFeatureProviderByIndex(
229
                ((Number) reference.getOID()).longValue(), featureType);
236
                ((Number) reference.getOID()).longValue(), featureType, null);
230 237
    }
231 238

  
239
    @Override
232 240
    public void performChanges(Iterator deleteds, Iterator inserteds,
233 241
            Iterator updateds, Iterator originalFeatureTypesUpdated)
234 242
            throws PerformEditingException {
......
358 366
        }
359 367
    }
360 368

  
361
    public FeatureProvider createFeatureProvider(FeatureType type) throws DataException {
362
        return new DBFFeatureProvider(this, type);
369
    @Override
370
    public FeatureProvider createFeatureProvider(FeatureType providerFeatureType) throws DataException {
371
        return new DBFFeatureProvider(this, providerFeatureType, null);
363 372
    }
364 373

  
374
    public FeatureProvider createFeatureProvider(FeatureType providerFeatureType, FeatureType storeFeatureType) throws DataException {
375
        return new DBFFeatureProvider(this, providerFeatureType, storeFeatureType);
376
    }
377

  
365 378
    protected void initFeatureType() throws InitializeException {
366 379
        this.featureType = this.getTheFeatureType();
367 380
        FeatureType defaultType = this.featureType.getNotEditableCopy();
......
398 411
    }
399 412
    
400 413
    
401
    protected void loadValue(FeatureProvider featureProvider, long rowIndex,
414
    protected void loadValue(DBFFeatureProvider featureProvider, long rowIndex,
402 415
            FeatureAttributeDescriptor descriptor) throws ReadException {
403 416

  
404 417
        if (descriptor.getEvaluator() != null) {
......
437 450
                break;
438 451

  
439 452
            case DataTypes.DECIMAL:
440
                featureProvider.set(index, 
441
                    formatter.parseDecimal(
442
                        value, 
443
                        descriptor.getMathContext(), 
444
                        descriptor.getScale(),
445
                        (BigDecimal) defaultValue
446
                  )
453
                BigDecimal d = formatter.parseDecimal(
454
                    value,
455
                    descriptor.getMathContext(),
456
                    descriptor.getScale(),
457
                    (BigDecimal) defaultValue
447 458
                );
459
                if (!BigDecimalUtils.isValid(d, descriptor.getScale(), descriptor.getPrecision())) {
460
                    DBFStoreParameters params = this.getDBFParameters();
461
                    if(params.allowInconsistenciesInDecimals() ) {
462
                        MutableInt scale = new MutableInt(descriptor.getScale());
463
                        MutableInt precision = new MutableInt(descriptor.getPrecision());
464
                        d = BigDecimalUtils.fixIfCan(d, scale, precision);
465
                        updateStoreScaleAndPrecision(featureProvider, descriptor, scale.intValue(), precision.intValue());
466
                    } else {
467
                        FeatureType storeFeatureType = featureProvider.getStoreFeatureType();
468
                        if(storeFeatureType != null){
469
                            FeatureAttributeDescriptor storeDescriptor = storeFeatureType.getAttributeDescriptor(descriptor.getName());
470
                            if (storeDescriptor instanceof EditableFeatureAttributeDescriptor && BigDecimalUtils.isValid(d, storeDescriptor.getScale(), storeDescriptor.getPrecision())) {
471
                                ((EditableFeatureAttributeDescriptor)descriptor).setScale(storeDescriptor.getScale());
472
                                ((EditableFeatureAttributeDescriptor)descriptor).setPrecision(storeDescriptor.getPrecision());
473
                            }
474
                        }
475
                    }
476
                }
477
                featureProvider.set(index,d);
448 478
                break;
449 479

  
450 480
            case DataTypes.DOUBLE:
......
499 529
    protected FeatureProvider getFeatureProviderByIndex(long index) throws DataException {
500 530
        return this
501 531
                .getFeatureProviderByIndex(index, this.getStoreServices()
502
                        .getDefaultFeatureType());
532
                        .getDefaultFeatureType(), null);
503 533
    }
504 534

  
535
    @Override
505 536
    public long getFeatureCount() throws ReadException, OpenException,
506 537
            ResourceNotifyChangesException {
507 538
        this.open();
508
        return (long) getResource().execute(new ResourceAction() {
509
            public Object run() throws Exception {
510
                return (long) dbfFile.getRecordCount();
511
            }
512
        });
539
        return (long) getResource().execute(() -> (long) dbfFile.getRecordCount());
513 540
    }
514 541

  
542
    @Override
515 543
    public FeatureSetProvider createSet(FeatureQuery query, FeatureType featureType)
516 544
            throws DataException {
517
        return new DBFSetProvider(this, query, featureType);
545
        return new DBFSetProvider(this, query, featureType, null);
518 546
    }
519 547

  
548
    public FeatureSetProvider createSet(FeatureQuery query, FeatureType providerFeatureType, FeatureType storeFeatureType)
549
            throws DataException {
550
        return new DBFSetProvider(this, query, providerFeatureType, storeFeatureType);
551
    }
552

  
520 553
    public boolean canCreate() {
521 554
        return true;
522 555
    }
......
600 633
    }
601 634

  
602 635
    public boolean allowWrite() {
603
        if(allowDuplicatedFieldNames){
636
        if(allowDuplicatedFieldNames || this.getDBFParameters().allowInconsistenciesInDecimals()){
604 637
            return false;
605 638
        }
606 639
        return this.dbfFile.isWritable();
......
621 654
    }
622 655

  
623 656
    protected FeatureProvider getFeatureProviderByIndex(long index,
624
            FeatureType featureType) throws DataException {
625
        FeatureProvider featureProvider = this.createFeatureProvider(featureType);
657
            FeatureType providerFeatureType, FeatureType storeFeatureType) throws DataException {
658
        FeatureProvider featureProvider = this.createFeatureProvider(providerFeatureType, storeFeatureType);
626 659
        featureProvider.setOID(index);
627 660
        return featureProvider;
628 661
    }
......
649 682
            throw rex;
650 683
        }
651 684

  
685
//        long t1 = System.nanoTime();
686
        ((DBFFeatureProvider)featureProvider).setBroken(false);
652 687
        for (FeatureAttributeDescriptor desc : featureProvider.getType()) {
653
            this.loadValue(featureProvider, index, desc);
688
            try {
689
                this.loadValue((DBFFeatureProvider)featureProvider, index, desc);
690
            } catch (Throwable th) {
691
                this.logger.warn("Can't load value for attribute '"+desc.getName()+"'", th);
692
                ((DBFFeatureProvider)featureProvider).setBroken(true);
693
                featureProvider.set(desc.getIndex(), null);
694
            }
654 695
        }
696
//        long t2 = System.nanoTime();
697
//        LOG.info("load "+index+" in :"+(t2-t1));
655 698
    }
656 699

  
700
    @Override
657 701
    public int getOIDType() {
658 702
        return DataTypes.LONG;
659 703
    }
660 704

  
705
    @Override
661 706
    public Object createNewOID() {
662 707
        if (this.counterNewsOIDs < 0) {
663 708
            try {
......
672 717
        return counterNewsOIDs;
673 718
    }
674 719

  
720
    @Override
675 721
    public boolean supportsAppendMode() {
676 722
        return true;
677 723
    }
678 724

  
725
    @Override
679 726
    public void append(final FeatureProvider featureProvider)
680 727
            throws DataException {
681
        getResource().execute(new ResourceAction() {
682
            public Object run() throws Exception {
683
                writer.append(getStoreServices().createFeature(featureProvider));
684
                return null;
685
            }
728
        getResource().execute(() -> {
729
            writer.append(getStoreServices().createFeature(featureProvider));
730
            return null;
686 731
        });
687 732
    }
688 733

  
734
    @Override
689 735
    public void beginAppend() throws DataException {
690 736
        this.close();
691
        getResource().execute(new ResourceAction() {
692
            public Object run() throws Exception {
693
                writer.begin(getDBFParameters(),
694
                        getStoreServices().getDefaultFeatureType(),
695
                        getStoreServices().getFeatureStore().getFeatureCount());
696
                return null;
697
            }
737
        getResource().execute(() -> {
738
            writer.begin(getDBFParameters(),
739
                    getStoreServices().getDefaultFeatureType(),
740
                    getStoreServices().getFeatureStore().getFeatureCount());
741
            return null;
698 742
        });
699 743
    }
700 744

  
......
774 818
        }
775 819
    }
776 820

  
821
    private void updateStoreScaleAndPrecision(DBFFeatureProvider featureProvider, FeatureAttributeDescriptor descriptor, int scale, int precision) {
822
        if(descriptor.getType() == DataTypes.DECIMAL){
823
            if(descriptor.getScale() == scale && descriptor.getPrecision() == precision) {
824
                return;
825
            }
826
            FeatureType ft = this.getFeatureStore().getDefaultFeatureTypeQuietly();
827
            FeatureAttributeDescriptor d = ft.getAttributeDescriptor(descriptor.getName());
828
            if(d.getScale() == scale && d.getPrecision() == precision) {
829
                ((DBFFeatureProvider)featureProvider).setProviderFeatureType(ft);
830
                return;
831
            }
832
            EditableFeatureType eft = ft.getEditable();
833
            EditableFeatureAttributeDescriptor ed = (EditableFeatureAttributeDescriptor) eft.getAttributeDescriptor(descriptor.getName());
834
            ed.setScale(scale);
835
            ed.setPrecision(precision);
836
            ft = eft.getNotEditableCopy();
837
            ((DBFFeatureProvider)featureProvider).setProviderFeatureType(ft);
838
            this.setStoreFeatureType(ft);
839
        }
840
    }
841

  
777 842
}
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.dbf/src/main/java/org/gvsig/fmap/dal/store/dbf/DBFFeatureWriter.java
29 29
import java.io.RandomAccessFile;
30 30
import java.nio.channels.FileChannel;
31 31
import java.nio.channels.WritableByteChannel;
32
import java.util.Objects;
32 33

  
33 34
import org.gvsig.fmap.dal.exception.DataException;
34 35
import org.gvsig.fmap.dal.exception.InitializeException;
......
99 100
	}
100 101

  
101 102
	public void append(Feature feature) throws DataException {
102
		// TODO use FeatureProvider
103
		dbfWriter.append(feature);
103
            if(feature.isBroken()){
104
                throw new IllegalStateException("The feature '"+Objects.toString(feature.getReference())+"' is broken.");
105
            }
106
            // TODO use FeatureProvider
107
            dbfWriter.append(feature);
104 108
	}
105 109

  
106 110
	public void end() throws DataException {
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.dbf/src/main/resources/org/gvsig/fmap/dal/store/dbf/DBFParameters.xml
83 83
        <field order="105" name="allowDuplicatedFieldNames" label="Allow duplicated field names" type="boolean" mandatory="false" defaultValue="false" group="Advanced">
84 84
          <description>If set allow duplicated field names. The layer will be read only.</description>
85 85
        </field>
86
        <field order="105" name="allowInconsistenciesInDecimals" label="Allow inconsistencies in decimals" type="boolean" mandatory="false" defaultValue="false" group="Advanced">
87
          <description>If set allow inconsistencies in decimals. The layer will be read only.</description>
88
        </field>
86 89
      </fields>
87 90
    </class>
88 91

  
trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.dbf/src/test/java/org/gvsig/fmap/dal/store/dbf/TestCreate.java
318 318
    
319 319
    
320 320
    public void testCreateWithDALFile() throws Exception {
321
        FeatureStore sourceStore = TestUtils.openSourceStore1();
322
        
323
        createFrom(sourceStore);        
324
        
325
        checkTypes(sourceStore.getDefaultFeatureType(),true);
326
        copyFrom(sourceStore, FeatureStore.MODE_APPEND);
327
        checkData(sourceStore);
328
        
329
        createFrom(sourceStore);
330
        copyFrom(sourceStore, FeatureStore.MODE_FULLEDIT);
331
        checkData(sourceStore);
321
        try {
322
            FeatureStore sourceStore = TestUtils.openSourceStore1();
332 323

  
324
            createFrom(sourceStore);        
325

  
326
            checkTypes(sourceStore.getDefaultFeatureType(),true);
327
            copyFrom(sourceStore, FeatureStore.MODE_APPEND);
328
            checkData(sourceStore);
329

  
330
            createFrom(sourceStore);
331
            copyFrom(sourceStore, FeatureStore.MODE_FULLEDIT);
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff