package jp.aegif.nemaki.util;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.core.MediaType;
import jp.aegif.nemaki.util.impl.PropertyManagerImpl;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
public class NemakiTokenManager {
Logger logger = Logger.getLogger(NemakiTokenManager.class);
private final String restEndpoint;
private Map<String, Token> tokenMap;
public NemakiTokenManager() {
tokenMap = new HashMap<String, Token>();
restEndpoint = getRestEndpoint();
}
public String register(String repositoryId, String userName, String password) {
String apiResult = null;
try {
Client c = Client.create();
c.setConnectTimeout(3 * 1000);
c.setReadTimeout(5 * 1000);
c.setFollowRedirects(Boolean.TRUE);
c.addFilter(new HTTPBasicAuthFilter(userName, password));
apiResult = c.resource(getRestUri(repositoryId)).path(userName + "/register")
.queryParam("app", "solr")
.accept(MediaType.APPLICATION_JSON_TYPE).get(String.class);
} catch (Exception e) {
logger.error("Cannot connect to Core REST API", e);
}
try {
if(apiResult == null){
throw new Exception();
}
JSONObject result = (JSONObject) new JSONParser().parse(apiResult);
if ("success".equals(result.get("status").toString())) {
JSONObject value = (JSONObject) result.get("value");
String token = value.get("token").toString();
long expiration = (Long) value.get("expiration");
tokenMap.put(userName, new Token(repositoryId, userName, token, expiration));
return token;
}
} catch (Exception e) {
logger.error("Cannot connect to Core REST API", e);
}
return null;
}
public String getOrRegister(String repositoryId, String userName, String password) {
String token = getStoredToken(userName);
if (StringUtils.isBlank(token)) {
return register(repositoryId, userName, password);
} else {
return token;
}
}
public String getStoredToken(String userName) {
Token token = tokenMap.get(userName);
if (token != null) {
if (token.getExpiration() < System.currentTimeMillis()) {
System.out.println(userName + ":basic auth token has expired");
return null;
} else {
return token.getToken();
}
} else {
return null;
}
}
private String getRestUri(String repositoryId){
return restEndpoint + "/repo/" + repositoryId + "/authtoken/";
}
private String getRestEndpoint() {
PropertyManager pm = new PropertyManagerImpl(StringPool.PROPERTIES_NAME);
String protocol = pm.readValue(PropertyKey.CMIS_SERVER_PROTOCOL);
String host = pm.readValue(PropertyKey.CMIS_SERVER_HOST);
String port = pm.readValue(PropertyKey.CMIS_SERVER_PORT);
String context = pm.readValue(PropertyKey.CMIS_SERVER_CONTEXT);
try {
URL url = new URL(protocol, host, Integer.parseInt(port), "");
return url.toString() + "/" + context + "/rest";
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
return null;
}
private class Token {
private String repositoryId;
private String userName;
private String token;
private long expiration;
public Token() {
}
public Token(String repositoryId, String userName, String token, long expiration) {
super();
this.userName = userName;
this.token = token;
this.expiration = expiration;
}
public String getRepositoryId() {
return repositoryId;
}
public void setRepositoryId(String repositoryId) {
this.repositoryId = repositoryId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public long getExpiration() {
return expiration;
}
public void setExpiration(long expiration) {
this.expiration = expiration;
}
}
}