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

com.dounine.clouddisk360.parser.BaseParser Maven / Gradle / Ivy

package com.dounine.clouddisk360.parser;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpRequest;
import org.apache.http.client.CookieStore;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.HttpClients;

import com.dounine.clouddisk360.exception.CloudDiskException;
import com.dounine.clouddisk360.parser.deserializer.BaseConst;
import com.dounine.clouddisk360.parser.deserializer.BaseDes;
import com.dounine.clouddisk360.parser.deserializer.BaseParameter;
import com.dounine.clouddisk360.parser.deserializer.BaseRequestInterceptor;
import com.dounine.clouddisk360.parser.deserializer.MsgConst;
import com.dounine.clouddisk360.parser.deserializer.login.LoginUserToken;
import com.dounine.clouddisk360.pool.PoolingHttpClientConnection;
import com.dounine.clouddisk360.store.CookieStoreUT;

public abstract class BaseParser, ResponseHandle>
		extends JSONBianary {

	protected CookieStoreUT cookieStoreUT = new CookieStoreUT();
	protected HttpClientContext httpClientContext = new HttpClientContext();
	protected HttpClient httpClient = HttpClients.createDefault();

	public RequestInterceptor requestInterceptor;
	public C CONST;
	public HttpRequest requestMethod;
	public ResponseHandler responseHandler;
	public Parameter parameter;
	protected String uriPath;
	protected LoginUserToken loginUserToken;

	@SuppressWarnings("unchecked")
	private void inits() {
		Type genType = getClass().getGenericSuperclass();
		Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
		Class requestInterceptorClazz = (Class) params[4];
		Class> responseHandlerClazz = (Class>) params[5];
		Class requestMethodClazz = (Class) params[0];
		Class baseconstMethodClazz = (Class) params[2];
		try {
			this.responseHandler = (ResponseHandler) responseHandlerClazz.getConstructors()[0].newInstance(this);
			this.requestInterceptor = (RequestInterceptor) requestInterceptorClazz.getConstructors()[0].newInstance();
			this.requestMethod = (HttpRequest) requestMethodClazz.newInstance();
			CONST = (C) baseconstMethodClazz.newInstance();
		} catch (InstantiationException | IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}

	public BaseParser() {
		inits();
	}

	public BaseParser(LoginUserToken loginUser) {
		if (null == loginUserToken) {
			if (StringUtils.isBlank(loginUser.getAccount())) {
				throw new CloudDiskException("loginUserToken不能为空");
			}
		}
		super.setLoginUserToken(loginUser);// jsonbianary
		cookieStoreUT.setLoginUserToken(loginUser);
		httpClientContext.setUserToken(loginUser);
		this.loginUserToken = loginUser;
		inits();
	}

	/**
	 * 把parse数据平滑过来
	 */
	public void dataSmooth(Object parse) {
		if (null != parse) {
			BaseParser bp = ((BaseParser) parse);
			this.httpClientContext = bp.httpClientContext;
			if (null == loginUserToken) {
				if (StringUtils.isBlank(bp.loginUserToken.getAccount())) {
					throw new CloudDiskException("loginUserToken不能为空");
				}
			}
			super.setLoginUserToken(bp.loginUserToken);// jsonbianary
			cookieStoreUT.setLoginUserToken(bp.loginUserToken);
			httpClientContext.setUserToken(bp.loginUserToken);
			this.loginUserToken = bp.loginUserToken;
		} else {
			throw new CloudDiskException("数据平滑失败");
		}
	}

	public M parse() {
		if (null == loginUserToken) {
			throw new CloudDiskException("至少给一个解析器初始化用户信息");
		}
		Method request = initRequest(parameter);
		M m = execute(request);
		cookieStoreUT.setCookieStore(httpClientContext.getCookieStore());
		return m;
	}

	public M parse(Parameter parameter) {
		this.parameter = parameter;
		return parse();
	}

	public String getUriPath() {
		return null;
	}

	@SuppressWarnings("unchecked")
	public Method initRequest(Parameter parameter) {
		uriPath = getUriPath();
		if (StringUtils.isNotBlank(uriPath)) {
			if (requestMethod instanceof HttpGet) {
				return (Method) new HttpGet(getRequestHost() + uriPath);
			}
			return (Method) new HttpPost(getRequestHost() + uriPath);
		}
		throw new CloudDiskException("使用默认initRequest,uriPath不能为空");
	}

	protected RequestConfig cookieRequestConfig() {
		RequestConfig config = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT).build();
		return config;
	}

	protected RequestConfig cookieRequestConfig(String cookieSpecs) {
		return RequestConfig.custom().setCookieSpec(cookieSpecs).build();
	}

	public M execute(Method request) {
		httpClient = HttpClients.custom().setConnectionManager(PoolingHttpClientConnection.getInstalce())
				.addInterceptorLast(requestInterceptor).setDefaultRequestConfig(cookieRequestConfig()).build();
		try {
			if (request instanceof HttpGet) {
				HttpGet get = (HttpGet) request;
				return httpClient.execute(get, responseHandler, this.httpClientContext);
			}
			HttpPost post = (HttpPost) request;
			return httpClient.execute(post, responseHandler, this.httpClientContext);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	public String readCookieStoreValue(String name) {
		if (StringUtils.isBlank(name)) {
			throw new CloudDiskException("cookie名称不能为空");
		}
		CookieStore cookieStore = httpClientContext.getCookieStore();
		List cookies = cookieStore.getCookies();
		Cookie cookie = null;
		for (Cookie coo : cookies) {
			if (coo.getName().equals(name)) {
				cookie = coo;
				break;
			}
		}
		if (null != cookie) {
			return cookie.getValue();
		}
		return null;
	}

	public CookieStore readCookieStoreDisk() {
		httpClientContext.setCookieStore(cookieStoreUT.readCookieStoreForDisk());
		return httpClientContext.getCookieStore();
	}

	public CookieStore readCookieStoreDisk(String[] filterCookie) {
		httpClientContext.setCookieStore(cookieStoreUT.readCookieStoreForDisk(filterCookie));
		return httpClientContext.getCookieStore();
	}

	public HttpClientContext getHttpClientContext() {
		return httpClientContext;
	}

	public void setHttpClientContext(HttpClientContext httpContext) {
		this.httpClientContext = httpContext;
	}

	public CookieStoreUT getCookieStoreUT() {
		return cookieStoreUT;
	}

	public Parameter getParameter() {
		return parameter;
	}

	public void setParameter(Parameter parameter) {
		this.parameter = parameter;
	}

	public String getRequestHostName() {
		if (null == httpClientContext.getAttribute(BaseConst.REQUEST_HOST_NAME)) {
			throw new CloudDiskException(MsgConst.HOST_VALUE_NOT_NULL);
		} else {
			return String.valueOf(httpClientContext.getAttribute(BaseConst.REQUEST_HOST_NAME));
		}
	}

	public String getRequestHost() {
		if (null == httpClientContext.getAttribute(BaseConst.REQUEST_HOST_NAME)) {
			throw new CloudDiskException(MsgConst.HOST_VALUE_NOT_NULL);
		} else {
			return String.valueOf("http://" + httpClientContext.getAttribute(BaseConst.REQUEST_HOST_NAME));
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy