Statistics
| Revision:

root / trunk / libraries / libExpressions / src / main / java / org / gvsig / gui / EvalExpression.java @ 23299

History | View | Annotate | Download (9.33 KB)

1
package org.gvsig.gui;
2

    
3
import java.sql.Types;
4
import java.util.ArrayList;
5
import java.util.BitSet;
6
import java.util.Date;
7
import java.util.Iterator;
8
import java.util.List;
9
import java.util.prefs.Preferences;
10

    
11
import org.gvsig.templates.IEvalListener;
12

    
13
import com.hardcode.gdbms.driver.exceptions.InitializeWriterException;
14
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
15
import com.hardcode.gdbms.engine.values.Value;
16
import com.hardcode.gdbms.engine.values.ValueFactory;
17
import com.iver.andami.PluginServices;
18
import com.iver.andami.messages.NotificationManager;
19
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
20
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileWriteException;
21
import com.iver.cit.gvsig.exceptions.validate.ValidateRowException;
22
import com.iver.cit.gvsig.exceptions.visitors.StopWriterVisitorException;
23
import com.iver.cit.gvsig.fmap.core.IRow;
24
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
25
import com.iver.cit.gvsig.fmap.drivers.ILayerDefinition;
26
import com.iver.cit.gvsig.fmap.drivers.ITableDefinition;
27
import com.iver.cit.gvsig.fmap.edition.DefaultRowEdited;
28
import com.iver.cit.gvsig.fmap.edition.EditionEvent;
29
import com.iver.cit.gvsig.fmap.edition.IEditableSource;
30
import com.iver.cit.gvsig.fmap.edition.IRowEdited;
31
import com.iver.cit.gvsig.fmap.edition.ISpatialWriter;
32
import com.iver.cit.gvsig.fmap.edition.IWriteable;
33
import com.iver.cit.gvsig.fmap.edition.IWriter;
34
import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
35
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
36
import com.iver.cit.gvsig.project.documents.table.gui.Table;
37
/**
38
 * @author Vicente Caballero Navarro
39
 */
40
public class EvalExpression {
41
        private FieldDescription[] fieldDescriptors;
42
        private int selectedIndex;
43
        private FieldDescription fieldDescriptor;
44
        private FLyrVect lv;
45
        private  IEditableSource ies =null;
46
        private Table table=null;
47
        private static Preferences prefs = Preferences.userRoot().node( "fieldExpressionOptions" );
48
        private int limit;
49
        private List evalListenerList;
50
        public EvalExpression() {
51
                limit=prefs.getInt("limit_rows_in_memory",-1);
52
        }
53
        public void setTable(Table table) {
54
                BitSet columnSelected = table.getSelectedFieldIndices();
55
        fieldDescriptors = table.getModel().getModelo().getFieldsDescription();
56
        selectedIndex = columnSelected.nextSetBit(0);
57
        fieldDescriptor = fieldDescriptors[selectedIndex];
58
        this.table=table;
59
        lv=(FLyrVect)table.getModel().getAssociatedTable();
60
        if (lv ==null)
61
            ies=table.getModel().getModelo();
62
        else
63
            ies = (VectorialEditableAdapter) lv.getSource();
64
        }
65
        
66
         public FLyrVect getFLyrVect() {
67
                return lv;
68
        }
69
        public void setFLyrVect(FLyrVect lv) {
70
                this.lv = lv;
71
                if (lv ==null)
72
            ies=table.getModel().getModelo();
73
        else
74
            ies = (VectorialEditableAdapter) lv.getSource();
75
                
76
                fieldDescriptors = ies.getFieldsDescription();
77
                try {
78
                        selectedIndex = ies.getSelection().nextSetBit(0);
79
                } catch (ReadDriverException e) {
80
                        // TODO Auto-generated catch block
81
                        e.printStackTrace();
82
                }
83
        }
84
        public void setValue(Object obj,int i) {
85
                    //VectorialEditableAdapter vea = (VectorialEditableAdapter) lv.getSource();
86
                     Value value = getValue(obj);
87
                     //System.out.println("num = "+i);
88
                     IRow feat=null;
89
                        try {
90
                                feat = ies.getRow(i).getLinkedRow().cloneRow();
91
                        } catch (ExpansionFileReadException e) {
92
                                NotificationManager.addError(e);
93
                        } catch (ReadDriverException e) {
94
                                NotificationManager.addError(e);
95
                        }
96
                     Value[] values = feat.getAttributes();
97
                     values[selectedIndex] = value;
98
                     feat.setAttributes(values);
99

    
100
                     IRowEdited edRow = new DefaultRowEdited(feat,
101
                                     IRowEdited.STATUS_MODIFIED, i);
102
                     try {
103
                                ies.modifyRow(edRow.getIndex(), edRow.getLinkedRow(), "",
104
                                                 EditionEvent.ALPHANUMERIC);
105
                        } catch (ExpansionFileWriteException e) {
106
                                NotificationManager.addError(e);
107
                        } catch (ExpansionFileReadException e) {
108
                                NotificationManager.addError(e);
109
                        } catch (ValidateRowException e) {
110
                                NotificationManager.addError(e);
111
                        } catch (ReadDriverException e) {
112
                                NotificationManager.addError(e);
113
                        }
114

    
115
            }
116
         /**
117
             * Returns the value created from object.
118
             *
119
             * @param obj value.
120
             *
121
             * @return Value.
122
             */
123
            private Value getValue(Object obj) {
124
                int typeField = fieldDescriptor.getFieldType();
125
                Value value = null;//ValueFactory.createNullValue();
126

    
127
                if (obj instanceof Number) {
128
                    if (typeField == Types.DOUBLE || typeField == Types.NUMERIC) {
129
                        double dv = ((Number) obj).doubleValue();
130
                        value = ValueFactory.createValue(dv);
131
                    } else if (typeField == Types.FLOAT) {
132
                        float df = ((Number) obj).floatValue();
133
                        value = ValueFactory.createValue(df);
134
                    } else if (typeField == Types.INTEGER) {
135
                        int di = ((Number) obj).intValue();
136
                        value = ValueFactory.createValue(di);
137
                    } else if (typeField == Types.BIGINT) {
138
                        long di = ((Number) obj).longValue();
139
                        value = ValueFactory.createValue(di);
140
                    } else if (typeField == Types.VARCHAR) {
141
                        String s = ((Number) obj).toString();
142
                        value = ValueFactory.createValue(s);
143
                    } else if (typeField == Types.BOOLEAN) {
144
                        if (((Number) obj).intValue()==0){
145
                                value=ValueFactory.createValue(false);
146
                        }else{
147
                                value=ValueFactory.createValue(true);
148
                        }
149
                    }
150
                } else if (obj instanceof Date) {
151
                    if (typeField == Types.DATE) {
152
                        Date date = (Date) obj;
153
                        value = ValueFactory.createValue(date);
154
                    } else if (typeField == Types.VARCHAR) {
155
                        String s = ((Date) obj).toString();
156
                        value = ValueFactory.createValue(s);
157
                    }
158
                } else if (obj instanceof Boolean) {
159
                    if (typeField == Types.BOOLEAN) {
160
                        boolean b = ((Boolean) obj).booleanValue();
161
                        value = ValueFactory.createValue(b);
162
                    } else if (typeField == Types.VARCHAR) {
163
                        String s = ((Boolean) obj).toString();
164
                        value = ValueFactory.createValue(s);
165
                    }
166
                } else if (obj instanceof String) {
167
                    if (typeField == Types.VARCHAR) {
168
                        String s = obj.toString();
169
                        value = ValueFactory.createValue(s);
170
                    }
171
                }else{
172
                        value=ValueFactory.createNullValue();
173
                }
174

    
175
                return value;
176
            }
177
        public FieldDescription getFieldDescriptorSelected() {
178
                return fieldDescriptor;
179
        }
180
        public FieldDescription[] getFieldDescriptors() {
181
                return fieldDescriptors;
182
        }
183
//        public void setFieldValue(Object obj,int i) {
184
//            try {
185
//                        ((DBFDriver)table.getModel().getModelo().getOriginalDriver()).setFieldValue(i,selectedIndex,obj);
186
//                } catch (DriverLoadException e) {
187
//                        e.printStackTrace();
188
//                } catch (IOException e) {
189
//                        e.printStackTrace();
190
//                }
191
//    }
192
        public void saveEdits(int numRows) throws ReadDriverException, InitializeWriterException, StopWriterVisitorException {
193
                
194
                if (this.evalListenerList != null){
195
                        for (Iterator iterator = this.evalListenerList.iterator(); iterator.hasNext();) {
196
                                IEvalListener evalListener = (IEvalListener) iterator.next();
197
                                evalListener.saveEdits(numRows);
198
                        }
199
                }
200
//                if (limit==-1 || numRows == 0 || (numRows % limit)!=0) {
201
//                        return;
202
//                }
203
//                ies.endComplexRow(PluginServices.getText(this, "expression"));
204
//                if ((lv != null) &&
205
//                lv.getSource() instanceof VectorialEditableAdapter) {
206
//                VectorialEditableAdapter vea = (VectorialEditableAdapter) lv.getSource();
207
//                ISpatialWriter spatialWriter = (ISpatialWriter) vea.getDriver();
208
//                vea.cleanSelectableDatasource();
209
//                         lv.setRecordset(vea.getRecordset()); // Queremos que el recordset del layer
210
//                         // refleje los cambios en los campos.
211
//                         ILayerDefinition lyrDef = EditionUtilities.createLayerDefinition(lv);
212
//                         spatialWriter.initialize(lyrDef);
213
//                         vea.saveEdits(spatialWriter,EditionEvent.ALPHANUMERIC);
214
//                         vea.getCommandRecord().clearAll();
215
//         } else {
216
//              if (ies instanceof IWriteable){
217
//                      IWriteable w = (IWriteable) ies;
218
//                         IWriter writer = w.getWriter();
219
//                         if (writer == null){
220
//                         }else{
221
//                                             ITableDefinition tableDef = ies.getTableDefinition();
222
//                                            writer.initialize(tableDef);
223
//
224
//                                            ies.saveEdits(writer,EditionEvent.ALPHANUMERIC);
225
//                                ies.getSelection().clear();
226
//                         }
227
//              }
228
//              ies.getCommandRecord().clearAll();
229
//         }
230
//                ies.startComplexRow();
231
//             table.refresh();
232
    }
233
        
234
        public void addEvalListerner(IEvalListener evalListener){
235
                
236
                if (this.evalListenerList == null){
237
                        this.evalListenerList = new ArrayList<IEvalListener>();
238
                }
239
                this.evalListenerList.add(evalListener);
240
                
241
        }
242
        
243
//        public void fireEvent(int row){
244
//                
245
//        }
246
        
247
        
248
        
249
        
250
        
251
        
252
}