package open.dolphin.delegater;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.logging.Level;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.client.ClientResponseContext;
import javax.ws.rs.client.ClientResponseFilter;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Cookie;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import open.dolphin.client.Dolphin;
import open.dolphin.exception.FirstCommitWinException;
import open.dolphin.project.Project;
import open.dolphin.util.HashUtil;
import org.apache.commons.io.IOUtils;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.jboss.resteasy.client.jaxrs.ResteasyClient;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
/**
* Bsiness Delegater のルートクラス。
*
* @author Kazushi Minagawa, Digital Globe, Inc.
*/
public class BusinessDelegater {
protected static final String UTF8 = "UTF-8";
protected static final String CAMMA = ",";
protected static final String DATE_TIME_FORMAT_REST = "yyyy-MM-dd HH:mm:ss";
protected static final String USER_NAME = "userName";
protected static final String PASSWORD = "password";
private static final String CLINET_UUID = "clientUUID";
protected ResteasyWebTarget getWebTarget(String path, String userName, String password) {
StringBuilder sb = new StringBuilder();
sb.append(Project.getBaseURI()).append(path);
String uri = sb.toString();
ResteasyClient client = new ResteasyClientBuilder().build();
client.register(new AuthHeadersRequestFilter(userName, HashUtil.MD5(password)));
client.register(new StatusChecker());
ResteasyWebTarget target = client.target(uri);
return target;
}
protected ResteasyWebTarget getWebTarget(String baseURI, String path, String userId, String password) {
StringBuilder sb = new StringBuilder();
sb.append(baseURI).append(path);
String uri = sb.toString();
ResteasyClient client = new ResteasyClientBuilder().build();
client.register(new AuthHeadersRequestFilter(userId, HashUtil.MD5(password)));
client.register(new StatusChecker());
ResteasyWebTarget target = client.target(uri);
return target;
}
protected ResteasyWebTarget getWebTarget(String path) {
StringBuilder sb = new StringBuilder();
sb.append(Project.getBaseURI()).append(path);
String uri = sb.toString();
ResteasyClient client = new ResteasyClientBuilder().build();
client.register(new AuthHeadersRequestFilter(Project.getUserModel().getUserId(), Project.getUserModel().getPassword()));
client.register(new StatusChecker());
ResteasyWebTarget target = client.target(uri);
return target;
}
protected ResteasyWebTarget getStamptreeWebTarget(String path) {
StringBuilder sb = new StringBuilder();
sb.append(Project.getBaseURI()).append(path);
String uri = sb.toString();
ResteasyClient client = new ResteasyClientBuilder().build();
client.register(new AuthHeadersRequestFilter(Project.getUserModel().getUserId(), Project.getUserModel().getPassword()));
// 先勝ち制御Filter
client.register(new FirstCommitWinChecker());
ResteasyWebTarget target = client.target(uri);
return target;
}
protected ResteasyWebTarget getWebTargetSubscribe(String path) {
StringBuilder sb = new StringBuilder();
sb.append(Project.getBaseURI()).append(path);
String uri = sb.toString();
ResteasyClient client = new ResteasyClientBuilder().build();
client.register(new AuthHeadersRequestFilterLong(Project.getUserModel().getUserId(), Project.getUserModel().getPassword()));
ResteasyWebTarget target = client.target(uri);
return target;
}
protected <T> T getEasy(String path, String userName, String password, String mediaType, Class<T> cls) {
ResteasyWebTarget target = getWebTarget(path, userName, password);
Cookie cookie = getProjectCookie(userName);
T t = cookie!=null ? target.request(mediaType).cookie(cookie).get(cls) : target.request(mediaType).get(cls);
return t;
}
private <T> T getEasy(String path, String mediaType, Class<T> cls) {
ResteasyWebTarget target = getWebTarget(path);
Cookie cookie = getProjectCookie(Project.getUserModel().getUserId());
T t = cookie!=null ? target.request(mediaType).cookie(cookie).get(cls) : target.request(mediaType).get(cls);
return t;
}
protected <T> T getEasyJson(String path, Class<T> cls) {
return this.getEasy(path, MediaType.APPLICATION_JSON, cls);
}
protected <T> T getEasyText(String path, Class<T> cls) {
return this.getEasy(path, MediaType.TEXT_PLAIN, cls);
}
protected <T> T postEasyJson(String path, byte[] data, Class<T> cls) {
ResteasyWebTarget target = getWebTarget(path);
Cookie cookie = getProjectCookie(Project.getUserModel().getUserId());
T t = cookie!=null ? target.request().cookie(cookie).post(Entity.json(data), cls) : target.request().post(Entity.json(data), cls);
return t;
}
protected <T> T postEasyText(String path, byte[] data, Class<T> cls) {
ResteasyWebTarget target = getWebTarget(path);
Cookie cookie = getProjectCookie(Project.getUserModel().getUserId());
T t = cookie!=null ? target.request().cookie(cookie).post(Entity.text(data), cls) : target.request().post(Entity.text(data), cls);
return t;
}
protected <T> T putEasyStampTree(String path, byte[] data, Class<T> cls) {
ResteasyWebTarget target = getStamptreeWebTarget(path);
Cookie cookie = getProjectCookie(Project.getUserModel().getUserId());
T t = cookie!=null ? target.request().cookie(cookie).put(Entity.json(data), cls) : target.request().put(Entity.json(data), cls);
return t;
}
protected <T> T putEasyJson(String path, byte[] data, Class<T> cls) {
ResteasyWebTarget target = getWebTarget(path);
Cookie cookie = getProjectCookie(Project.getUserModel().getUserId());
T t = cookie!=null ? target.request().cookie(cookie).put(Entity.json(data), cls) : target.request().put(Entity.json(data), cls);
return t;
}
protected <T> T putEasyJson(String path, String mediaType, byte[] data, Class<T> cls) {
ResteasyWebTarget target = getWebTarget(path);
Cookie cookie = getProjectCookie(Project.getUserModel().getUserId());
T t = cookie!=null ? target.request(mediaType).cookie(cookie).put(Entity.json(data), cls) : target.request(mediaType).put(Entity.json(data), cls);
return t;
}
protected <T> T putEasyText(String path, byte[] data, Class<T> cls) {
ResteasyWebTarget target = getWebTarget(path);
Cookie cookie = getProjectCookie(Project.getUserModel().getUserId());
T t = cookie!=null ? target.request().cookie(cookie).put(Entity.text(data), cls) : target.request().put(Entity.text(data), cls);
return t;
}
protected void deleteEasy(String path) {
ResteasyWebTarget target = getWebTarget(path);
Cookie cookie = getProjectCookie(Project.getUserModel().getUserId());
Response res = cookie!=null ? target.request().cookie(cookie).delete() : target.request().delete();
res.close();
}
protected <T> T deleteEasy(String path, Class<T> cls) {
ResteasyWebTarget target = getWebTarget(path);
Cookie cookie = getProjectCookie(Project.getUserModel().getUserId());
T t = cookie!=null ? target.request().cookie(cookie).delete(cls) : target.request().delete(cls);
return t;
}
protected Cookie getProjectCookie(String userId) {
// int index = userId.indexOf(":");
// try {
// String fid = userId.substring(0, index);
// String uid = userId.substring(index+1);
// StringBuilder sb = new StringBuilder();
// sb.append("facilityId=").append(fid);
// sb.append("&").append("userId=").append(uid);
// String value = sb.toString();
// Cookie cookie = new Cookie("comAuth", URLEncoder.encode(value, UTF8));
// return cookie;
// } catch (UnsupportedEncodingException ex) {
// ex.printStackTrace(System.err);
// }
return null;
}
protected class AuthHeadersRequestFilter implements ClientRequestFilter {
private final String userName;
private final String password;
public AuthHeadersRequestFilter(String userName, String password) {
this.userName = userName;
this.password = password;
}
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
requestContext.getHeaders().add(USER_NAME, userName);
requestContext.getHeaders().add(PASSWORD, password);
}
}
protected class AuthHeadersRequestFilterLong implements ClientRequestFilter {
private final String userName;
private final String password;
public AuthHeadersRequestFilterLong(String userName, String password) {
this.userName = userName;
this.password = password;
}
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
requestContext.getHeaders().add(USER_NAME, userName);
requestContext.getHeaders().add(PASSWORD, password);
requestContext.getHeaders().add(CLINET_UUID, Dolphin.getInstance().getClientUUID());
}
}
protected class StatusChecker implements ClientResponseFilter {
@Override
public void filter(ClientRequestContext crc, ClientResponseContext crc1) throws IOException {
int status = crc1.getStatus();
debug(status);
if (status/100!=2) {
String err = "HTTP error code : " + status;
throw new RuntimeException(err);
}
}
}
protected class FirstCommitWinChecker implements ClientResponseFilter {
@Override
public void filter(ClientRequestContext crc, ClientResponseContext crc1) throws IOException {
int status = crc1.getStatus();
debug(status);
if (status/100==2) {
return;
}
// Commons
String err = IOUtils.toString(crc1.getEntityStream(), UTF8);
// First Commit Win?
if (err!=null && err.contains("First Commit Win")) {
throw new FirstCommitWinException("First Commit Win Exception");
}
else {
String err2 = "HTTP error code : " + status;
throw new RuntimeException(err2);
}
}
}
protected ObjectMapper getSerializeMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.WRITE_NULL_MAP_VALUES, false);
mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
return mapper;
}
protected ObjectMapper getDeserializeMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper;
}
protected BufferedReader getReader(Response response) throws Exception {
InputStream in = response.readEntity(InputStream.class);
return new BufferedReader(new InputStreamReader(in,UTF8));
}
protected String getString(Response response) throws Exception {
String result = response.readEntity(String.class);
response.close();
return result;
}
protected void debug(int status, String entity) {
java.util.logging.Logger.getLogger(this.getClass().getName()).log(Level.FINE, "status = {0}", status);
java.util.logging.Logger.getLogger(this.getClass().getName()).fine(entity);
}
protected void debug(int status) {
java.util.logging.Logger.getLogger(this.getClass().getName()).log(Level.FINE, "HTTP status = {0}", status);
}
}