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

com.marklogic.client.impl.HandleAccessor Maven / Gradle / Ivy

/*
 * Copyright 2012-2015 MarkLogic Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * 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 com.marklogic.client.impl;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;

import com.marklogic.client.MarkLogicIOException;
import com.marklogic.client.io.BaseHandle;
import com.marklogic.client.io.OutputStreamSender;
import com.marklogic.client.io.marker.AbstractReadHandle;
import com.marklogic.client.io.marker.AbstractWriteHandle;

/**
 * HandleAccessor is used internally.  Applications will not ordinarily need to use it.
 *
 */
@SuppressWarnings({"rawtypes", "unchecked"})
public class HandleAccessor {
	static public HandleImplementation checkHandle(Object object, String type) {
		if (!isHandle(object))
			throw new IllegalArgumentException(
					type+" handle does not extend BaseHandle: "+object.getClass().getName()
					);
		return ((HandleImplementation) object);
	}
	static public boolean isHandle(Object object) {
		return object == null || object instanceof BaseHandle;
	}

	static public  Class receiveAs(R handle) {
		if (handle == null)
			return null;
		return ((HandleImplementation) handle).receiveAs();
	}
	static public  void receiveContent(R handle, Object content) {
		if (handle == null) return;
		HandleImplementation handleImpl = (HandleImplementation) handle;
		if ( content == null ) {
			handleImpl.receiveContent(content);
		} else if ( handleImpl.receiveAs() != null &&
			handleImpl.receiveAs().isAssignableFrom(content.getClass()) )
		{
			handleImpl.receiveContent(content);
		} else if ( content instanceof String ) {
			if ( InputStream.class.isAssignableFrom(handleImpl.receiveAs()) ) {
				handleImpl.receiveContent( new ByteArrayInputStream(getBytes((String) content)) );
			} else if ( Reader.class.isAssignableFrom(handleImpl.receiveAs()) ) {
				handleImpl.receiveContent( new StringReader((String) content) );
			} else if ( byte[].class.isAssignableFrom(handleImpl.receiveAs()) ) {
				handleImpl.receiveContent( getBytes((String) content) );
			} else if ( String.class.isAssignableFrom(handleImpl.receiveAs()) ) {
				handleImpl.receiveContent( content );
			}
		} else {
			handleImpl.receiveContent(content);
		}
	}
	static private byte[] getBytes(String content) {
		if ( content == null ) return null;
		try {
			return content.getBytes("UTF-8");
		} catch (UnsupportedEncodingException e) {
			return content.getBytes();
		}
	}
	static public  Object sendContent(W handle) {
		if (handle == null)
			return null;
		return ((HandleImplementation) handle).sendContent();
	}
	static public  boolean isResendable(W handle) {
		if (handle == null)
			return false;
		return ((HandleImplementation) handle).isResendable();
	}
	static public HandleImplementation as(Object handle) {
		return ((HandleImplementation) handle);
	}
    static public String contentAsString(AbstractWriteHandle handle) {
    	try {
        Object content = sendContent(handle);
        if ( content == null ) return null;
        String stringContent = null;
		if (content instanceof String) {
            stringContent = (String) content;
		} else if (content instanceof OutputStreamSender) {
            ByteArrayOutputStream bytesStream = new ByteArrayOutputStream();
            ((OutputStreamSender) content).write(bytesStream);
            stringContent = bytesStream.toString("UTF-8");
		} else if ( content instanceof byte[] ) {
            stringContent = new String((byte[]) content, "UTF-8"); 
		} else if ( content instanceof File ) {
            content = new FileInputStream((File) content);
		}
        if ( content instanceof InputStream ) {
            StringBuffer sb = new StringBuffer();
            Reader reader = new InputStreamReader((InputStream) content, "UTF-8");
            char[] cbuf = new char[8000];
            int charsRead = -1;
            while ( (charsRead = reader.read(cbuf)) != -1 ) {
                sb.append(cbuf, 0, charsRead);
            }
            stringContent = sb.toString();
		}
		if ( content instanceof File ) {
			((FileInputStream) content).close();
		}
        if ( stringContent == null ) {
        	throw new UnsupportedOperationException("contentAsString only supports handles with sendContent() " +
        		"of type String, OutputStreamSender, byte[], File, or InputStream");
        }
        return stringContent;
    	} catch (Exception e) {
    		throw new MarkLogicIOException(e);
    	}
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy