package melcoe.fedora.user;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import melcoe.fedora.util.DataUtils;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class UserServlet
extends HttpServlet {
private static final long serialVersionUID = 8591611806356037463L;
private static final Logger log = Logger.getLogger(UserServlet.class);
private static final String FEDORA_ATTRS_KEY =
"FEDORA_AUX_SUBJECT_ATTRIBUTES";
//private static final String ROLE_ATTR_KEY = "fedoraRole";
private DocumentBuilder documentBuilder = null;
@Override
public void init() throws ServletException {
try {
DocumentBuilderFactory documentBuilderFactory =
DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
documentBuilder = documentBuilderFactory.newDocumentBuilder();
} catch (ParserConfigurationException pce) {
log.error("Unable to initialise UserServlet: " + pce.getMessage(),
pce);
}
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userId = request.getRemoteUser();
if (userId == null) {
userId = "anonymous";
}
Map<String, Set<String>> subjectAttributes =
getSubjectAttributes(request);
Document doc = documentBuilder.newDocument();
doc.setXmlVersion("1.0");
Element root = doc.createElement("user");
root.setAttribute("id", userId);
doc.appendChild(root);
for (String attr : subjectAttributes.keySet()) {
Element attribute = doc.createElement("attribute");
attribute.setAttribute("name", attr);
root.appendChild(attribute);
for (String value : subjectAttributes.get(attr)) {
Element v = doc.createElement("value");
v.appendChild(doc.createTextNode(value));
attribute.appendChild(v);
}
}
byte[] output = null;
try {
output = DataUtils.format(doc).getBytes();
} catch (Exception e) {
log.error("Error obtaining user information: " + e.getMessage(), e);
}
response.setContentType("text/xml");
response.setContentLength(output.length);
OutputStream out = response.getOutputStream();
out.write(output);
out.flush();
out.close();
}
@SuppressWarnings("unchecked")
private Map<String, Set<String>> getSubjectAttributes(HttpServletRequest request) {
Map<String, Set<String>> subjectAttr = null;
subjectAttr =
(Map<String, Set<String>>) request
.getAttribute(FEDORA_ATTRS_KEY);
if (subjectAttr == null) {
subjectAttr = new HashMap<String, Set<String>>();
}
return subjectAttr;
}
}