Revision 46904 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/utils/DbaseFileWriter.java
DbaseFileWriter.java | ||
---|---|---|
43 | 43 |
import org.gvsig.fmap.dal.feature.Feature; |
44 | 44 |
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor; |
45 | 45 |
import org.gvsig.fmap.dal.feature.FeatureType; |
46 |
import org.gvsig.tools.logger.FilteredLogger; |
|
47 |
import org.slf4j.Logger; |
|
48 |
import org.slf4j.LoggerFactory; |
|
46 | 49 |
|
47 | 50 |
/** |
48 | 51 |
* A DbaseFileReader is used to read a dbase III format file. The general use of |
... | ... | |
60 | 63 |
* @author Ian Schneider |
61 | 64 |
*/ |
62 | 65 |
public class DbaseFileWriter { |
66 |
|
|
67 |
private static final Logger LOGGER = LoggerFactory.getLogger(DbaseFileWriter.class); |
|
63 | 68 |
|
64 | 69 |
private final DbaseFileHeader header; |
65 | 70 |
private FieldFormatter formatter = new FieldFormatter(); |
... | ... | |
70 | 75 |
private int blankSize; |
71 | 76 |
|
72 | 77 |
private Charset charset; |
78 |
|
|
79 |
private FilteredLogger logger; |
|
73 | 80 |
|
74 | 81 |
/** |
75 | 82 |
* Create a DbaseFileWriter using the specified header and writing to the |
... | ... | |
236 | 243 |
// if( buffer.position()!=descriptor.getOffsetInRecord() ) { |
237 | 244 |
// throw new RuntimeException("Encoding field '"+descriptor.getName()+"' found an incorrect offset."); |
238 | 245 |
// } |
246 |
String fieldName = attr.getName(); |
|
239 | 247 |
if (feature.isNull(attr.getIndex())) { |
240 |
safeEncode(" ", fieldLen, false); |
|
248 |
safeEncode(fieldName, " ", fieldLen, false);
|
|
241 | 249 |
return; |
242 | 250 |
} |
243 | 251 |
if (DataTypes.BOOLEAN == type) { |
244 | 252 |
boolean b = feature.getBoolean(attr.getIndex()); |
245 |
safeEncode(b ? "T" : "F", 1, true); |
|
253 |
safeEncode(fieldName, b ? "T" : "F", 1, true);
|
|
246 | 254 |
|
247 | 255 |
} else if (DataTypes.TIME == type) { |
248 | 256 |
Date date = feature.getTime(attr.getIndex()); |
249 | 257 |
fieldString = formatter.formatTime(date); |
250 |
safeEncode(fieldString, fieldLen, false); |
|
258 |
safeEncode(fieldName, fieldString, fieldLen, false);
|
|
251 | 259 |
|
252 | 260 |
} else if (DataTypes.TIMESTAMP == type) { |
253 | 261 |
Date date = feature.getTimestamp(attr.getIndex()); |
254 | 262 |
fieldString = formatter.formatTimestamp(date); |
255 |
safeEncode(fieldString, fieldLen, false); |
|
263 |
safeEncode(fieldName, fieldString, fieldLen, false);
|
|
256 | 264 |
|
257 | 265 |
} else if (DataTypes.DATE == type) { |
258 | 266 |
Date date = feature.getDate(attr.getIndex()); |
259 | 267 |
fieldString = formatter.formatDate(date); |
260 |
safeEncode(fieldString, fieldLen, false); |
|
268 |
safeEncode(fieldName, fieldString, fieldLen, false);
|
|
261 | 269 |
|
262 | 270 |
} else if (DataTypes.DECIMAL == type) { |
263 | 271 |
BigDecimal n = feature.getDecimal(attr.getIndex()); |
264 | 272 |
fieldString = formatter.format(n, fieldLen); |
265 |
safeEncode(fieldString, fieldLen, false); |
|
273 |
safeEncode(fieldName, fieldString, fieldLen, false);
|
|
266 | 274 |
|
267 | 275 |
} else if (DataTypes.DOUBLE == type) { |
268 | 276 |
double n = feature.getDouble(attr.getIndex()); |
269 | 277 |
fieldString = formatter.format(n, fieldLen, descriptor.getScale()); |
270 |
safeEncode(fieldString, fieldLen, false); |
|
278 |
safeEncode(fieldName, fieldString, fieldLen, false);
|
|
271 | 279 |
|
272 | 280 |
} else if (DataTypes.FLOAT == type) { |
273 | 281 |
float n = feature.getFloat(attr.getIndex()); |
274 | 282 |
fieldString = formatter.format(n, fieldLen, descriptor.getScale()); |
275 |
safeEncode(fieldString, fieldLen, false); |
|
283 |
safeEncode(fieldName, fieldString, fieldLen, false);
|
|
276 | 284 |
|
277 | 285 |
} else if (DataTypes.LONG == type) { |
278 | 286 |
long l = feature.getLong(attr.getIndex()); |
279 | 287 |
fieldString = formatter.format(l, fieldLen); |
280 |
safeEncode(fieldString, fieldLen, false); |
|
288 |
safeEncode(fieldName, fieldString, fieldLen, false);
|
|
281 | 289 |
|
282 | 290 |
} else if (DataTypes.INT == type) { |
283 | 291 |
int n = feature.getInt(attr.getIndex()); |
284 | 292 |
fieldString = formatter.format(n, fieldLen); |
285 |
safeEncode(fieldString, fieldLen, false); |
|
293 |
safeEncode(fieldName, fieldString, fieldLen, false);
|
|
286 | 294 |
|
287 | 295 |
} else if (DataTypes.BYTE == type) { |
288 | 296 |
int n = feature.getInt(attr.getIndex()); |
289 | 297 |
fieldString = formatter.format(n, fieldLen); |
290 |
safeEncode(fieldString, fieldLen, false); |
|
298 |
safeEncode(fieldName, fieldString, fieldLen, false);
|
|
291 | 299 |
|
292 | 300 |
} else if (DataTypes.STRING == type) { |
293 | 301 |
String s = feature.getString(attr.getIndex()); |
294 |
safeEncode(StringUtils.defaultIfEmpty(s, ""), fieldLen, true); |
|
302 |
safeEncode(fieldName, StringUtils.defaultIfEmpty(s, ""), fieldLen, true);
|
|
295 | 303 |
|
296 | 304 |
} else { |
297 | 305 |
// Si no conocemos el tipo intentamos guardarlo como un string |
298 | 306 |
String s = feature.getString(attr.getIndex()); |
299 |
safeEncode(StringUtils.defaultIfEmpty(s, ""), fieldLen, true); |
|
307 |
safeEncode(fieldName, StringUtils.defaultIfEmpty(s, ""), fieldLen, true);
|
|
300 | 308 |
|
301 | 309 |
} |
302 | 310 |
} catch (Exception ex) { |
... | ... | |
314 | 322 |
* |
315 | 323 |
* @throws UnsupportedEncodingException |
316 | 324 |
*/ |
317 |
private void safeEncode(String in, int limit, boolean rightPadding) throws UnsupportedEncodingException { |
|
325 |
private void safeEncode(String fieldName, String in, int limit, boolean rightPadding) throws UnsupportedEncodingException {
|
|
318 | 326 |
try { |
319 | 327 |
byte[] encodedString = in.getBytes(this.charset); |
320 | 328 |
if (encodedString.length > limit) { |
329 |
this.getLogger().error("'"+fieldName+"' field size ["+encodedString.length+"] exceeds limit "+limit); |
|
321 | 330 |
// too long, truncating |
322 | 331 |
/* |
323 | 332 |
* The block code bellow is equivalent to this simple code |
... | ... | |
487 | 496 |
blank = charset.encode(" "); |
488 | 497 |
blankSize = blank.limit(); |
489 | 498 |
} |
499 |
|
|
500 |
protected FilteredLogger getLogger() { |
|
501 |
if(this.logger == null){ |
|
502 |
this.logger = new FilteredLogger(LOGGER, "DbaseFileWriter", 2000L); |
|
503 |
} |
|
504 |
return this.logger; |
|
505 |
} |
|
490 | 506 |
|
491 | 507 |
} |
Also available in: Unified diff