📄 record.java
字号:
/* * $Id: Record.java 5462 2005-08-05 18:35:48Z jonesde $ * * Copyright (c) 2001-2003 The Open For Business Project - www.ofbiz.org * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */package org.ofbiz.datafile;import java.io.Serializable;import java.text.NumberFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.StringTokenizer;import java.util.NoSuchElementException;/** * Record * * @author <a href="mailto:jonesde@ofbiz.org">David E. Jones</a> * @version $Rev: 5462 $ * @since 2.0 */public class Record implements Serializable { /** Contains a map with field data by name */ protected Map fields; /** Contains the name of the record definition */ protected String recordName; /** Contains the definition for the record */ protected transient ModelRecord modelRecord; protected Record parentRecord = null; protected List childRecords = new ArrayList(); /** Creates new Record */ protected Record(ModelRecord modelRecord) { if (modelRecord == null) throw new IllegalArgumentException("Cannont create a Record with a null modelRecord parameter"); this.recordName = modelRecord.name; this.modelRecord = modelRecord; this.fields = new HashMap(); } /** Creates new Record from existing Map */ protected Record(ModelRecord modelRecord, Map fields) { if (modelRecord == null) throw new IllegalArgumentException("Cannont create a Record with a null modelRecord parameter"); this.recordName = modelRecord.name; this.modelRecord = modelRecord; this.fields = (fields == null ? new HashMap() : new HashMap(fields)); } public String getRecordName() { return recordName; } public ModelRecord getModelRecord() { if (modelRecord == null) { throw new IllegalStateException("[Record.getModelRecord] could not find modelRecord for recordName " + recordName); } return modelRecord; } public Object get(String name) { if (getModelRecord().getModelField(name) == null) { throw new IllegalArgumentException("[Record.get] \"" + name + "\" is not a field of " + recordName); // Debug.logWarning("[GenericRecord.get] \"" + name + "\" is not a field of " + recordName + ", but getting anyway...", module); } return fields.get(name); } public String getString(String name) { Object object = get(name); if (object == null) return null; if (object instanceof java.lang.String) return (String) object; else return object.toString(); } public java.sql.Timestamp getTimestamp(String name) { return (java.sql.Timestamp) get(name); } public java.sql.Time getTime(String name) { return (java.sql.Time) get(name); } public java.sql.Date getDate(String name) { return (java.sql.Date) get(name); } public Integer getInteger(String name) { return (Integer) get(name); } public Long getLong(String name) { return (Long) get(name); } public Float getFloat(String name) { return (Float) get(name); } public Double getDouble(String name) { return (Double) get(name); } /** Sets the named field to the passed value, even if the value is null * @param name The field name to set * @param value The value to set */ public void set(String name, Object value) { set(name, value, true); } /** Sets the named field to the passed value. If value is null, it is only * set if the setIfNull parameter is true. * @param name The field name to set * @param value The value to set * @param setIfNull Specifies whether or not to set the value if it is null */ public synchronized void set(String name, Object value, boolean setIfNull) { if (getModelRecord().getModelField(name) == null) { throw new IllegalArgumentException("[Record.set] \"" + name + "\" is not a field of " + recordName); // Debug.logWarning("[GenericRecord.set] \"" + name + "\" is not a field of " + recordName + ", but setting anyway...", module); } if (value != null || setIfNull) { if (value instanceof Boolean) { value = ((Boolean) value).booleanValue() ? "Y" : "N"; } fields.put(name, value); } } /** * little endian reader for 2 byte short. */ public final short readLEShort(byte[] byteArray) { return (short)( (byteArray[1]&0xff) << 8 | (byteArray[0]&0xff)); } /** * little endian reader for 4 byte int. */ public final int readLEInt(byte []byteArray) { return (byteArray[3]) << 24 | (byteArray[2]&0xff) << 16 | (byteArray[1]&0xff) << 8 | (byteArray[0]&0xff); } /** * little endian reader for 8 byte long. */ public final long readLELong(byte []byteArray) { return (long)(byteArray[7]) << 56 | /* long cast needed or shift done modulo 32 */ (long)(byteArray[6]&0xff) << 48 | (long)(byteArray[5]&0xff) << 40 | (long)(byteArray[4]&0xff) << 32 | (long)(byteArray[3]&0xff) << 24 | (long)(byteArray[2]&0xff) << 16 | (long)(byteArray[1]&0xff) << 8 | (long)(byteArray[0]&0xff); } /** Sets the named field to the passed value, converting the value from a String to the corrent type using <code>Type.valueOf()</code> * @param name The field name to set * @param value The String value to convert and set */ public void setString(String name, String value) throws ParseException { if (name == null || value == null || value.equals("")) return; ModelField field = getModelRecord().getModelField(name); if (field == null) set(name, value); // this will get an error in the set() method... // if the string is all spaces ignore boolean nonSpace = false; for (int i = 0; i < value.length(); i++) { if (value.charAt(i) != ' ') { nonSpace = true; break; } } if (!nonSpace) return; // if (Debug.verboseOn()) Debug.logVerbose("Value: " + value, module); String fieldType = field.type; // first the custom types that need to be parsed if (fieldType.equals("CustomTimestamp")) { // this custom type will take a string a parse according to date formatting // string then put the result in a java.sql.Timestamp // a common timestamp format for flat files is with no separators: yyyyMMddHHmmss SimpleDateFormat sdf = new SimpleDateFormat(field.format); java.util.Date tempDate = sdf.parse(value); java.sql.Timestamp timestamp = new java.sql.Timestamp(tempDate.getTime()); set(name, timestamp); } else if (fieldType.equals("CustomDate")) { // a common date only format for flat files is with no separators: yyyyMMdd or MMddyyyy SimpleDateFormat sdf = new SimpleDateFormat(field.format); java.util.Date tempDate = sdf.parse(value); java.sql.Date date = new java.sql.Date(tempDate.getTime()); set(name, date); } else if (fieldType.equals("CustomTime")) { // a common time only format for flat files is with no separators: HHmmss SimpleDateFormat sdf = new SimpleDateFormat(field.format); java.util.Date tempDate = sdf.parse(value); java.sql.Time time = new java.sql.Time(tempDate.getTime()); set(name, time); } else if (fieldType.equals("FixedPointDouble")) { // this custom type will parse a fixed point number according to the number // of decimal places in the formatting string then place it in a Double NumberFormat nf = NumberFormat.getNumberInstance(); Number tempNum = nf.parse(value); double number = tempNum.doubleValue(); double decimalPlaces = Double.parseDouble(field.format); double divisor = Math.pow(10.0, decimalPlaces); number = number / divisor; set(name, new Double(number)); } // standard types else if (fieldType.equals("java.lang.String") || fieldType.equals("String")) set(name, value); else if (fieldType.equals("NullTerminatedString")) { int terminate = value.indexOf(0x0); set(name, terminate>0?value.substring(0,terminate):value); } else if (fieldType.equals("java.sql.Timestamp") || fieldType.equals("Timestamp")) set(name, java.sql.Timestamp.valueOf(value)); else if (fieldType.equals("java.sql.Time") || fieldType.equals("Time")) set(name, java.sql.Time.valueOf(value)); else if (fieldType.equals("java.sql.Date") || fieldType.equals("Date")) set(name, java.sql.Date.valueOf(value)); else if (fieldType.equals("java.lang.Integer") || fieldType.equals("Integer")) set(name, Integer.valueOf(value)); else if (fieldType.equals("java.lang.Long") || fieldType.equals("Long")) set(name, Long.valueOf(value)); else if (fieldType.equals("java.lang.Float") || fieldType.equals("Float")) set(name, Float.valueOf(value)); else if (fieldType.equals("java.lang.Double") || fieldType.equals("Double")) set(name, Double.valueOf(value)); else if (fieldType.equals("LEShort")) set(name, new Short(readLEShort(value.getBytes())));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -