/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.translator.simpledb.api;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Array;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.SQLXML;
import java.util.List;
import org.teiid.core.TeiidException;
import org.teiid.core.types.*;
import org.teiid.core.util.ObjectConverterUtil;
import org.teiid.translator.TranslatorException;
public class SimpleDBDataTypeManager {
public static Object convertToSimpleDBType (Object value, Class<?> type) throws TranslatorException {
if (value == null) {
return null;
}
if (type.isArray()) {
int length = Array.getLength(value);
String[] arrayValue = new String[length];
for (int i = 0; i < length; i++) {
arrayValue[i] = convertToSimpleDBType(Array.get(value, i));
}
return arrayValue;
}
return convertToSimpleDBType(value);
}
private static String convertToSimpleDBType(Object value) throws TranslatorException {
try {
if (value instanceof Blob) {
return new String(ObjectConverterUtil.convertToByteArray(value), "UTF-8"); //$NON-NLS-1$
}
return ((String)DataTypeManager.transformValue(value, String.class));
} catch (TransformationException e) {
throw new TranslatorException(e);
} catch (TeiidException e) {
throw new TranslatorException(e);
} catch (IOException e) {
throw new TranslatorException(e);
}
}
public static Object convertFromSimpleDBType(final List<String> origialValue, final Class<?> expectedType) throws TranslatorException {
if (origialValue == null) {
return null;
}
if (expectedType.isArray()) {
if (expectedType.getComponentType().isAssignableFrom(String.class)) {
return origialValue.toArray(new String[origialValue.size()]);
}
Object array = Array.newInstance(expectedType, origialValue.size());
for (int i = 0; i < origialValue.size(); i++) {
Object arrayItem = convertFromSimpleDBType(origialValue.get(i), expectedType.getComponentType());
Array.set(array, i, arrayItem);
}
return array;
}
final String value = origialValue.get(0);
return convertFromSimpleDBType(value, expectedType);
}
private static Object convertFromSimpleDBType(final String value, final Class<?> expectedType) throws TranslatorException {
if (expectedType.isAssignableFrom(String.class)) {
return value;
}
if (expectedType.isAssignableFrom(Blob.class)) {
return new BlobType(new BlobImpl(new InputStreamFactory() {
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(value.getBytes());
}
}));
} else if (expectedType.isAssignableFrom(Clob.class)) {
return new ClobType(new ClobImpl(value));
} else if (expectedType.isAssignableFrom(SQLXML.class)) {
return new XMLType(new SQLXMLImpl(value.getBytes()));
} else if (DataTypeManager.isTransformable(String.class, expectedType)) {
try {
return DataTypeManager.transformValue(value, expectedType);
} catch (TransformationException e) {
throw new TranslatorException(e);
}
} else {
throw new TranslatorException("Failed to convert "+ value +" to target type of "+ expectedType);//$NON-NLS-1$ //$NON-NLS-2$
}
}
}