All Downloads are FREE. Search and download functionalities are using the official Maven repository.

panda.cast.castor.StreamCastor Maven / Gradle / Ivy

package panda.cast.castor;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringReader;
import java.lang.reflect.Type;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.SQLException;

import panda.cast.CastContext;
import panda.codec.binary.Base64;
import panda.codec.binary.Base64InputStream;
import panda.io.Streams;
import panda.lang.Charsets;
import panda.lang.Exceptions;
import panda.vfs.FileItem;

/**
 *
 * @param  target type
 */
public abstract class StreamCastor extends AnySingleCastor {
	public StreamCastor(Type toType) {
		super(toType);
	}

	public static class InputStreamCastor extends StreamCastor {
		public InputStreamCastor() {
			super(InputStream.class);
		}
		
		@Override
		protected InputStream castValue(Object value, CastContext context) {
			try {
				if (value instanceof byte[]) {
					return new ByteArrayInputStream((byte[])value);
				}
				if (value instanceof FileItem) {
					FileItem fi = (FileItem)value;
					return fi.isExists() ? fi.open() : null;
				}
				if (value instanceof Blob) {
					return ((Blob)value).getBinaryStream();
				}

				if (value instanceof char[]) {
					InputStream in = Streams.toInputStream(new String((char[])value), context.getEncoding());
					Base64InputStream b64i = new Base64InputStream(in);
					return b64i;
				}
				if (value instanceof CharSequence) {
					InputStream in = Streams.toInputStream((CharSequence)value, Charsets.UTF_8);
					Base64InputStream b64i = new Base64InputStream(in);
					return b64i;
				}
				if (value instanceof Reader) {
					return Streams.toInputStream((Reader)value, context.getEncoding());
				}
				if (value instanceof Clob) {
					return Streams.toInputStream(((Clob)value).getCharacterStream(), context.getEncoding());
				}

				return castError(value, context);
			}
			catch (IOException e) {
				throw Exceptions.wrapThrow(e);
			}
			catch (SQLException e) {
				throw Exceptions.wrapThrow(e);
			}
		}
	}

	public static class ReaderCastor extends StreamCastor {
		public ReaderCastor() {
			super(Reader.class);
		}
		
		@Override
		protected Reader castValue(Object value, CastContext context) {
			try {
				if (value instanceof char[]) {
					return new StringReader(new String((char[])value));
				}
				if (value instanceof CharSequence) {
					return new StringReader(value.toString());
				}
				if (value instanceof Clob) {
					return ((Clob)value).getCharacterStream();
				}

				if (value instanceof FileItem) {
					FileItem fi = (FileItem)value;
					return fi.isExists() ? Streams.toReader(fi.open(), context.getEncoding()) : null;
				}

				if (value instanceof byte[]) {
					String s = Base64.decodeBase64String((byte[])value);
					return new StringReader(s);
				}
				if (value instanceof InputStream) {
					return Streams.toReader((InputStream)value, context.getEncoding());
				}
				if (value instanceof Blob) {
					return Streams.toReader(((Blob)value).getBinaryStream(), context.getEncoding());
				}
				
				return castError(value, context);
			}
			catch (IOException e) {
				throw Exceptions.wrapThrow(e);
			}
			catch (SQLException e) {
				throw Exceptions.wrapThrow(e);
			}
		}
	}
}	




© 2015 - 2024 Weber Informatics LLC | Privacy Policy