package net.whydah.admin.auth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import java.io.StringReader;
import java.util.Date;
/**
* Loosely based upon code from Gunnar Skjold (Origin AS)
* @author Gunnar Skjold
* @author <a href="bard.lind@gmail.com">Bard Lind</a>
*/
@XmlRootElement(name = "applicationtoken")
public class WhydahLogonToken {
private static final Logger log = LoggerFactory.getLogger(WhydahLogonToken.class);
private WhydahTokenParams params;
protected WhydahLogonToken() {
}
@XmlElement(name = "params")
protected WhydahTokenParams getParams() {
if (params == null) {
setParams(new WhydahTokenParams());
}
return params;
}
protected void setParams(WhydahTokenParams params) {
this.params = params;
}
public String getApplicationtokenID() {
return getParams().getApplicationtokenID();
}
public String getApplicationid() {
return getParams().getApplicationid();
}
public String getApplicationname() {
return getParams().getApplicationname();
}
public Date getExpires() {
Date expires = getParams().getExpires();
if (expires == null) {
expires = new Date(0);
}
return expires;
}
public boolean isExpired() {
return params == null ? true : params.expires == null ? true : params.expires.before(new Date());
}
public static WhydahLogonToken fromXml(String logonResult) {
log.trace("Try to build xml from {}", logonResult);
WhydahLogonToken logonToken = new WhydahLogonToken();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
Document doc = documentBuilder.parse(new InputSource(new StringReader(logonResult)));
XPath xPath = XPathFactory.newInstance().newXPath();
String applicationtokenId = (String) xPath.evaluate("/applicationtoken/params/applicationtokenID", doc, XPathConstants.STRING);
logonToken.getParams().setApplicationtokenID(applicationtokenId);
String applicationid = (String) xPath.evaluate("/applicationtoken/params/applicationid", doc, XPathConstants.STRING);
logonToken.getParams().setApplicationid(applicationid);
String applicationName = (String) xPath.evaluate("/applicationtoken/params/applicationname", doc, XPathConstants.STRING);
logonToken.getParams().setApplicationname(applicationName);
String expires = (String ) xPath.evaluate("/applicationtoken/params/expires", doc, XPathConstants.STRING);
if (expires != null && !expires.isEmpty()) {
Long longDate = new Long(expires);
logonToken.getParams().setExpires(new Date(longDate));
}
//FIXME - applicatons
/*
<applications>
<application>
<appId>21</appId>
<applicationName>ReceiptControlAdmin</applicationName>
<orgName>Developer</orgName>
<roleName>ROLE_ADMIN</roleName>
<roleValue>1</roleValue>
</application>
</applications>
*/
} catch (Exception e) {
log.warn("Could not create an WhydahLogonToken from this xml {}", logonResult, e);
}
return logonToken;
}
public String toXml() {
return "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?> \n " +
" <applicationtoken>\n" +
" <params>\n" +
" <applicationtoken>" + params.getApplicationtokenID() + "</applicationtoken>\n" +
" <applicationid>" + params.getApplicationid() + "</applicationid>\n" +
" <applicationname>" + params.getApplicationname() + "</applicationname>\n" +
" <expires>" + params.getExpires().getTime() + "</expires>\n" +
" </params> \n" +
" </applicationtoken>\n";
}
private static class WhydahTokenParams {
private String applicationtokenID, applicationid, applicationname;
private Date expires;
public String getApplicationtokenID() {
return applicationtokenID;
}
public void setApplicationtokenID(String applicationtokenID) {
this.applicationtokenID = applicationtokenID;
}
public String getApplicationid() {
return applicationid;
}
public void setApplicationid(String applicationid) {
this.applicationid = applicationid;
}
public String getApplicationname() {
return applicationname;
}
public void setApplicationname(String applicationname) {
this.applicationname = applicationname;
}
public Date getExpires() {
return expires;
}
public void setExpires(Date expires) {
this.expires = expires;
}
}
}