/** * Licensed to JumpMind Inc under one or more contributor * license agreements. See the NOTICE file distributed * with this work for additional information regarding * copyright ownership. JumpMind Inc licenses this file * to you under the GNU General Public License, version 3.0 (GPLv3) * (the "License"); you may not use this file except in compliance * with the License. * * You should have received a copy of the GNU General Public License, * version 3.0 (GPLv3) along with this library; if not, see * <http://www.gnu.org/licenses/>. * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.jumpmind.db.sql; import java.io.IOException; import java.math.BigDecimal; import java.sql.Blob; import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; import java.util.Collection; import java.util.Date; import org.apache.commons.io.IOUtils; import org.jumpmind.exception.IoException; import org.jumpmind.exception.ParseException; import org.jumpmind.util.FormatUtils; import org.jumpmind.util.LinkedCaseInsensitiveMap; public class Row extends LinkedCaseInsensitiveMap<Object> { private static final long serialVersionUID = 1L; public Row(int numberOfColumns) { super(numberOfColumns); } public Row(String columnName, Object value) { super(1); put(columnName, value); } public byte[] bytesValue() { Object obj = this.values().iterator().next(); return toBytes(obj); } protected byte[] toBytes(Object obj) { if (obj != null) { if (obj instanceof byte[]) { return (byte[]) obj; } else if (obj instanceof Blob) { Blob blob = (Blob) obj; try { return IOUtils.toByteArray(blob.getBinaryStream()); } catch (IOException e) { throw new IoException(e); } catch (SQLException e) { throw new SqlException(e); } } else if (obj instanceof String) { return obj.toString().getBytes(); } else { throw new IllegalStateException(String.format( "Cannot translate a %s into a byte[]", obj.getClass().getName())); } } else { return null; } } public Number numberValue() { Object obj = this.values().iterator().next(); if (obj != null) { if (obj instanceof Number) { return (Number) obj; } else { return new BigDecimal(obj.toString()); } } else { return null; } } public Date dateValue() { Object obj = this.values().iterator().next(); if (obj != null) { if (obj instanceof Date) { return (Date) obj; } else { return Timestamp.valueOf(obj.toString()); } } else { return null; } } public String stringValue() { Object obj = this.values().iterator().next(); if (obj != null) { return obj.toString(); } else { return null; } } public String csvValue() { StringBuilder concatenatedRow = new StringBuilder(); Collection<Object> objs = this.values(); int index = 0; for (Object obj : objs) { if (index > 0) { concatenatedRow.append(","); } concatenatedRow.append(obj != null ? obj.toString() : ""); index++; } return concatenatedRow.toString(); } public byte[] getBytes(String columnName) { Object obj = get(columnName); return toBytes(obj); } public String getString(String columnName) { return getString(columnName, true); } public String getString(String columnName, boolean checkForColumn) { Object obj = this.get(columnName); if (obj != null) { return obj.toString(); } else { if (checkForColumn) { checkForColumn(columnName); } return null; } } public int getInt(String columnName) { Object obj = this.get(columnName); if (obj instanceof Number) { return ((Number) obj).intValue(); } else if (obj instanceof String) { return Integer.parseInt(obj.toString()); } else { checkForColumn(columnName); return 0; } } public long getLong(String columnName) { Object obj = this.get(columnName); if (obj instanceof Number) { return ((Number) obj).longValue(); } else if (obj instanceof String) { return Long.parseLong(obj.toString()); } else { checkForColumn(columnName); return 0; } } public boolean getBoolean(String columnName) { Object obj = this.get(columnName); if ("1".equals(obj)) { return true; } else if (obj instanceof Number) { int value = ((Number) obj).intValue(); return value > 0 ? true : false; } else if (obj instanceof Boolean) { return (Boolean) obj; } else if (obj instanceof String) { return Boolean.parseBoolean((String) obj); } else { checkForColumn(columnName); return false; } } public Time getTime(String columnName) { Object obj = this.get(columnName); if (obj instanceof Time) { return (Time) obj; } else { Date date = getDateTime(columnName); return new Time(date.getTime()); } } public Date getDateTime(String columnName) { Object obj = this.get(columnName); if (obj instanceof Number) { long value = ((Number) obj).longValue(); return new Date(value); } else if (obj instanceof Date) { return (Date) obj; } else if (obj instanceof String) { try { return getDate((String) obj, FormatUtils.TIMESTAMP_PATTERNS); } catch (ParseException ex) { // on xerial sqlite jdbc dates come back as longs return new Date(Long.parseLong((String) obj)); } } else { checkForColumn(columnName); return null; } } protected void checkForColumn(String columnName) { if (!containsKey(columnName)) { throw new ColumnNotFoundException(columnName); } } final private java.util.Date getDate(String value, String[] pattern) { return FormatUtils.parseDate(value, pattern); } public Object[] toArray(String[] keys) { Object[] values = new Object[keys.length]; for (int i = 0; i < keys.length; i++) { values[i] = get(keys[i]); } return values; } }