aboutsummaryrefslogtreecommitdiffstats
path: root/rest-client/src/main/java/org
diff options
context:
space:
mode:
authortian.ming@huawei.com <tian.ming@huawei.com>2016-08-25 21:13:33 +0800
committertian.ming@huawei.com <tian.ming@huawei.com>2016-08-25 21:13:33 +0800
commit79d67955b160929ffacc6828014d3c5ce3110fb8 (patch)
tree011fb1952e2cfd8292d6ce247abdd745bfe1d700 /rest-client/src/main/java/org
parent8b49886b96d5f7ebc91dbf1aa158b31ac4a72848 (diff)
adjust the code
Change-Id: Id896bed917ba6730c6b5d96665ef9978cfb413de Signed-off-by: tian.ming@huawei.com <tian.ming@huawei.com>
Diffstat (limited to 'rest-client/src/main/java/org')
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/remoteservice/exception/ExceptionArgs.java110
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/remoteservice/exception/ServiceException.java254
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/roa/util/ReaderHelper.java61
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/roa/util/ServiceUtil.java177
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/roa/util/clientsdk/HttpUtil.java169
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/roa/util/clientsdk/JsonUtil.java99
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/roa/util/clientsdk/RestClientUtil.java133
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/DefaultAsyncCallback.java37
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/HttpBaseRest.java291
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/HttpRest.java254
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestHttpContentExchange.java234
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/Restful.java298
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulAsyncCallback.java43
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulClientConst.java65
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulConfigure.java162
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulFactory.java95
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulOptions.java196
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulParametes.java155
-rw-r--r--rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulResponse.java144
19 files changed, 2977 insertions, 0 deletions
diff --git a/rest-client/src/main/java/org/openo/baseservice/remoteservice/exception/ExceptionArgs.java b/rest-client/src/main/java/org/openo/baseservice/remoteservice/exception/ExceptionArgs.java
new file mode 100644
index 0000000..40dd2b1
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/remoteservice/exception/ExceptionArgs.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.remoteservice.exception;
+
+/**
+ * ROA exception handling parameters.
+ * <br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 28-May-2016
+ */
+public class ExceptionArgs {
+
+ /**
+ * Exception descriptions.
+ */
+ private String[] descArgs = null;
+
+ /**
+ * Exception reasons.
+ */
+ private String[] reasonArgs = null;
+
+ /**
+ * Exception detals.
+ */
+ private String[] detailArgs = null;
+
+ /**
+ * Exception advices.
+ */
+ private String[] adviceArgs = null;
+
+ /**
+ * Constructor<br/>
+ * <p>
+ * </p>
+ *
+ * @since SDNO 0.5
+ */
+ public ExceptionArgs() {
+ // default constructor.
+ }
+
+ /**
+ * Constructor<br/>
+ * <p>
+ * </p>
+ *
+ * @since SDNO 0.5
+ * @param descArgs: descriptions.
+ * @param reasonArgs: reasons.
+ * @param detailArgs: details.
+ * @param adviceArgs: advices.
+ */
+ public ExceptionArgs(final String[] descArgs, final String[] reasonArgs, final String[] detailArgs,
+ final String[] adviceArgs) {
+ this.descArgs = descArgs;
+ this.reasonArgs = reasonArgs;
+ this.detailArgs = detailArgs;
+ this.adviceArgs = adviceArgs;
+ }
+
+ public String[] getDescArgs() {
+ return descArgs;
+ }
+
+ public void setDescArgs(final String[] descArgs) {
+ this.descArgs = descArgs;
+ }
+
+ public String[] getReasonArgs() {
+ return reasonArgs;
+ }
+
+ public void setReasonArgs(final String[] reasonArgs) {
+ this.reasonArgs = reasonArgs;
+ }
+
+ public String[] getDetailArgs() {
+ return detailArgs;
+ }
+
+ public void setDetailArgs(final String[] detailArgs) {
+ this.detailArgs = detailArgs;
+ }
+
+ public String[] getAdviceArgs() {
+ return adviceArgs;
+ }
+
+ public void setAdviceArgs(final String[] adviceArgs) {
+ this.adviceArgs = adviceArgs;
+ }
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/remoteservice/exception/ServiceException.java b/rest-client/src/main/java/org/openo/baseservice/remoteservice/exception/ServiceException.java
new file mode 100644
index 0000000..e64d914
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/remoteservice/exception/ServiceException.java
@@ -0,0 +1,254 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.remoteservice.exception;
+
+import java.text.MessageFormat;
+
+/**
+ * The base class for all common exception.<br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 28-May-2016
+ */
+public class ServiceException extends Exception {
+
+ /**
+ * default exception id.
+ */
+ public static final String DEFAULT_ID = "framwork.remote.SystemError";
+
+ /**
+ * Serial number.
+ */
+ private static final long serialVersionUID = 5703294364555144738L;
+
+ /**
+ * Exception id.
+ */
+ private String id = DEFAULT_ID;
+
+ private Object[] args = null;
+
+ private int httpCode = 500;
+
+ private ExceptionArgs exceptionArgs = null;
+
+ /**
+ * The default constructor<br/>
+ * <p>
+ * This method is only used as deserialized, in other cases, use parameterized constructor.
+ * </p>
+ *
+ * @since SDNO 0.5
+ */
+ public ServiceException() {
+ super("");
+ }
+
+ /**
+ * Constructor<br/>
+ * <p>
+ * </p>
+ *
+ * @since SDNO 0.5
+ * @param id: details.
+ * @param cause: reason.
+ */
+ public ServiceException(final String id, final Throwable cause) {
+ super(cause);
+ this.setId(id);
+ }
+
+ /**
+ * Constructor<br/>
+ * <p>
+ * </p>
+ *
+ * @since SDNO 0.5
+ * @param message: details.
+ */
+ public ServiceException(final String message) {
+ super(message);
+ }
+
+ /**
+ * Constructor<br/>
+ * <p>
+ * </p>
+ *
+ * @since SDNO 0.5
+ * @param id: exception id.
+ * @param message: details.
+ */
+ public ServiceException(final String id, final String message) {
+ super(message);
+ this.setId(id);
+ }
+
+ /**
+ * Constructor<br/>
+ * <p>
+ * </p>
+ *
+ * @since SDNO 0.5
+ * @param id: exception id.
+ * @param httpCode: http status code.
+ */
+ public ServiceException(final String id, final int httpCode) {
+ super();
+ this.setId(id);
+ this.setHttpCode(httpCode);
+ }
+
+ /**
+ * Constructor<br/>
+ * <p>
+ * </p>
+ *
+ * @since SDNO 0.5
+ * @param id: exception id.
+ * @param httpCode: http code.
+ * @param exceptionArgs: Exception handling frame parameters.
+ */
+ public ServiceException(final String id, final int httpCode, final ExceptionArgs exceptionArgs) {
+ super();
+ this.setId(id);
+ this.setHttpCode(httpCode);
+ this.setExceptionArgs(exceptionArgs);
+ }
+
+ /**
+ * Constructor<br/>
+ * <p>
+ * Have a placeholder exception, use args formatted message.
+ * </p>
+ *
+ * @since SDNO 0.5
+ * @param id: exception id.
+ * @param message: details.
+ * @param args: Placeholders for parameters
+ */
+ public ServiceException(final String id, final String message, final Object... args) {
+ super(MessageFormat.format(message, args));
+ this.setId(id);
+ this.args = args;
+ }
+
+ /**
+ * Constructor<br/>
+ * <p>
+ * Have a placeholder exception, use args formatted message
+ * </p>
+ *
+ * @since SDNO 0.5
+ * @param id: exception id.
+ * @param message: details.
+ * @param cause: reason.
+ * @param args: placeholder for parameters
+ */
+ public ServiceException(final String id, final String message, final Throwable cause, final Object... args) {
+ super(MessageFormat.format(message, args), cause);
+ this.setId(id);
+ this.args = args;
+ }
+
+ /**
+ * Constructor<br/>
+ * <p>
+ * </p>
+ *
+ * @since SDNO 0.5
+ * @param id: exception id.
+ * @param message: details.
+ * @param cause: reason.
+ */
+ public ServiceException(final String id, final String message, final Throwable cause) {
+ super(message, cause);
+ this.setId(id);
+ }
+
+ /**
+ * Constructor<br/>
+ * <p>
+ * </p>
+ *
+ * @since SDNO 0.5
+ * @param cause: reason.
+ */
+ public ServiceException(final Throwable cause) {
+ super(cause);
+ }
+
+ /**
+ * Get exceptoin id.<br/>
+ *
+ * @return
+ * @since SDNO 0.5
+ */
+ public String getId() {
+ if(id == null || id.isEmpty()) {
+ return DEFAULT_ID;
+ }
+ return id;
+ }
+
+ public void setId(final String id) {
+ this.id = id;
+ }
+
+ public int getHttpCode() {
+ return this.httpCode;
+ }
+
+ public void setHttpCode(final int httpCode) {
+ this.httpCode = httpCode;
+ }
+
+ /**
+ * Obtain the ROA exception handling framework parameters<br/>
+ *
+ * @return exception args.
+ * @since SDNO 0.5
+ */
+ public ExceptionArgs getExceptionArgs() {
+ return exceptionArgs;
+ }
+
+ public void setExceptionArgs(final ExceptionArgs exceptionArgs) {
+ this.exceptionArgs = exceptionArgs;
+ }
+
+ /**
+ * Gets the parameter information<br/>
+ *
+ * @return parameter list.
+ * @since SDNO 0.5
+ */
+ protected Object[] getArgs() {
+ if(args == null || args.length == 0 || DEFAULT_ID.equals(getId())) {
+ return new Object[] {};
+ }
+ return args;
+ }
+
+ @Override
+ public String toString() {
+ return "exception.id: " + getId() + "; " + super.toString();
+ }
+
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/roa/util/ReaderHelper.java b/rest-client/src/main/java/org/openo/baseservice/roa/util/ReaderHelper.java
new file mode 100644
index 0000000..86124cf
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/roa/util/ReaderHelper.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.roa.util;
+
+import org.apache.commons.io.LineIterator;
+
+import java.io.Reader;
+
+/**
+ * Helper for read line.<br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 31-May-2016
+ */
+public class ReaderHelper {
+
+ private LineIterator ite = null;
+
+ /**
+ * Constructor<br/>
+ * <p>
+ * </p>
+ *
+ * @since SDNO 0.5
+ * @param reader
+ */
+ public ReaderHelper(final Reader reader) {
+ if(reader != null) {
+ ite = new LineIterator(reader);
+ }
+
+ }
+
+ /**
+ * Gets the next line.<br/>
+ *
+ * @return line if present else null.
+ * @since SDNO 0.5
+ */
+ public String getLine() {
+ if(ite != null && ite.hasNext()) {
+ return ite.nextLine();
+ }
+ return null;
+ }
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/roa/util/ServiceUtil.java b/rest-client/src/main/java/org/openo/baseservice/roa/util/ServiceUtil.java
new file mode 100644
index 0000000..aca60c0
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/roa/util/ServiceUtil.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.roa.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.Properties;
+
+/**
+ * Service connection configuration util.<br/>
+ * <p>
+ * Get host and port from the Client Configure the connection environment and service Configure
+ * profile
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 28-May-2016
+ */
+public class ServiceUtil {
+
+ private static final Logger LOG = LoggerFactory.getLogger(ServiceUtil.class);
+
+ private final Properties allConfigure = new Properties();
+
+ private final Properties serviceConfigure;
+
+ private String serviceStage;
+
+ private String serviceName;
+
+ /**
+ * Constructor<br/>
+ * <p>
+ * Load profile information.
+ * </p>
+ *
+ * @since SDNO 0.5
+ * @param serviceName user-specified service name.
+ * @param url invoked service url.
+ */
+ public ServiceUtil(final String serviceName, final String url) {
+ final String fomattedUrl = formatUrl(url);
+ serviceConfigure = loadProperties("service-configure.properties");
+ if(null == serviceName || serviceName.isEmpty()) {
+ this.serviceName = getServiceNameWhitUrl(fomattedUrl);
+ } else {
+ this.serviceName = serviceName;
+ }
+ loadPropertyFile();
+ }
+
+ /**
+ * Get the service user-specified host.
+ * <br/>
+ *
+ * @return host
+ * @since SDNO 0.5
+ */
+ public String getServiceHost() {
+ final String host = allConfigure.getProperty(serviceName + "." + serviceStage + ".host");
+ if(null == host) {
+ return "";
+ }
+ return host;
+ }
+
+ /**
+ * Get the service user-specified port.
+ * <br/>
+ *
+ * @return port
+ * @since SDNO 0.5
+ */
+ public int getServicePort() {
+ final String portStr = allConfigure.getProperty(serviceName + "." + serviceStage + ".port");
+ if(null == portStr) {
+ return -1;
+ }
+ return Integer.parseInt(portStr);
+ }
+
+ private String getServiceNameWhitUrl(final String url) {
+ final Enumeration<?> keys = serviceConfigure.propertyNames();
+ while(keys.hasMoreElements()) {
+ final String key = (String)keys.nextElement();
+ if(key.endsWith("urls")) {
+ final String urls = serviceConfigure.getProperty(key);
+ for(String tempUrl : urls.split(",")) {
+ tempUrl = formatUrl(tempUrl);
+ if(url.startsWith(tempUrl)) {
+ return key.split("\\.")[0];
+ }
+ }
+
+ }
+ }
+ return "";
+ }
+
+ private static String formatUrl(final String url) {
+ String outUrl = url;
+ if(outUrl.contains("?")) {
+ outUrl = outUrl.split("\\?")[0];
+ }
+ outUrl = outUrl.replace("\\", "/");
+ outUrl = outUrl.replaceAll("[/]{2,}", "/");
+ outUrl = outUrl.endsWith("/") ? outUrl.substring(0, outUrl.length() - 1) : outUrl;
+ outUrl = outUrl.endsWith("/*") ? outUrl.substring(0, outUrl.length() - 2) : outUrl;
+ return outUrl;
+ }
+
+ /**
+ * Loads the client and service configuration files.
+ * <br/>
+ *
+ * @since SDNO 0.5
+ */
+ private void loadPropertyFile() {
+ final Properties clientConfigure = loadProperties(serviceName + "-client-configure.properties");
+ allConfigure.putAll(clientConfigure);
+ allConfigure.putAll(serviceConfigure);
+ serviceStage = allConfigure.getProperty(serviceName + ".stage");
+ }
+
+ /**
+ * Loads the client and service configuration files.
+ * <br/>
+ *
+ * @param classProperties: service profile file name.
+ * @return Service configuration.
+ * @since SDNO 0.5
+ */
+ private Properties loadProperties(final String classProperties) {
+ final Properties properties = new Properties();
+ InputStream inputStream = null;
+ ClassLoader classloader = null;
+ try {
+ classloader = this.getClass().getClassLoader();
+ if(classloader != null) {
+ inputStream = classloader.getResourceAsStream(classProperties);
+ }
+ if(inputStream != null) {
+ properties.load(inputStream);
+ inputStream.close();
+ }
+ } catch(final IOException e) {
+ LOG.error("load file error: ", e);
+ } finally {
+ if(inputStream != null) {
+ try {
+ inputStream.close();
+ } catch(final IOException ee) {
+ LOG.error("close inputStream error: ", ee);
+ }
+ inputStream = null;
+ }
+ }
+ return properties;
+ }
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/roa/util/clientsdk/HttpUtil.java b/rest-client/src/main/java/org/openo/baseservice/roa/util/clientsdk/HttpUtil.java
new file mode 100644
index 0000000..3c6493c
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/roa/util/clientsdk/HttpUtil.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.roa.util.clientsdk;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Collection;
+import java.util.Date;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Http utilities.
+ * <br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 28-May-2016
+ */
+public class HttpUtil {
+
+ /**
+ *
+ */
+ private static final String APPLICATION_JSON = "application/json";
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(HttpUtil.class);
+
+ private HttpUtil() {
+
+ }
+
+ /**
+ * Check if the given array contains the given value (with case-insensitive comparison).
+ * <br/>
+ *
+ * @param array The array
+ * @param value The value to search
+ * @return true if the array contains the value
+ * @since SDNO 0.5
+ */
+ public static boolean containsIgnoreCase(final String[] array, final String value) {
+ for(final String str : array) {
+ if(value == null && str == null) {
+ return true;
+ }
+ if(value != null && value.equalsIgnoreCase(str)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Join an array of strings with the given separator.
+ * <br/>
+ *
+ * @param array The array of strings
+ * @param separator The separator
+ * @return the resulting string
+ * @since SDNO 0.5
+ */
+ public static String join(final String[] array, final String separator) {
+ final int len = array.length;
+ if(len == 0) {
+ return "";
+ }
+ final StringBuilder out = new StringBuilder();
+ out.append(array[0]);
+ for(int i = 1; i < len; i++) {
+ out.append(separator).append(array[i]);
+ }
+ return out.toString();
+ }
+
+ /**
+ * Format the given parameter object into string.
+ * <br/>
+ *
+ * @param param param input
+ * @return query param string
+ * @since SDNO 0.5
+ */
+ public static String parameterToString(final Object param) {
+ if(param == null) {
+ return "";
+ } else if(param instanceof Date) {
+ return Long.toString(((Date)param).getTime());
+ } else if(param instanceof Collection) {
+ final StringBuilder b = new StringBuilder();
+ for(final Object o : (Collection)param) {
+ if(b.length() > 0) {
+ b.append(',');
+ }
+ b.append(String.valueOf(o));
+ }
+ return b.toString();
+ } else {
+ return String.valueOf(param);
+ }
+ }
+
+ /**
+ * get accept header
+ * <br/>
+ *
+ * @param accepts accepts accept types
+ * @return the accepts string
+ * @since SDNO 0.5
+ */
+ public static String selectHeaderAccept(final String[] accepts) {
+ if(accepts.length == 0) {
+ return null;
+ }
+ if(HttpUtil.containsIgnoreCase(accepts, APPLICATION_JSON)) {
+ return APPLICATION_JSON;
+ }
+ return HttpUtil.join(accepts, ",");
+ }
+
+ /**
+ * select head content type
+ * <br/>
+ *
+ * @param contentTypes contentTypes content types
+ * @return the json string or the first content type
+ * @since SDNO 0.5
+ */
+ public static String selectHeaderContentType(final String[] contentTypes) {
+ if(contentTypes.length == 0) {
+ return APPLICATION_JSON;
+ }
+ if(HttpUtil.containsIgnoreCase(contentTypes, APPLICATION_JSON)) {
+ return APPLICATION_JSON;
+ }
+ return contentTypes[0];
+ }
+
+ /**
+ * Escape the given string to be used as URL query value.<br/>
+ *
+ * @param str str param str
+ * @return escape string
+ * @since SDNO 0.5
+ */
+ public static String escapeString(final String str) {
+ try {
+ return URLEncoder.encode(str, "utf8").replaceAll("\\+", "%20");
+ } catch(final UnsupportedEncodingException e) {
+ LOGGER.info("UTF8 is not supported", e);
+ return str;
+ }
+ }
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/roa/util/clientsdk/JsonUtil.java b/rest-client/src/main/java/org/openo/baseservice/roa/util/clientsdk/JsonUtil.java
new file mode 100644
index 0000000..2234e19
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/roa/util/clientsdk/JsonUtil.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.roa.util.clientsdk;
+
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.type.TypeReference;
+
+import net.sf.json.JSON;
+
+import java.io.IOException;
+
+/**
+ * JSON parse utilities.
+ * <br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 28-May-2016
+ */
+public final class JsonUtil {
+
+ private static final ObjectMapper MAPPER = new ObjectMapper();
+
+ static {
+ MAPPER.setDeserializationConfig(MAPPER.getDeserializationConfig()
+ .without(org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES));
+ }
+
+ private JsonUtil() {
+ }
+
+ /**
+ * Parse JSON formated string.<br/>
+ *
+ * @param jsonstr: JSON formated string.
+ * @param type: result type.
+ * @return parsed object.
+ * @throws IOException incase error.
+ * @since SDNO 0.5
+ */
+ public static <T> T unMarshal(final String jsonstr, final Class<T> type) throws IOException {
+ return MAPPER.readValue(jsonstr, type);
+ }
+
+ /**
+ * Parse JSON formatted string (for a generic target type).
+ * <br/>
+ *
+ * @param jsonstr request data.
+ * @param type target type.
+ * @return result object.
+ * @throws IOException incase error.
+ * @since SDNO 0.5
+ */
+ public static <T> T unMarshal(final String jsonstr, final TypeReference<T> type) throws IOException {
+ return MAPPER.readValue(jsonstr, type);
+ }
+
+ /**
+ * Convert object to JSON format string.
+ * <br/>
+ *
+ * @param srcObj source object.
+ * @return JSON format string.
+ * @throws IOException incase of error.
+ * @since SDNO 0.5
+ */
+ public static String marshal(final Object srcObj) throws IOException {
+ if(srcObj instanceof JSON) {
+ return srcObj.toString();
+ }
+ return MAPPER.writeValueAsString(srcObj);
+ }
+
+ /**
+ * Get parsing mapper
+ * <br/>
+ *
+ * @return parsing mapper
+ * @since SDNO 0.5
+ */
+ public static ObjectMapper getMapper() {
+ return MAPPER;
+ }
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/roa/util/clientsdk/RestClientUtil.java b/rest-client/src/main/java/org/openo/baseservice/roa/util/clientsdk/RestClientUtil.java
new file mode 100644
index 0000000..b769f0a
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/roa/util/clientsdk/RestClientUtil.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.roa.util.clientsdk;
+
+import org.openo.baseservice.remoteservice.exception.ServiceException;
+import org.openo.baseservice.roa.util.restclient.Restful;
+import org.openo.baseservice.roa.util.restclient.RestfulAsyncCallback;
+import org.openo.baseservice.roa.util.restclient.RestfulParametes;
+import org.openo.baseservice.roa.util.restclient.RestfulResponse;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Rest Client Tools.
+ * <br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 28-May-2016
+ */
+public class RestClientUtil {
+
+ private static Set<Class<?>> ret = new HashSet<>();
+
+ static {
+ ret.add(Boolean.class);
+ ret.add(Character.class);
+ ret.add(Byte.class);
+ ret.add(Short.class);
+ ret.add(Integer.class);
+ ret.add(Long.class);
+ ret.add(Float.class);
+ ret.add(Double.class);
+ ret.add(Void.class);
+ ret.add(String.class);
+ }
+
+ private RestClientUtil() {
+
+ }
+
+ /**
+ * Processing HTTP requests.
+ * <br/>
+ *
+ * @param method method name.
+ * @param path request path.
+ * @param parameters parameters.
+ * @param restFull ReST request instance
+ * @return The ReST response.
+ * @throws ServiceException Exception information.
+ * @since SDNO 0.5
+ */
+ public static RestfulResponse invokeMethod(final String method, final String path,
+ final RestfulParametes parameters, final Restful restFull) throws ServiceException {
+ RestfulResponse response;
+ if("get".equalsIgnoreCase(method)) {
+ response = restFull.get(path, parameters);
+ } else if("put".equalsIgnoreCase(method)) {
+ response = restFull.put(path, parameters);
+ } else if("post".equalsIgnoreCase(method)) {
+ response = restFull.post(path, parameters);
+ } else if("delete".equalsIgnoreCase(method)) {
+ response = restFull.delete(path, parameters);
+ } else if("patch".equalsIgnoreCase(method)) {
+ response = restFull.patch(path, parameters);
+ } else {
+ throw new ServiceException("NotSuppertMethod", 400);
+ }
+ return response;
+ }
+
+ /**
+ * An asynchronous HTTP request.
+ * <br/>
+ *
+ * @param method http method.
+ * @param path request path.
+ * @param parameters request parameters.
+ * @param restFull restFull instance.
+ * @param callback callback function.
+ * @throws ServiceException in case error.
+ * @since SDNO 0.5
+ */
+ public static void invokeAsyncMethod(final String method, final String path, final RestfulParametes parameters,
+ final Restful restFull, final RestfulAsyncCallback callback) throws ServiceException {
+ if("get".equalsIgnoreCase(method)) {
+ restFull.asyncGet(path, parameters, callback);
+ } else if("put".equalsIgnoreCase(method)) {
+ restFull.asyncPut(path, parameters, callback);
+ } else if("post".equalsIgnoreCase(method)) {
+ restFull.asyncPost(path, parameters, callback);
+ } else if("delete".equalsIgnoreCase(method)) {
+ restFull.asyncDelete(path, parameters, callback);
+ } else if("patch".equalsIgnoreCase(method)) {
+ restFull.asyncPatch(path, parameters, callback);
+ } else {
+ throw new ServiceException("NotSuppertMethod", 400);
+ }
+ }
+
+ /**
+ * Determine whether a class is a native.<br/>
+ *
+ * @param clazz: class type.
+ * @return whether primitive or not.
+ * @since SDNO 0.5
+ */
+ public static boolean isPrimitive(final Class<?> clazz) {
+ if(clazz.isPrimitive()) {
+ return true;
+ }
+ if(ret.contains(clazz)) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/DefaultAsyncCallback.java b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/DefaultAsyncCallback.java
new file mode 100644
index 0000000..8195b0d
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/DefaultAsyncCallback.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.roa.util.restclient;
+
+/**
+ * Restful Asynchronous call back implentation.<br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 28-May-2016
+ */
+public class DefaultAsyncCallback implements RestfulAsyncCallback {
+
+ @Override
+ public void callback(final RestfulResponse response) {
+ // default implementation.
+ }
+
+ @Override
+ public void handleExcepion(final Throwable e) {
+ // default implementation
+ }
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/HttpBaseRest.java b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/HttpBaseRest.java
new file mode 100644
index 0000000..4f58778
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/HttpBaseRest.java
@@ -0,0 +1,291 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.roa.util.restclient;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.eclipse.jetty.client.Address;
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.client.HttpExchange;
+import org.eclipse.jetty.http.HttpMethods;
+import org.openo.baseservice.remoteservice.exception.ServiceException;
+import org.openo.baseservice.roa.util.ServiceUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * <br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 Aug 9, 2016
+ */
+public abstract class HttpBaseRest implements Restful {
+
+ private static final Logger LOG = LoggerFactory.getLogger(HttpRest.class);
+
+ final AtomicInteger requestId = new AtomicInteger(0);
+
+ protected HttpClient client = null;
+
+ private static final String LOCAL_HOST = "127.0.0.1";
+
+ static final String HTTP_PATCH = "PATCH";
+
+ String defaultIP = LOCAL_HOST;
+
+ int defaultPort = -10000;
+
+ int defaultTimeout = 30000;
+
+ final String procenameRouteID = "RouteID-" + System.currentTimeMillis() + "-";
+
+ /**
+ * Constructor<br/>
+ * <p>
+ * </p>
+ *
+ * @since SDNO 0.5
+ */
+ public HttpBaseRest() {
+ super();
+ }
+
+ protected void createHttpClient() {
+ client = new HttpClient();
+ }
+
+ protected RestHttpContentExchange createRestHttpContentExchange(final RestfulAsyncCallback callback) {
+ final RestHttpContentExchange exchange = new RestHttpContentExchange(true, callback);
+ exchange.setScheme("http");
+ return exchange;
+ }
+
+ private String encodeParams(final RestfulParametes restParametes) throws ServiceException {
+ final Map<String, String> parm = restParametes.getParamMap();
+ String value = null;
+ boolean bHasParma = false;
+ final StringBuilder builder = new StringBuilder();
+ try {
+ for(final String key : parm.keySet()) {
+ value = parm.get(key);
+ if(value == null) {
+ value = "";
+ }
+ String str;
+ if(bHasParma) {
+ str = String.format("&%s=%s", URLEncoder.encode(key, RestfulClientConst.ENCODING),
+ URLEncoder.encode(value, RestfulClientConst.ENCODING));
+ } else {
+ bHasParma = true;
+ str = String.format("%s=%s", URLEncoder.encode(key, RestfulClientConst.ENCODING),
+ URLEncoder.encode(value, RestfulClientConst.ENCODING));
+ }
+ builder.append(str);
+ }
+ } catch(final UnsupportedEncodingException ex) {
+ LOG.error("unsupported encoding: ", ex);
+ throw new ServiceException("Broken VM does not support UTF-8");
+ }
+ return builder.toString();
+ }
+
+ private void processHeader(final RestHttpContentExchange contentExchange, final Map<String, String> headerMap) {
+ for(final String key : headerMap.keySet()) {
+ final String value = headerMap.get(key);
+ contentExchange.addRequestHeader(key, value);
+ }
+
+ }
+
+ private void setContentExchangeParams(final RestHttpContentExchange contentExchange) {
+ final String contentType = contentExchange.getRequestFields().getStringField("Content-Type");
+ if(null == contentType || contentType.isEmpty()) {
+ // application/json;charset=utf-8
+ contentExchange.setRequestContentType(RestfulClientConst.APPLICATION_FORM_URLENCODED);
+ }
+ final String encoding = contentExchange.getRequestFields().getStringField("Accept-Encoding");
+ if(null == encoding || encoding.isEmpty()) {
+ // compress,gzip
+ contentExchange.setRequestHeader("Accept-Encoding", "*/*");
+ }
+ contentExchange.setVersion(11);
+ }
+
+ /**
+ * <br/>
+ *
+ * @param method
+ * @param servicePath
+ * @param restParametes
+ * @param options
+ * @param callback
+ * @return
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ protected RestfulResponse sendHttpRequest(final String method, final String servicePath,
+ final RestfulParametes restParametes, final RestfulOptions options, final RestfulAsyncCallback callback)
+ throws ServiceException {
+ final RestHttpContentExchange contentExchange = createRestHttpContentExchange(callback);
+ if(null == restParametes) {
+ return new RestfulResponse();
+ }
+ final String requestTrace = this.getReuqestIdString();
+ restParametes.putHttpContextHeader(RestfulClientConst.REQUEST_ID, requestTrace);
+
+ RestfulResponse rsp = null;
+ try {
+ contentExchange.setMethod(method);
+ final String str = encodeParams(restParametes);
+ final StringBuilder builder = new StringBuilder();
+ builder.append(servicePath);
+ if(str.length() > 0 && (method.equals(HttpMethods.GET) || method.equals(HttpMethods.DELETE)
+ || method.equals(HttpMethods.HEAD))) {
+ builder.append('?');
+ builder.append(str);
+ }
+ setDefaultUrl(contentExchange, options, builder);
+ processHeader(contentExchange, restParametes.getHeaderMap());
+ setContentExchangeParams(contentExchange);
+
+ setPostPutParam(method, restParametes, contentExchange, str);
+ setTimeout(options, contentExchange);
+
+ client.send(contentExchange);
+ rsp = callbackExecute(callback, contentExchange);
+ } catch(final Exception e) {
+ LOG.error("request reply message have exception:status is "
+ + RestHttpContentExchange.toState(contentExchange.getStatus()));
+ throw new ServiceException(e);
+ }
+ return rsp;
+ }
+
+ private void setDefaultUrl(final RestHttpContentExchange contentExchange, final RestfulOptions options,
+ final StringBuilder url) {
+ // server
+ if(url.toString().startsWith("http")) {
+ contentExchange.setURL(url.toString());
+ } else {
+ String host = defaultIP;
+ int iPort = defaultPort;
+ String calledServiceName = null;
+ if(options != null) {
+ calledServiceName = options.getCalledServicName();
+ }
+ final ServiceUtil serviceUtil = new ServiceUtil(calledServiceName, url.toString());
+ final String configHost = serviceUtil.getServiceHost();
+ final int configPort = serviceUtil.getServicePort();
+ if(!configHost.isEmpty() && configPort > 0) {
+ if(options != null) {
+ options.setHost(configHost);
+ options.setPort(configPort);
+ } else {
+ host = configHost;
+
+ iPort = configPort;
+ }
+ }
+ if(options != null) {
+ host = options.getHost();
+ if(host.isEmpty()) {
+ host = defaultIP;
+ }
+ iPort = options.getPort();
+ if(iPort == 0) {
+ iPort = defaultPort;
+ }
+ }
+ // Integer.getInteger(".http.client.maxThread",30)
+ contentExchange.setAddress(new Address(host, iPort));
+ contentExchange.setRequestURI(url.toString());
+ }
+ }
+
+ private String getReuqestIdString() {
+ if(this.requestId.get() == 0x7FFFFFFF) {
+ this.requestId.set(1);
+ }
+ final int reqId = this.requestId.getAndIncrement();
+ final StringBuilder builder = new StringBuilder(this.procenameRouteID);
+ // time
+ final SimpleDateFormat dateFormate = new SimpleDateFormat("yyMMdd");
+ final SimpleDateFormat timeFormate = new SimpleDateFormat("HHmmss");
+ final Date date = Calendar.getInstance().getTime();
+ builder.append(dateFormate.format(date) + timeFormate.format(date));
+ builder.append('-');
+ builder.append(reqId);
+ return builder.toString();
+ }
+
+ private void setPostPutParam(final String method, final RestfulParametes restParametes,
+ final RestHttpContentExchange contentExchange, final String str) throws UnsupportedEncodingException {
+ if(HttpMethods.POST.equals(method) || HttpMethods.PUT.equals(method) || HTTP_PATCH.equals(method)) {
+ ByteArrayInputStream buff;
+ final String tmpRaw = restParametes.getRawData();
+ if(tmpRaw == null) {
+ buff = new ByteArrayInputStream(str.getBytes(RestfulClientConst.ENCODING));
+ } else {
+ buff = new ByteArrayInputStream(tmpRaw.getBytes(RestfulClientConst.ENCODING));
+ }
+ final int len = buff.available();
+ contentExchange.setRequestContentSource(buff);
+ contentExchange.setRequestHeader("content-length", String.valueOf(len));
+ }
+ }
+
+ private void setTimeout(final RestfulOptions options, final RestHttpContentExchange contentExchange) {
+ if(options != null) {
+ final long timeout = options.getRestTimeout();
+ if(timeout != 0) {
+ contentExchange.setTimeout(timeout);
+ } else {
+ contentExchange.setTimeout(defaultTimeout);
+ }
+ } else {
+ contentExchange.setTimeout(defaultTimeout);
+ }
+ }
+
+ private RestfulResponse callbackExecute(final RestfulAsyncCallback callback,
+ final RestHttpContentExchange contentExchange) throws InterruptedException, IOException, ServiceException {
+ if(callback == null) {
+ final int exchangeState = contentExchange.waitForDone();
+ if(exchangeState == HttpExchange.STATUS_COMPLETED) {
+ return contentExchange.getResponse();
+ } else if(exchangeState == HttpExchange.STATUS_EXCEPTED) {
+ throw new ServiceException(
+ "request is exception: " + RestHttpContentExchange.toState(HttpExchange.STATUS_EXCEPTED));
+ } else if(exchangeState == HttpExchange.STATUS_EXPIRED) {
+ throw new ServiceException(
+ "request is expierd: " + RestHttpContentExchange.toState(HttpExchange.STATUS_EXPIRED));
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/HttpRest.java b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/HttpRest.java
new file mode 100644
index 0000000..50a3538
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/HttpRest.java
@@ -0,0 +1,254 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.roa.util.restclient;
+
+import org.eclipse.jetty.client.HttpClient;
+import org.eclipse.jetty.http.HttpMethods;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.openo.baseservice.remoteservice.exception.ServiceException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * <br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 Aug 9, 2016
+ */
+public class HttpRest extends HttpBaseRest {
+
+ private static final Logger LOG = LoggerFactory.getLogger(HttpRest.class);
+
+ /**
+ * Initializing Rest options.<br/>
+ *
+ * @param options: rest options.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ public void initHttpRest(final RestfulOptions option) throws ServiceException {
+ if(option == null) {
+ client = null;
+ throw new ServiceException("option is null.");
+ }
+ createHttpClient();
+ try {
+ int iValue;
+ iValue = option.getIntOption(RestfulClientConst.MAX_CONN_PER_ADDR_KEY_NAME);
+ // max 200 concurrent,connections to every address
+ client.setMaxConnectionsPerAddress(iValue);
+
+ iValue = option.getIntOption(RestfulClientConst.THREAD_KEY_NAME);
+ // max threads
+ client.setThreadPool(new QueuedThreadPool(iValue));
+ iValue = option.getIntOption(RestfulClientConst.CONN_TIMEOUT_KEY_NAME);
+ client.setConnectTimeout(iValue);
+ iValue = option.getRestTimeout();
+ defaultTimeout = iValue;
+ client.setTimeout(iValue);
+
+ iValue = option.getIntOption(RestfulClientConst.IDLE_TIMEOUT_KEY_NAME);
+ client.setIdleTimeout(iValue);
+ iValue = option.getIntOption(RestfulClientConst.MAX_RESPONSE_HEADER_SIZE);
+ client.setResponseHeaderSize(iValue);
+ iValue = option.getIntOption(RestfulClientConst.MAX_REQUEST_HEADER_SIZE);
+ client.setRequestHeaderSize(iValue);
+ // HttpClient.CONNECTOR_SOCKET
+ client.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
+ client.start();
+ defaultIP = option.getStringOption(RestfulClientConst.HOST_KEY_NAME);
+ defaultPort = option.getIntOption(RestfulClientConst.PORT_KEY_NAME);
+ } catch(final Exception e) {
+ LOG.error("start httpclient error", e);
+ client = null;
+ throw new ServiceException("http client init failed.");
+ }
+ }
+
+ @Override
+ public RestfulResponse get(final String servicePath, final RestfulParametes restParametes) throws ServiceException {
+ return this.sendHttpRequest(HttpMethods.GET, servicePath, restParametes, null, null);
+ }
+
+ @Override
+ public RestfulResponse get(final String servicePath, final RestfulParametes restParametes,
+ final RestfulOptions option) throws ServiceException {
+ return this.sendHttpRequest(HttpMethods.GET, servicePath, restParametes, option, null);
+ }
+
+ @Override
+ public RestfulResponse head(final String servicePath, final RestfulParametes restParametes)
+ throws ServiceException {
+ return this.sendHttpRequest(HttpMethods.HEAD, servicePath, restParametes, null, null);
+ }
+
+ @Override
+ public RestfulResponse head(final String servicePath, final RestfulParametes restParametes,
+ final RestfulOptions option) throws ServiceException {
+ return this.sendHttpRequest(HttpMethods.HEAD, servicePath, restParametes, option, null);
+ }
+
+ @Override
+ public void asyncGet(final String servicePath, final RestfulParametes restParametes,
+ final RestfulAsyncCallback callback) throws ServiceException {
+ if(callback == null) {
+ this.sendHttpRequest(HttpMethods.GET, servicePath, restParametes, null, new DefaultAsyncCallback());
+ } else {
+ this.sendHttpRequest(HttpMethods.GET, servicePath, restParametes, null, callback);
+ }
+ }
+
+ @Override
+ public void asyncGet(final String servicePath, final RestfulParametes restParametes, final RestfulOptions option,
+ final RestfulAsyncCallback callback) throws ServiceException {
+ if(callback == null) {
+ this.sendHttpRequest(HttpMethods.GET, servicePath, restParametes, option, new DefaultAsyncCallback());
+ } else {
+ this.sendHttpRequest(HttpMethods.GET, servicePath, restParametes, option, callback);
+ }
+ }
+
+ @Override
+ public RestfulResponse put(final String servicePath, final RestfulParametes restParametes) throws ServiceException {
+ return this.sendHttpRequest(HttpMethods.PUT, servicePath, restParametes, null, null);
+ }
+
+ @Override
+ public RestfulResponse put(final String servicePath, final RestfulParametes restParametes,
+ final RestfulOptions option) throws ServiceException {
+ return this.sendHttpRequest(HttpMethods.PUT, servicePath, restParametes, option, null);
+ }
+
+ @Override
+ public void asyncPut(final String servicePath, final RestfulParametes restParametes,
+ final RestfulAsyncCallback callback) throws ServiceException {
+ if(callback == null) {
+ this.sendHttpRequest(HttpMethods.PUT, servicePath, restParametes, null, new DefaultAsyncCallback());
+ } else {
+ this.sendHttpRequest(HttpMethods.PUT, servicePath, restParametes, null, callback);
+ }
+ }
+
+ @Override
+ public void asyncPut(final String servicePath, final RestfulParametes restParametes, final RestfulOptions option,
+ final RestfulAsyncCallback callback) throws ServiceException {
+ if(callback == null) {
+ this.sendHttpRequest(HttpMethods.PUT, servicePath, restParametes, option, new DefaultAsyncCallback());
+ } else {
+ this.sendHttpRequest(HttpMethods.PUT, servicePath, restParametes, option, callback);
+ }
+ }
+
+ @Override
+ public RestfulResponse post(final String servicePath, final RestfulParametes restParametes)
+ throws ServiceException {
+ return this.sendHttpRequest(HttpMethods.POST, servicePath, restParametes, null, null);
+ }
+
+ @Override
+ public RestfulResponse post(final String servicePath, final RestfulParametes restParametes,
+ final RestfulOptions option) throws ServiceException {
+ return this.sendHttpRequest(HttpMethods.POST, servicePath, restParametes, option, null);
+ }
+
+ @Override
+ public void asyncPost(final String servicePath, final RestfulParametes restParametes,
+ final RestfulAsyncCallback callback) throws ServiceException {
+ if(callback == null) {
+ this.sendHttpRequest(HttpMethods.POST, servicePath, restParametes, null, new DefaultAsyncCallback());
+ } else {
+ this.sendHttpRequest(HttpMethods.POST, servicePath, restParametes, null, callback);
+ }
+ }
+
+ @Override
+ public void asyncPost(final String servicePath, final RestfulParametes restParametes, final RestfulOptions option,
+ final RestfulAsyncCallback callback) throws ServiceException {
+ if(callback == null) {
+ this.sendHttpRequest(HttpMethods.POST, servicePath, restParametes, option, new DefaultAsyncCallback());
+ } else {
+ this.sendHttpRequest(HttpMethods.POST, servicePath, restParametes, option, callback);
+ }
+ }
+
+ @Override
+ public RestfulResponse delete(final String servicePath, final RestfulParametes restParametes)
+ throws ServiceException {
+ return this.sendHttpRequest(HttpMethods.DELETE, servicePath, restParametes, null, null);
+ }
+
+ @Override
+ public RestfulResponse delete(final String servicePath, final RestfulParametes restParametes,
+ final RestfulOptions option) throws ServiceException {
+ return this.sendHttpRequest(HttpMethods.DELETE, servicePath, restParametes, option, null);
+ }
+
+ @Override
+ public void asyncDelete(final String servicePath, final RestfulParametes restParametes,
+ final RestfulAsyncCallback callback) throws ServiceException {
+ if(callback == null) {
+ this.sendHttpRequest(HttpMethods.DELETE, servicePath, restParametes, null, new DefaultAsyncCallback());
+ } else {
+ this.sendHttpRequest(HttpMethods.DELETE, servicePath, restParametes, null, callback);
+ }
+ }
+
+ @Override
+ public void asyncDelete(final String servicePath, final RestfulParametes restParametes, final RestfulOptions option,
+ final RestfulAsyncCallback callback) throws ServiceException {
+ if(callback == null) {
+ this.sendHttpRequest(HttpMethods.DELETE, servicePath, restParametes, option, new DefaultAsyncCallback());
+ } else {
+ this.sendHttpRequest(HttpMethods.DELETE, servicePath, restParametes, option, callback);
+ }
+ }
+
+ @Override
+ public RestfulResponse patch(final String servicePath, final RestfulParametes restParametes)
+ throws ServiceException {
+ return this.sendHttpRequest(HTTP_PATCH, servicePath, restParametes, null, null);
+ }
+
+ @Override
+ public RestfulResponse patch(final String servicePath, final RestfulParametes restParametes,
+ final RestfulOptions option) throws ServiceException {
+ return this.sendHttpRequest(HTTP_PATCH, servicePath, restParametes, option, null);
+ }
+
+ @Override
+ public void asyncPatch(final String servicePath, final RestfulParametes restParametes,
+ final RestfulAsyncCallback callback) throws ServiceException {
+ if(callback == null) {
+ this.sendHttpRequest(HTTP_PATCH, servicePath, restParametes, null, new DefaultAsyncCallback());
+ } else {
+ this.sendHttpRequest(HTTP_PATCH, servicePath, restParametes, null, callback);
+ }
+ }
+
+ @Override
+ public void asyncPatch(final String servicePath, final RestfulParametes restParametes, final RestfulOptions option,
+ final RestfulAsyncCallback callback) throws ServiceException {
+ if(callback == null) {
+ this.sendHttpRequest(HTTP_PATCH, servicePath, restParametes, option, new DefaultAsyncCallback());
+ } else {
+ this.sendHttpRequest(HTTP_PATCH, servicePath, restParametes, option, callback);
+ }
+ }
+
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestHttpContentExchange.java b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestHttpContentExchange.java
new file mode 100644
index 0000000..85118ce
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestHttpContentExchange.java
@@ -0,0 +1,234 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.roa.util.restclient;
+
+import org.openo.baseservice.remoteservice.exception.ServiceException;
+
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.jetty.client.ContentExchange;
+import org.eclipse.jetty.client.HttpDestination;
+import org.eclipse.jetty.http.HttpFields;
+import org.eclipse.jetty.http.HttpHeaders;
+import org.eclipse.jetty.io.Buffer;
+import org.eclipse.jetty.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.charset.Charset;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.zip.GZIPInputStream;
+
+/**
+ * ContentExchange implementation classe to provide access to response.
+ * <br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 28-May-2016
+ */
+public class RestHttpContentExchange extends ContentExchange {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(RestHttpContentExchange.class);
+
+ private boolean gzip = false;
+
+ private RestfulAsyncCallback callback = null;
+
+ /**
+ * Constructor<br/>
+ * <p>
+ * </p>
+ *
+ * @since SDNO 0.5
+ * @param cacheFields whether to cache response header.
+ * @param asyncCallback callback method.
+ */
+ RestHttpContentExchange(final boolean cacheFields, final RestfulAsyncCallback asyncCallback) {
+ super(cacheFields);
+ this.callback = asyncCallback;
+ }
+
+ /**
+ * Extract message.
+ * <br/>
+ *
+ * @param data GZipped data.
+ * @return Uncompressed data.
+ * @throws IOException
+ * @since SDNO 0.5
+ */
+ public String decompressGzipToStr(final byte[] data) throws IOException {
+ if(data == null) {
+ return "";
+ }
+ ByteArrayInputStream input = null;
+ GZIPInputStream gzis = null;
+ InputStreamReader reader = null;
+ final StringBuilder out = new StringBuilder();
+ try {
+ input = new ByteArrayInputStream(data);
+ gzis = new GZIPInputStream(input);
+ reader = new InputStreamReader(gzis, Charset.forName(RestfulClientConst.ENCODING));
+ final char[] buff = new char[1024];
+ for(int n; (n = reader.read(buff)) != -1;) {
+ out.append(new String(buff, 0, n));
+ }
+ } finally {
+ if(reader != null) {
+ try {
+ reader.close();
+ } catch(final IOException e) {
+ LOGGER.error("decompress Gzip reader exception:", e);
+ }
+ }
+ if(gzis != null) {
+ try {
+ gzis.close();
+ } catch(final IOException e) {
+ LOGGER.error("decompress Gzip exception:", e);
+ }
+ }
+ if(input != null) {
+ try {
+ input.close();
+ } catch(final IOException e) {
+ LOGGER.error("decompress Gzip input exception:", e);
+ }
+ }
+ }
+ return out.toString();
+
+ }
+
+ /**
+ * View response headers Content-Encoding values if you need to extract data.<br/>
+ *
+ * @param name buffer
+ * @param value value
+ * @throws IOException
+ * @since SDNO 0.5
+ */
+ @Override
+ protected synchronized void onResponseHeader(final Buffer name, final Buffer value) throws IOException {
+ super.onResponseHeader(name, value);
+ final int header = HttpHeaders.CACHE.getOrdinal(name);
+ if(header == HttpHeaders.CONTENT_ENCODING_ORDINAL) {
+ final String encoding = StringUtil.asciiToLowerCase(value.toString());
+ gzip = encoding != null && StringUtils.contains(encoding, "gzip");
+ }
+
+ }
+
+ @Override
+ protected void onResponseComplete() throws IOException {
+ if(LOGGER.isInfoEnabled()) {
+ LOGGER.info("Response has Complete:" + "path:" + this.getRequestURI().replace("\n", "0x0A"));
+ }
+ super.onResponseComplete();
+ if(callback != null) {
+ final RestfulResponse rsp = getResponse();
+ callback.callback(rsp);
+ }
+ }
+
+ @Override
+ protected void onRequestCommitted() throws IOException {
+ if(LOGGER.isInfoEnabled()) {
+ LOGGER.info("Request Header has been send:" + "path:" + this.getRequestURI().replace("\n", "0x0A"));
+ }
+ super.onRequestCommitted();
+ }
+
+ @Override
+ protected void onRequestComplete() throws IOException {
+ if(LOGGER.isInfoEnabled()) {
+ LOGGER.info("Request has bend send complete:" + "path:" + this.getRequestURI().replace("\n", "0x0A"));
+ }
+ super.onRequestComplete();
+ }
+
+ @Override
+ protected void onException(final Throwable x) {
+ LOGGER.warn("onException:", x);
+ super.onException(x);
+ if(callback != null) {
+ callback.handleExcepion(x);
+ }
+ }
+
+ @Override
+ protected void onConnectionFailed(final Throwable x) {
+ LOGGER.warn("onConnectionFailed:", x);
+ super.onConnectionFailed(x);
+ if(callback != null) {
+ callback.handleExcepion(x);
+ }
+
+ }
+
+ @Override
+ protected void expire(final HttpDestination destination) {
+ super.expire(destination);
+ if(callback != null) {
+ callback.handleExcepion(new ServiceException("request is expired, status:" + toState(getStatus())));
+ }
+ }
+
+ public boolean isGzip() {
+ return gzip;
+ }
+
+ /**
+ * Get the response as RestfulResponse.
+ * <br/>
+ *
+ * @return response object.
+ * @throws IOException
+ * @since SDNO 0.5
+ */
+ public RestfulResponse getResponse() throws IOException {
+ final RestfulResponse rsp = new RestfulResponse();
+ rsp.setStatus(this.getResponseStatus());
+ if(isGzip()) {
+ final String responseString = decompressGzipToStr(getResponseContentBytes());
+ rsp.setResponseJson(responseString);
+ } else {
+ rsp.setResponseJson(this.getResponseContent());
+ }
+
+ final HttpFields field = this.getResponseFields();
+ if(field != null) {
+ final Map<String, String> header = new HashMap<>();
+
+ final Enumeration<String> names = field.getFieldNames();
+ for(final Enumeration<String> e = names; e.hasMoreElements();) {
+ final String fieldName = e.nextElement();
+ final String fieldValue = field.getStringField(fieldName);
+ header.put(fieldName, fieldValue);
+ }
+
+ rsp.setRespHeaderMap(header);
+ }
+ return rsp;
+ }
+
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/Restful.java b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/Restful.java
new file mode 100644
index 0000000..7a7c11e
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/Restful.java
@@ -0,0 +1,298 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.roa.util.restclient;
+
+import org.openo.baseservice.remoteservice.exception.ServiceException;
+
+/**
+ * ReSTful method interface.<br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 28-May-2016
+ */
+public interface Restful {
+
+ /**
+ * Http GET method.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: query parameters.
+ * @return response.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ RestfulResponse get(String servicePath, RestfulParametes restParametes) throws ServiceException;
+
+ /**
+ * Http HEAD method.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @param options: request options.
+ * @return response.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ RestfulResponse head(String servicePath, RestfulParametes restParametes, RestfulOptions options)
+ throws ServiceException;
+
+ /**
+ * Http HEAD method.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @return response.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ RestfulResponse head(String servicePath, RestfulParametes restParametes) throws ServiceException;
+
+ /**
+ * Http GET method.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @param options: request options.
+ * @return response.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ RestfulResponse get(String servicePath, RestfulParametes restParametes, RestfulOptions options)
+ throws ServiceException;
+
+ /**
+ * Asynchronouse GET request.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @param callback: response callback method.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ void asyncGet(String servicePath, RestfulParametes restParametes, RestfulAsyncCallback callback)
+ throws ServiceException;
+
+ /**
+ * Asynchronouse GET request.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @param options: request options.
+ * @param callback: response callback method.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ void asyncGet(String servicePath, RestfulParametes restParametes, RestfulOptions options,
+ RestfulAsyncCallback callback) throws ServiceException;
+
+ /**
+ * Http PUT method.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @return response.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ RestfulResponse put(String servicePath, RestfulParametes restParametes) throws ServiceException;
+
+ /**
+ * Http PUT method.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @param options: request options.
+ * @return response.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ RestfulResponse put(String servicePath, RestfulParametes restParametes, RestfulOptions options)
+ throws ServiceException;
+
+ /**
+ * Asynchronouse PUT request.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @param callback: response callback method.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ void asyncPut(String servicePath, RestfulParametes restParametes, RestfulAsyncCallback callback)
+ throws ServiceException;
+
+ /**
+ * Asynchronouse PUT request.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @param options: request options.
+ * @param callback: response callback method.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ void asyncPut(String servicePath, RestfulParametes restParametes, RestfulOptions options,
+ RestfulAsyncCallback callback) throws ServiceException;
+
+ /**
+ * Http POST method.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @return response.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ RestfulResponse post(String servicePath, RestfulParametes restParametes) throws ServiceException;
+
+ /**
+ * Http POST method.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @param options: request options.
+ * @return response.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ RestfulResponse post(String servicePath, RestfulParametes restParametes, RestfulOptions options)
+ throws ServiceException;
+
+ /**
+ * Asynchronouse POST request.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @param callback: response callback method.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ void asyncPost(String servicePath, RestfulParametes restParametes, RestfulAsyncCallback callback)
+ throws ServiceException;
+
+ /**
+ * Asynchronouse POST request.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @param options: request options.
+ * @param callback: response callback method.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ void asyncPost(String servicePath, RestfulParametes restParametes, RestfulOptions options,
+ RestfulAsyncCallback callback) throws ServiceException;
+
+ /**
+ * Http DELETE method.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @return response.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ RestfulResponse delete(String servicePath, RestfulParametes restParametes) throws ServiceException;
+
+ /**
+ * Http DELETE method.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @param options: request options.
+ * @return response.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ RestfulResponse delete(String servicePath, RestfulParametes restParametes, RestfulOptions options)
+ throws ServiceException;
+
+ /**
+ * Asynchronouse DELETE request.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @param callback: response callback method.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ void asyncDelete(String servicePath, RestfulParametes restParametes, RestfulAsyncCallback callback)
+ throws ServiceException;
+
+ /**
+ * Asynchronouse DELETE request.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @param options: request options.
+ * @param callback: response callback method.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ void asyncDelete(String servicePath, RestfulParametes restParametes, RestfulOptions options,
+ RestfulAsyncCallback callback) throws ServiceException;
+
+ /**
+ * Http PATCH method.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @return response.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ RestfulResponse patch(String servicePath, RestfulParametes restParametes) throws ServiceException;
+
+ /**
+ * Http PATCH method.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @param options: request options.
+ * @return response.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ RestfulResponse patch(String servicePath, RestfulParametes restParametes, RestfulOptions options)
+ throws ServiceException;
+
+ /**
+ * Asynchronouse PATCH request.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @param callback: response callback method.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ void asyncPatch(String servicePath, RestfulParametes restParametes, RestfulAsyncCallback callback)
+ throws ServiceException;
+
+ /**
+ * Asynchronouse PATCH request.<br/>
+ *
+ * @param servicePath: request path.
+ * @param restParametes: request parameters.
+ * @param options: request options.
+ * @param callback: response callback method.
+ * @throws ServiceException
+ * @since SDNO 0.5
+ */
+ void asyncPatch(String servicePath, RestfulParametes restParametes, RestfulOptions options,
+ RestfulAsyncCallback callback) throws ServiceException;
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulAsyncCallback.java b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulAsyncCallback.java
new file mode 100644
index 0000000..bf11c16
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulAsyncCallback.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.roa.util.restclient;
+
+/**
+ * Callback interface for ReST calls.<br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 28-May-2016
+ */
+public interface RestfulAsyncCallback {
+
+ /**
+ * Response callback.<br/>
+ *
+ * @param response: response of ReST call.
+ * @since SDNO 0.5
+ */
+ void callback(RestfulResponse response);
+
+ /**
+ * Exceptoin callback.<br/>
+ *
+ * @param e: ReST call exception.
+ * @since SDNO 0.5
+ */
+ void handleExcepion(Throwable e);
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulClientConst.java b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulClientConst.java
new file mode 100644
index 0000000..ef02b7d
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulClientConst.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.roa.util.restclient;
+
+/**
+ * Constants for ReST client.<br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 28-May-2016
+ */
+public class RestfulClientConst {
+
+ /** -- json Ecode -- **/
+ public static final String APPLICATION_FORM_JSON_EBCIDED = "application/json";
+
+ /**
+ * urlencode
+ */
+ public static final String APPLICATION_FORM_URLENCODED = "application/x-www-form-urlencoded; charset=UTF-8";
+
+ public static final String ENCODING = "UTF-8";
+
+ public static final String SERVER_KEY_NAME = "defaulServer";
+
+ public static final String CALLED_SERVICE_NAME = "serviceName";
+
+ public static final String HOST_KEY_NAME = "host";
+
+ public static final String PORT_KEY_NAME = "port";
+
+ public static final String CONN_TIMEOUT_KEY_NAME = "ConnectTimeout";
+
+ public static final String THREAD_KEY_NAME = "thread";
+
+ public static final String IDLE_TIMEOUT_KEY_NAME = "idletimeout";
+
+ public static final String TIMEOUT_KEY_NAME = "timeout";
+
+ public static final String MAX_CONN_PER_ADDR_KEY_NAME = "maxConnectionPerAddr";
+
+ public static final String REQUEST_ID = "x-request-id";
+
+ public static final String MAX_RESPONSE_HEADER_SIZE = "responseHeaderSize";
+
+ public static final String MAX_REQUEST_HEADER_SIZE = "requestHeaderSize";
+
+ private RestfulClientConst() {
+
+ }
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulConfigure.java b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulConfigure.java
new file mode 100644
index 0000000..3d0a0ff
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulConfigure.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.roa.util.restclient;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+import org.openo.baseservice.roa.util.ReaderHelper;
+import org.openo.baseservice.util.impl.SystemEnvVariablesFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import net.sf.json.JSONObject;
+
+/**
+ * Rest client options.<br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 28-May-2016
+ */
+public class RestfulConfigure {
+
+ private static final Logger LOG = LoggerFactory.getLogger(RestfulConfigure.class);
+
+ private RestfulOptions options = null;
+
+ /**
+ * Constructor<br/>
+ * <p>
+ * Use the default path initialization http Rest options.
+ * </p>
+ *
+ * @since SDNO 0.5
+ */
+ public RestfulConfigure() {
+ final String config = "/etc/conf/restclient.json";
+ final String approot = SystemEnvVariablesFactory.getInstance().getAppRoot();
+ final StringBuilder extendSetting = new StringBuilder();
+
+ if(approot != null) {
+ extendSetting.append(approot);
+ extendSetting.append(config);
+ } else {
+ extendSetting.append(System.getProperty("user.dir"));
+ extendSetting.append(config);
+ }
+
+ final String configfile = extendSetting.toString();
+ initRestConf(configfile);
+ }
+
+ /**
+ * Constructor<br/>
+ * <p>
+ * Use the specified file to initialize http Rest options.
+ * </p>
+ *
+ * @since SDNO 0.5
+ * @param configfile
+ */
+ public RestfulConfigure(final String configfile) {
+ initRestConf(configfile);
+ }
+
+ public RestfulOptions getOptions() {
+ return options;
+ }
+
+ private void initRestConf(final String configfile) {
+ options = getDefaultOptions();
+
+ final JSONObject obj = loadJsonFromFile(configfile);
+ if(obj != null) {
+ if(obj.has(RestfulClientConst.SERVER_KEY_NAME)) {
+ final JSONObject server = obj.getJSONObject(RestfulClientConst.SERVER_KEY_NAME);
+ setStringOption(server, RestfulClientConst.HOST_KEY_NAME);
+ setIntOption(server, RestfulClientConst.PORT_KEY_NAME);
+ }
+ setIntOption(obj, RestfulClientConst.CONN_TIMEOUT_KEY_NAME);
+ setIntOption(obj, RestfulClientConst.THREAD_KEY_NAME);
+ setIntOption(obj, RestfulClientConst.IDLE_TIMEOUT_KEY_NAME);
+ setIntOption(obj, RestfulClientConst.TIMEOUT_KEY_NAME);
+ setIntOption(obj, RestfulClientConst.MAX_CONN_PER_ADDR_KEY_NAME);
+ setIntOption(obj, RestfulClientConst.MAX_RESPONSE_HEADER_SIZE);
+ setIntOption(obj, RestfulClientConst.MAX_REQUEST_HEADER_SIZE);
+ } else {
+ LOG.error("failed to load json from " + configfile);
+ }
+ }
+
+ private void setStringOption(final JSONObject json, final String key) {
+ if(json.has(key)) {
+ options.setOption(key, json.getString(key));
+ }
+ }
+
+ private void setIntOption(final JSONObject json, final String key) {
+ if(json.has(key)) {
+ options.setOption(key, json.getInt(key));
+ }
+ }
+
+ private RestfulOptions getDefaultOptions() {
+ options = new RestfulOptions();
+ options.setOption(RestfulClientConst.CONN_TIMEOUT_KEY_NAME, 3000);
+ options.setOption(RestfulClientConst.THREAD_KEY_NAME, 200);
+ options.setOption(RestfulClientConst.IDLE_TIMEOUT_KEY_NAME, 30000);
+ options.setOption(RestfulClientConst.TIMEOUT_KEY_NAME, 30000);
+ options.setOption(RestfulClientConst.MAX_CONN_PER_ADDR_KEY_NAME, 50);
+ options.setOption(RestfulClientConst.MAX_RESPONSE_HEADER_SIZE, 20 * 1024);
+ options.setOption(RestfulClientConst.MAX_REQUEST_HEADER_SIZE, 20 * 1024);
+ return options;
+ }
+
+ private JSONObject loadJsonFromFile(final String filePath) {
+ final File file = new File(filePath);
+ if((!file.exists()) || (!file.isFile())) {
+ LOG.error(filePath + "isn't exist.");
+ return null;
+ }
+ BufferedReader reader = null;
+ final StringBuilder jsonstr = new StringBuilder();
+ JSONObject jo = null;
+ try {
+ reader = new BufferedReader(new FileReader(file));
+ final ReaderHelper rHelpper = new ReaderHelper(reader);
+ String tempString = null;
+ while((tempString = rHelpper.getLine()) != null) {
+ jsonstr.append(tempString);
+ }
+ jo = JSONObject.fromObject(jsonstr.toString());
+ } catch(final IOException e) {
+ LOG.error("load file exception:" + e);
+ } finally {
+ if(reader != null) {
+ try {
+ reader.close();
+ } catch(final IOException e) {
+ LOG.error("close error.", e);
+ }
+ }
+ }
+ return jo;
+ }
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulFactory.java b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulFactory.java
new file mode 100644
index 0000000..e53bab1
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulFactory.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.roa.util.restclient;
+
+import org.openo.baseservice.remoteservice.exception.ServiceException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * RestFul instance factory. <br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 28-May-2016
+ */
+public class RestfulFactory {
+
+ /**
+ * https protocol.
+ */
+ public static final String PROTO_HTTPS = "https";
+
+ /**
+ * http protocol.
+ */
+ public static final String PROTO_HTTP = "http";
+
+ private static final Logger LOG = LoggerFactory.getLogger(RestfulFactory.class);
+
+ private static final Map<String, Restful> INSTANCES = new HashMap<>(2);
+
+ private RestfulFactory() {
+
+ }
+
+ /**
+ * Get RESTful instance. This method returns a singleton instance.
+ * <br/>
+ *
+ * @param protocol protocol. currently only support 'http'.
+ * @return restful instance.
+ * @since SDNO 0.5
+ */
+ public static synchronized Restful getRestInstance(final String protocol) {
+ Restful rest = INSTANCES.get(protocol);
+ if(rest != null) {
+ return rest;
+ }
+ if(PROTO_HTTP.equals(protocol)) {
+ rest = createHttpRest();
+ INSTANCES.put(protocol, rest);
+ }
+ return rest;
+ }
+
+ private static Restful createHttpRest() {
+ final HttpRest rest = new HttpRest();
+ setRestOption(rest, null);
+ return rest;
+ }
+
+ private static void setRestOption(final HttpRest rest, final String restoptionfile) {
+ try {
+ RestfulConfigure config;
+ if(restoptionfile == null || restoptionfile.isEmpty()) {
+ config = new RestfulConfigure();
+ } else {
+ config = new RestfulConfigure(restoptionfile);
+ }
+
+ final RestfulOptions option = config.getOptions();
+ rest.initHttpRest(option);
+ } catch(final ServiceException e) {
+ LOG.error("init http client exception: ", e);
+ }
+ }
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulOptions.java b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulOptions.java
new file mode 100644
index 0000000..912abf5
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulOptions.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.roa.util.restclient;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Options for Rest communication.<br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 28-May-2016
+ */
+public class RestfulOptions {
+
+ public static final String REST_OPTIONS_NAME_TIMEOUT = "timeout";
+
+ public static final int REST_OPTIONS_TIMEOUT_MAXTIMEOUT = 1800000;
+
+ private final Map<String, Object> optionsMap = new HashMap<>();
+
+ /**
+ * Set called service name.<br/>
+ *
+ * @param serviceName service name.
+ * @return true.
+ * @since SDNO 0.5
+ */
+ public boolean setCalledServiceName(final String serviceName) {
+ this.setOption(RestfulClientConst.CALLED_SERVICE_NAME, serviceName);
+ return true;
+ }
+
+ /**
+ * Get called service name.<br/>
+ *
+ * @return
+ * @since SDNO 0.5
+ */
+ public String getCalledServicName() {
+ final Object obj = this.getOption(RestfulClientConst.CALLED_SERVICE_NAME);
+ if(null == obj) {
+ return "";
+ }
+ return (String)obj;
+ }
+
+ /**
+ * Get port.<br/>
+ *
+ * @return port.
+ * @since SDNO 0.5
+ */
+ public int getPort() {
+ final Object obj = this.getOption(RestfulClientConst.PORT_KEY_NAME);
+ if(null == obj) {
+ return 0;
+ }
+ return ((Integer)obj).intValue();
+ }
+
+ /**
+ * Set port.<br/>
+ *
+ * @param port port to set.
+ * @return
+ * @since SDNO 0.5
+ */
+ public boolean setPort(final int port) {
+ this.setOption(RestfulClientConst.PORT_KEY_NAME, port);
+ return true;
+ }
+
+ /**
+ * Get host.<br/>
+ *
+ * @return the host.
+ * @since SDNO 0.5
+ */
+ public String getHost() {
+ final Object obj = this.getOption(RestfulClientConst.HOST_KEY_NAME);
+ if(null == obj) {
+ return "";
+ }
+ return (String)obj;
+ }
+
+ /**
+ * Set host.<br/>
+ *
+ * @param host host to set.
+ * @return
+ * @since SDNO 0.5
+ */
+ public boolean setHost(final String host) {
+ this.setOption(RestfulClientConst.HOST_KEY_NAME, host);
+ return true;
+ }
+
+ /**
+ * Set rest time-out.<br/>
+ *
+ * @param timeout time-out to set in seconds.
+ * @return
+ * @since SDNO 0.5
+ */
+ public boolean setRestTimeout(final int timeout) {
+ if(0 < timeout && REST_OPTIONS_TIMEOUT_MAXTIMEOUT >= timeout) {
+ this.setOption(REST_OPTIONS_NAME_TIMEOUT, timeout);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Get time-out.<br/>
+ *
+ * @return time-out in seconds.
+ * @since SDNO 0.5
+ */
+ public int getRestTimeout() {
+ final Object obj = this.getOption(REST_OPTIONS_NAME_TIMEOUT);
+ if(null == obj) {
+ return 0;
+ }
+ return ((Integer)obj).intValue();
+ }
+
+ /**
+ * Get specified option.<br/>
+ *
+ * @param optionName option name.
+ * @return option
+ * @since SDNO 0.5
+ */
+ public Object getOption(final String optionName) {
+ return optionsMap.get(optionName);
+ }
+
+ /**
+ * Get option value as integer.<br/>
+ *
+ * @param optionName option name.
+ * @return option value as int.
+ * @since SDNO 0.5
+ */
+ public int getIntOption(final String optionName) {
+ final Object obj = this.getOption(optionName);
+ if(null == obj) {
+ return 0;
+ }
+ return ((Integer)obj).intValue();
+ }
+
+ /**
+ * Get option value as string.<br/>
+ *
+ * @param optionName option name.
+ * @return option value as string.
+ * @since SDNO 0.5
+ */
+ public String getStringOption(final String optionName) {
+ final Object obj = this.getOption(optionName);
+ if(null == obj) {
+ return "";
+ }
+ return (String)obj;
+ }
+
+ /**
+ * Set option.<br/>
+ *
+ * @param option option name.
+ * @param optionsValue option value.
+ * @return
+ * @since SDNO 0.5
+ */
+ public Object setOption(final String option, final Object optionsValue) {
+ return optionsMap.put(option, optionsValue);
+ }
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulParametes.java b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulParametes.java
new file mode 100644
index 0000000..c6c5933
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulParametes.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.roa.util.restclient;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * <br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 Aug 9, 2016
+ */
+public class RestfulParametes {
+
+ private Map<String, String> paramMap = new HashMap<>();
+
+ private Map<String, String> headerMap = new HashMap<>();
+
+ private String rawData = null;
+
+ /**
+ * <br/>
+ *
+ * @param key
+ * @return
+ * @since SDNO 0.5
+ */
+ public String get(final String key) {
+ return paramMap.get(key);
+ }
+
+ /**
+ * <br/>
+ *
+ * @param data
+ * @since SDNO 0.5
+ */
+ public void setRawData(final String data) {
+ this.rawData = data;
+ }
+
+ /**
+ * <br/>
+ *
+ * @return
+ * @since SDNO 0.5
+ */
+ public String getRawData() {
+ return this.rawData;
+ }
+
+ /**
+ * <br/>
+ *
+ * @param key
+ * @param value
+ * @return
+ * @since SDNO 0.5
+ */
+ public String put(final String key, final String value) {
+ return paramMap.put(key, value);
+ }
+
+ /**
+ * <br/>
+ *
+ * @param key
+ * @param value
+ * @return
+ * @since SDNO 0.5
+ */
+ public String putHttpContextHeader(final String key, final String value) {
+ return headerMap.put(key, value);
+ }
+
+ /**
+ * <br/>
+ *
+ * @param key
+ * @param value
+ * @return
+ * @since SDNO 0.5
+ */
+ public String putHttpContextHeader(final String key, final int value) {
+ return this.putHttpContextHeader(key, String.valueOf(value));
+ }
+
+ /**
+ * <br/>
+ *
+ * @param key
+ * @return
+ * @since SDNO 0.5
+ */
+ public String getHttpContextHeader(final String key) {
+ return headerMap.get(key);
+ }
+
+ /**
+ * <br/>
+ *
+ * @return
+ * @since SDNO 0.5
+ */
+ public Map<String, String> getParamMap() {
+ return paramMap;
+ }
+
+ /**
+ * <br/>
+ *
+ * @param paramMap
+ * @since SDNO 0.5
+ */
+ public void setParamMap(final Map<String, String> paramMap) {
+ this.paramMap = paramMap;
+ }
+
+ /**
+ * <br/>
+ *
+ * @return
+ * @since SDNO 0.5
+ */
+ public Map<String, String> getHeaderMap() {
+ return this.headerMap;
+ }
+
+ /**
+ * <br/>
+ *
+ * @param headerMap
+ * @since SDNO 0.5
+ */
+ public void setHeaderMap(final Map<String, String> headerMap) {
+ this.headerMap = headerMap;
+ }
+}
diff --git a/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulResponse.java b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulResponse.java
new file mode 100644
index 0000000..28a0c6d
--- /dev/null
+++ b/rest-client/src/main/java/org/openo/baseservice/roa/util/restclient/RestfulResponse.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2016, Huawei Technologies Co., Ltd.
+ *
+ * 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 org.openo.baseservice.roa.util.restclient;
+
+import java.util.Map;
+
+/**
+ * Response for RestFul requests.<br/>
+ * <p>
+ * </p>
+ *
+ * @author
+ * @version SDNO 0.5 28-May-2016
+ */
+public class RestfulResponse {
+
+ private String responseContent;
+
+ private int status = -1;
+
+ private Map<String, String> respHeaderMap = null;
+
+ /**
+ * <br/>
+ *
+ * @return
+ * @since SDNO 0.5
+ */
+ public int getStatus() {
+ return status;
+ }
+
+ /**
+ * <br/>
+ *
+ * @param status
+ * @since SDNO 0.5
+ */
+ public void setStatus(final int status) {
+ this.status = status;
+ }
+
+ /**
+ * <br/>
+ *
+ * @return
+ * @since SDNO 0.5
+ */
+ public Map<String, String> getRespHeaderMap() {
+ return respHeaderMap;
+ }
+
+ /**
+ * <br/>
+ *
+ * @param header
+ * @since SDNO 0.5
+ */
+ public void setRespHeaderMap(final Map<String, String> header) {
+ this.respHeaderMap = header;
+ }
+
+ /**
+ * Get response header value as integer.<br/>
+ *
+ * @param key header param name.
+ * @return header param value as integer. (-1 if error)
+ * @since SDNO 0.5
+ */
+ public int getRespHeaderInt(final String key) {
+ if(respHeaderMap != null) {
+ final String result = respHeaderMap.get(key);
+ if(result != null) {
+ return Integer.parseInt(result);
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Get response header value as long.<br/>
+ *
+ * @param key header param name.
+ * @return value as long. -1 if no value.
+ * @since SDNO 0.5
+ */
+ public long getRespHeaderLong(final String key) {
+ if(respHeaderMap != null) {
+ final String result = respHeaderMap.get(key);
+ if(result != null) {
+ return Long.parseLong(result);
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Get http header as string.<br/>
+ *
+ * @param key header name.
+ * @return header value.
+ * @since SDNO 0.5
+ */
+ public String getRespHeaderStr(final String key) {
+ if(respHeaderMap != null) {
+ return respHeaderMap.get(key);
+ }
+ return null;
+ }
+
+ /**
+ * <br/>
+ *
+ * @return
+ * @since SDNO 0.5
+ */
+ public String getResponseContent() {
+ return responseContent;
+ }
+
+ /**
+ * <br/>
+ *
+ * @param responseString
+ * @since SDNO 0.5
+ */
+ public void setResponseJson(final String responseString) {
+ this.responseContent = responseString;
+ }
+}