facebook4j.internal.http.HttpParameter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of facebook4j-core Show documentation
Show all versions of facebook4j-core Show documentation
A Java library for the Facebook Graph API
/*
* Copyright 2007 Yusuke Yamamoto
*
* 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 facebook4j.internal.http;
import java.io.File;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
/**
* A data class representing HTTP Post parameter
*
* @author Yusuke Yamamoto - yusuke at mac.com
* @author Ryuji Yamashita - roundrop at gmail.com
*
* - Added {@link HttpParameter#merge(HttpParameter[], HttpParameter[])} method
* - Added {@link HttpParameter#merge(HttpParameter[], HttpParameter)} method
*
*/
public final class HttpParameter implements Comparable, java.io.Serializable {
private String name = null;
private String value = null;
private File file = null;
private InputStream fileBody = null;
private static final long serialVersionUID = -8708108746980739212L;
public HttpParameter(String name, String value) {
this.name = name;
this.value = value;
}
public HttpParameter(String name, File file) {
this.name = name;
this.file = file;
}
public HttpParameter(String name, String fileName, InputStream fileBody) {
this.name = name;
this.file = new File(fileName);
this.fileBody = fileBody;
}
public HttpParameter(String name, int value) {
this.name = name;
this.value = String.valueOf(value);
}
public HttpParameter(String name, long value) {
this.name = name;
this.value = String.valueOf(value);
}
public HttpParameter(String name, double value) {
this.name = name;
this.value = String.valueOf(value);
}
public HttpParameter(String name, boolean value) {
this.name = name;
this.value = String.valueOf(value);
}
public String getName() {
return name;
}
public String getValue() {
return value;
}
public File getFile() {
return file;
}
public InputStream getFileBody() {
return fileBody;
}
public boolean isFile() {
return file != null;
}
public boolean hasFileBody() {
return fileBody != null;
}
private static final String JPEG = "image/jpeg";
private static final String GIF = "image/gif";
private static final String PNG = "image/png";
private static final String OCTET = "application/octet-stream";
/**
* @return content-type
*/
public String getContentType() {
if (!isFile()) {
throw new IllegalStateException("not a file");
}
String contentType;
String extensions = file.getName();
int index = extensions.lastIndexOf(".");
if (-1 == index) {
// no extension
contentType = OCTET;
} else {
extensions = extensions.substring(extensions.lastIndexOf(".") + 1).toLowerCase();
if (extensions.length() == 3) {
if ("gif".equals(extensions)) {
contentType = GIF;
} else if ("png".equals(extensions)) {
contentType = PNG;
} else if ("jpg".equals(extensions)) {
contentType = JPEG;
} else {
contentType = OCTET;
}
} else if (extensions.length() == 4) {
if ("jpeg".equals(extensions)) {
contentType = JPEG;
} else {
contentType = OCTET;
}
} else {
contentType = OCTET;
}
}
return contentType;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof HttpParameter)) return false;
HttpParameter that = (HttpParameter) o;
if (file != null ? !file.equals(that.file) : that.file != null)
return false;
if (fileBody != null ? !fileBody.equals(that.fileBody) : that.fileBody != null)
return false;
if (!name.equals(that.name)) return false;
if (value != null ? !value.equals(that.value) : that.value != null)
return false;
return true;
}
public static boolean containsFile(HttpParameter[] params) {
boolean containsFile = false;
if (null == params) {
return false;
}
for (HttpParameter param : params) {
if (param.isFile()) {
containsFile = true;
break;
}
}
return containsFile;
}
/*package*/
static boolean containsFile(List params) {
boolean containsFile = false;
for (HttpParameter param : params) {
if (param.isFile()) {
containsFile = true;
break;
}
}
return containsFile;
}
public static HttpParameter[] getParameterArray(String name, String value) {
return new HttpParameter[]{new HttpParameter(name, value)};
}
public static HttpParameter[] getParameterArray(String name, int value) {
return getParameterArray(name, String.valueOf(value));
}
public static HttpParameter[] getParameterArray(String name1, String value1
, String name2, String value2) {
return new HttpParameter[]{new HttpParameter(name1, value1)
, new HttpParameter(name2, value2)};
}
public static HttpParameter[] getParameterArray(String name1, int value1
, String name2, int value2) {
return getParameterArray(name1, String.valueOf(value1), name2, String.valueOf(value2));
}
@Override
public int hashCode() {
int result = name.hashCode();
result = 31 * result + (value != null ? value.hashCode() : 0);
result = 31 * result + (file != null ? file.hashCode() : 0);
result = 31 * result + (fileBody != null ? fileBody.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "PostParameter{" +
"name='" + name + '\'' +
", value='" + value + '\'' +
", file=" + file +
", fileBody=" + fileBody +
'}';
}
public int compareTo(Object o) {
int compared;
HttpParameter that = (HttpParameter) o;
compared = name.compareTo(that.name);
if (0 == compared) {
compared = value.compareTo(that.value);
}
return compared;
}
public static String encodeParameters(HttpParameter[] httpParams) {
if (null == httpParams) {
return "";
}
StringBuilder buf = new StringBuilder();
for (int j = 0; j < httpParams.length; j++) {
if (httpParams[j].isFile()) {
throw new IllegalArgumentException("parameter [" + httpParams[j].name + "]should be text");
}
if (j != 0) {
buf.append("&");
}
buf.append(encode(httpParams[j].name))
.append("=").append(encode(httpParams[j].value));
}
return buf.toString();
}
/**
* @param value string to be encoded
* @return encoded string
* @see OAuth / TestCases
* @see Space encoding - OAuth | Google Groups
* @see RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax - 2.1. Percent-Encoding
*/
public static String encode(String value) {
String encoded = null;
try {
encoded = URLEncoder.encode(value, "UTF-8");
} catch (UnsupportedEncodingException ignore) {
}
StringBuilder buf = new StringBuilder(encoded.length());
char focus;
for (int i = 0; i < encoded.length(); i++) {
focus = encoded.charAt(i);
if (focus == '*') {
buf.append("%2A");
} else if (focus == '+') {
buf.append("%20");
} else if (focus == '%' && (i + 1) < encoded.length()
&& encoded.charAt(i + 1) == '7' && encoded.charAt(i + 2) == 'E') {
buf.append('~');
i += 2;
} else {
buf.append(focus);
}
}
return buf.toString();
}
public static HttpParameter[] merge(HttpParameter[] params1, HttpParameter[] params2) {
if (params1 != null && params2 != null) {
HttpParameter[] params = new HttpParameter[params1.length + params2.length];
System.arraycopy(params1, 0, params, 0, params1.length);
System.arraycopy(params2, 0, params, params1.length, params2.length);
return params;
}
if (null == params1 && null == params2) {
return new HttpParameter[0];
}
if (params1 != null) {
return params1;
} else {
return params2;
}
}
public static HttpParameter[] merge(HttpParameter[] params1, HttpParameter params2) {
if (params1 != null && params2 != null) {
HttpParameter[] params = new HttpParameter[params1.length + 1];
System.arraycopy(params1, 0, params, 0, params1.length);
params[params.length - 1] = params2;
return params;
}
if (null == params1 && null == params2) {
return new HttpParameter[0];
}
if (params1 != null) {
return params1;
} else {
return new HttpParameter[]{params2};
}
}
}