package org.wxz.tools.oracle.protocol.util;
import java.io.File;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Map.Entry;
import org.wxz.tools.oracle.empty.util.EmptyUtil;
import org.wxz.tools.oracle.empty.util.NullUtil;
import org.wxz.tools.oracle.exception.print.util.ExceptionPrintUtil;
import org.wxz.tools.oracle.io.util.IOCloseUtil;
import org.wxz.tools.oracle.io.util.IOOpenUtil;
import org.wxz.tools.oracle.io.util.IOReadUtil;
import org.wxz.tools.oracle.protocol.callback.URLConnectionCallback;
import org.wxz.tools.oracle.protocol.callback.impl.IOReadCallbackImpl;
import org.wxz.tools.oracle.protocol.enumeration.ProtocolNameEnum;
import org.wxz.tools.oracle.protocol.http.util.HttpURLConnectionUtil;
import org.wxz.tools.oracle.protocol.https.util.HttpsURLConnectionUtil;
import org.wxz.tools.oracle.protocol.param.URLConnectionRequsetParam;
import org.wxz.tools.oracle.protocol.proxy.util.ProxyUtil;
/**
* 远程连接工具类
*
* @author XiongZhi.Wu 2018年1月24日
*/
public abstract class URLConnectionUtil {
/**
* 初始化
*
* @author XiongZhi.Wu 2018年1月24日
* @param uRLConnectionRequsetParam
* 远程连接请求参数
* @return
*/
public static URLConnection init(URLConnectionRequsetParam uRLConnectionRequsetParam) {
try {
URL url = new URL(uRLConnectionRequsetParam.getAddr());
return NullUtil.isNull(uRLConnectionRequsetParam.getProxyParam()) ? url.openConnection() : url.openConnection(ProxyUtil.initProxy(uRLConnectionRequsetParam.getProxyParam()));
} catch (Exception e) {
throw new RuntimeException(ExceptionPrintUtil.initExceptionPrintModel(e, “Init URL Connection Cause Exception.”));
}
}
/**
* 读取字节
*
* @author XiongZhi.Wu 2018年1月24日
* @param uRLConnectionRequsetParam
* 远程连接请求参数
* @return
*/
public static byte[] readByte(URLConnectionRequsetParam uRLConnectionRequsetParam) {
return (byte[]) readAll(uRLConnectionRequsetParam, new URLConnectionCallback() {
@Override
public Object service(URLConnection urlConnection, URLConnectionRequsetParam uRLConnectionRequsetParam) {
return receive(urlConnection);
}
});
}
/**
* 读取文本
*
* @author XiongZhi.Wu 2018年1月24日
* @param uRLConnectionRequsetParam
* 远程连接请求参数
* @return
*/
public static String readText(URLConnectionRequsetParam uRLConnectionRequsetParam) {
return (String) readAll(uRLConnectionRequsetParam, new URLConnectionCallback() {
@Override
public Object service(URLConnection urlConnection, URLConnectionRequsetParam uRLConnectionRequsetParam) {
return receive(urlConnection, uRLConnectionRequsetParam);
}
});
}
/**
* 读取全部
*
* @author XiongZhi.Wu 2018年1月24日
* @param uRLConnectionRequsetParam
* 远程连接请求参数
* @param urlConnectionCallback
* 远程连接回调接口
* @return
*/
public static Object readAll(URLConnectionRequsetParam uRLConnectionRequsetParam, URLConnectionCallback urlConnectionCallback) {
if (uRLConnectionRequsetParam.getAddr().contains(ProtocolNameEnum.HTTP.getValue() + "://")) {
return HttpURLConnectionUtil.readAll(uRLConnectionRequsetParam, urlConnectionCallback);
} else if (uRLConnectionRequsetParam.getAddr().contains(ProtocolNameEnum.HTTPS.getValue() + "://")) {
return HttpsURLConnectionUtil.readAll(uRLConnectionRequsetParam, urlConnectionCallback);
} else {
throw new RuntimeException(ExceptionPrintUtil.initExceptionPrintModel("No Such Protocol Cause Exception."));
}
}
/**
* 发送数据
*
* @author XiongZhi.Wu 2018年5月15日
* @param urlConnection
* 远程连接对象
* @param uRLConnectionRequsetParam
* 远程连接请求参数
*/
public static void send(URLConnection urlConnection, URLConnectionRequsetParam uRLConnectionRequsetParam) {
// 存在参数或者附件信息
if (EmptyUtil.isNotNull(uRLConnectionRequsetParam.getContent()) || EmptyUtil.isNotNull(uRLConnectionRequsetParam.getFiles())) {
// 定义分割线
String boundary = "----------" + System.currentTimeMillis() + "----------";
// 设置请求属性
urlConnection.setRequestProperty("content-type", "multipart/form-data;boundary=" + boundary);
// 输出流对象
OutputStream outputStream = null;
try {
// 实例输出流对象
outputStream = urlConnection.getOutputStream();
// 存在参数信息
if (EmptyUtil.isNotNull(uRLConnectionRequsetParam.getContent())) {
for (Entry<String, Object> entry : uRLConnectionRequsetParam.getContent().entrySet()) {
String key = entry.getKey();
if (EmptyUtil.isNull(key)) {
continue;
}
Object value = entry.getValue();
send(outputStream, "--" + boundary + "\r\n", uRLConnectionRequsetParam);
send(outputStream, "Content-Disposition:form-data;name=\"" + key + "\"\r\n\r\n", uRLConnectionRequsetParam);
send(outputStream, (NullUtil.isNull(value) ? "" : value) + "\r\n", uRLConnectionRequsetParam);
}
}
// 存在附件信息
if (EmptyUtil.isNotNull(uRLConnectionRequsetParam.getFiles())) {
for (Entry<String, File> entry : uRLConnectionRequsetParam.getFiles().entrySet()) {
String key = entry.getKey();
if (EmptyUtil.isNull(key)) {
continue;
}
File value = entry.getValue();
if (EmptyUtil.isNull(value)) {
continue;
}
send(outputStream, "--" + boundary + "\r\n", uRLConnectionRequsetParam);
send(outputStream, "Content-Disposition:form-data;name=\"" + key + "\";filename=\"" + value.getName() + "\"\r\n", uRLConnectionRequsetParam);
send(outputStream, "Content-Type:application/x-msdownload\r\n\r\n", uRLConnectionRequsetParam);
IOReadUtil.loopRead(IOOpenUtil.initFileInputStream(value), new IOReadCallbackImpl(outputStream));
send(outputStream, "\r\n", uRLConnectionRequsetParam);
}
}
// 分割线收尾
send(outputStream, "--" + boundary + "--\r\n", uRLConnectionRequsetParam);
} catch (Exception e) {
// 打印异常信息
throw new RuntimeException(ExceptionPrintUtil.initExceptionPrintModel(e, "Remote Read Send Param Cause Exception."));
} finally {
// 关闭输出流
IOCloseUtil.closeOutputStream(outputStream);
}
} else {
try {
// 打开连接
urlConnection.connect();
} catch (Exception e) {
throw new RuntimeException(ExceptionPrintUtil.initExceptionPrintModel(e, "UrlConnection To Connect Failure Cause Exception."));
}
}
}
/**
* 发送数据
*
* @author XiongZhi.Wu 2018年5月15日
* @param outputStream
* 输出流对象
* @param data
* 待发送数据
* @param uRLConnectionRequsetParam
* 远程连接请求参数
* @throws Exception
* 异常信息
*/
public static void send(OutputStream outputStream, String data, URLConnectionRequsetParam uRLConnectionRequsetParam) throws Exception {
outputStream.write(data.getBytes(uRLConnectionRequsetParam.getWriteCharsetName()));
}
/**
* 接收数据
*
* @author XiongZhi.Wu 2018年6月5日
* @param urlConnection
* 远程连接对象
* @return
*/
public static byte[] receive(URLConnection urlConnection) {
try {
return IOReadUtil.loopRead(IOOpenUtil.initBufferedInputStream(urlConnection.getInputStream()));
} catch (Exception e) {
throw new RuntimeException(ExceptionPrintUtil.initExceptionPrintModel(e, "Remote Read Receive Data Cause Exception."));
}
}
/**
* 接收数据
*
* @author XiongZhi.Wu 2018年6月5日
* @param urlConnection
* 远程连接对象
* @param uRLConnectionRequsetParam
* 远程连接请求参数
* @return
*/
public static String receive(URLConnection urlConnection, URLConnectionRequsetParam uRLConnectionRequsetParam) {
try {
return IOReadUtil.loopRead(IOOpenUtil.initBufferedReader(urlConnection.getInputStream(), uRLConnectionRequsetParam.getReadCharsetName()));
} catch (Exception e) {
throw new RuntimeException(ExceptionPrintUtil.initExceptionPrintModel(e, "Remote Read Receive Data Cause Exception."));
}
}
}