blob: 99f22257d4e5e2760df35d8af8958243bce2e51d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 Composent, Inc. and others. All rights reserved. This
* program and the accompanying materials are made available under the terms of
* the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Composent, Inc. - initial API and implementation
******************************************************************************/
package org.eclipse.ecf.remoteservice.rest.client;
import java.io.*;
import java.util.Map;
import org.apache.commons.httpclient.methods.*;
import org.eclipse.ecf.remoteservice.IRemoteCall;
import org.eclipse.ecf.remoteservice.client.IRemoteCallParameter;
import org.eclipse.ecf.remoteservice.client.IRemoteCallable;
public abstract class AbstractEntityRequestType extends AbstractRequestType {
public static final int NO_REQUEST_ENTITY = -1;
public static final int INPUT_STREAM_REQUEST_ENTITY = 0;
public static final int STRING_REQUEST_ENTITY = 1;
public static final int BYTEARRAY_REQUEST_ENTITY = 2;
public static final int FILE_REQUEST_ENTITY = 3;
public static final String CHARSET_PARAM_NAME = "charset"; //$NON-NLS-1$
public static final String CONTENT_TYPE_PARAM_NAME = "contentType"; //$NON-NLS-1$
public static final String CONTENT_LENGTH_PARAM_NAME = "contentLength"; //$NON-NLS-1$
protected int requestEntityType = NO_REQUEST_ENTITY;
protected long defaultContentLength = InputStreamRequestEntity.CONTENT_LENGTH_AUTO;
protected String defaultContentType = null;
protected String defaultCharset = null;
public AbstractEntityRequestType(int requestEntityType, String defaultContentType, long defaultContentLength, String defaultCharset, Map defaultRequestHeaders) {
super(defaultRequestHeaders);
this.requestEntityType = requestEntityType;
this.defaultContentType = defaultContentType;
this.defaultContentLength = defaultContentLength;
this.defaultCharset = defaultCharset;
}
public AbstractEntityRequestType(int requestEntityType, String defaultContentType, long defaultContentLength, String defaultCharset) {
this(requestEntityType, defaultContentType, defaultContentLength, defaultCharset, null);
}
public AbstractEntityRequestType(int requestEntityType, String defaultContentType, long defaultContentLength, Map defaultRequestHeaders) {
this(requestEntityType, defaultContentType, defaultContentLength, null, defaultRequestHeaders);
}
public AbstractEntityRequestType(int requestEntityType, String defaultContentType, long defaultContentLength) {
this(requestEntityType, defaultContentType, defaultContentLength, (String) null);
}
public AbstractEntityRequestType(int requestEntityType, String defaultContentType, Map defaultRequestHeaders) {
this(requestEntityType, defaultContentType, InputStreamRequestEntity.CONTENT_LENGTH_AUTO, null, defaultRequestHeaders);
}
public AbstractEntityRequestType(int requestEntityType, String defaultContentType) {
this(requestEntityType, defaultContentType, null);
}
public AbstractEntityRequestType(int requestEntityType, Map defaultRequestHeaders) {
this(requestEntityType, null, defaultRequestHeaders);
}
public AbstractEntityRequestType(Map defaultRequestHeaders) {
this(NO_REQUEST_ENTITY, defaultRequestHeaders);
}
public AbstractEntityRequestType() {
this(null);
}
public boolean useRequestEntity() {
return requestEntityType > -1;
}
public RequestEntity generateRequestEntity(String uri, IRemoteCall call, IRemoteCallable callable, IRemoteCallParameter paramDefault, Object paramToSerialize) throws NotSerializableException {
if (paramToSerialize instanceof RequestEntity)
return (RequestEntity) paramToSerialize;
switch (requestEntityType) {
case INPUT_STREAM_REQUEST_ENTITY :
if (paramToSerialize instanceof InputStream) {
return new InputStreamRequestEntity((InputStream) paramToSerialize, getContentLength(call, callable, paramDefault), getContentType(call, callable, paramDefault));
}
throw new NotSerializableException("Cannot generate request entity. Expecting InputStream and got class=" + paramToSerialize.getClass().getName()); //$NON-NLS-1$
case STRING_REQUEST_ENTITY :
if (paramToSerialize instanceof String) {
try {
return new StringRequestEntity((String) paramToSerialize, getContentType(call, callable, paramDefault), getCharset(call, callable, paramDefault));
} catch (UnsupportedEncodingException e) {
throw new NotSerializableException("Could not create request entity from call parameters: " + e.getMessage()); //$NON-NLS-1$
}
}
throw new NotSerializableException("Cannot generate request entity. Expecting String and got class=" + paramToSerialize.getClass().getName()); //$NON-NLS-1$
case BYTEARRAY_REQUEST_ENTITY :
if (paramToSerialize instanceof byte[]) {
return new ByteArrayRequestEntity((byte[]) paramToSerialize, getContentType(call, callable, paramDefault));
}
throw new NotSerializableException("Cannot generate request entity. Expecting byte[] and got class=" + paramToSerialize.getClass().getName()); //$NON-NLS-1$
case FILE_REQUEST_ENTITY :
if (paramToSerialize instanceof File) {
return new FileRequestEntity((File) paramToSerialize, getContentType(call, callable, paramDefault));
}
throw new NotSerializableException("Remote call parameter with name=" + paramDefault.getName() + " is incorrect type for creating request entity."); //$NON-NLS-1$ //$NON-NLS-2$
default :
throw new NotSerializableException("Request entity generation not supported for this request type"); //$NON-NLS-1$
}
}
protected String getCharset(IRemoteCall call, IRemoteCallable callable, IRemoteCallParameter paramDefault) {
IRemoteCallParameter[] defaultParameters = callable.getDefaultParameters();
Object[] parameters = call.getParameters();
if (defaultParameters != null) {
for (int i = 0; i < defaultParameters.length; i++) {
if (CHARSET_PARAM_NAME.equals(defaultParameters[i].getName())) {
Object o = (parameters != null && parameters.length > i) ? parameters[i] : defaultParameters[i];
if (o instanceof String) {
return (String) o;
}
}
}
}
return defaultCharset;
}
protected long getContentLength(IRemoteCall call, IRemoteCallable callable, IRemoteCallParameter paramDefault) {
IRemoteCallParameter[] defaultParameters = callable.getDefaultParameters();
Object[] parameters = call.getParameters();
if (defaultParameters != null) {
for (int i = 0; i < defaultParameters.length; i++) {
if (CONTENT_LENGTH_PARAM_NAME.equals(defaultParameters[i].getName())) {
Object o = (parameters != null && parameters.length > i) ? parameters[i] : defaultParameters[i];
if (o instanceof Number) {
return ((Number) o).longValue();
} else if (o instanceof String) {
try {
return Integer.parseInt((String) o);
} catch (NumberFormatException e) {
return InputStreamRequestEntity.CONTENT_LENGTH_AUTO;
}
}
}
}
}
return defaultContentLength;
}
protected String getContentType(IRemoteCall call, IRemoteCallable callable, IRemoteCallParameter paramDefault) {
IRemoteCallParameter[] defaultParameters = callable.getDefaultParameters();
Object[] parameters = call.getParameters();
if (defaultParameters != null) {
for (int i = 0; i < defaultParameters.length; i++) {
if (CONTENT_TYPE_PARAM_NAME.equals(defaultParameters[i].getName())) {
Object o = (parameters != null && parameters.length > i) ? parameters[i] : defaultParameters[i];
if (o instanceof String) {
return (String) o;
}
}
}
}
return defaultContentType;
}
}