package org.genedb.web.mvc.view;
import org.apache.log4j.Logger;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.web.servlet.View;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
/**
*
* A view for services, which will inspect the request URI for a trailing extension. Defaults to XML.
*
* @author gv1
*
*/
public class ServiceView implements View {
public static final String SERVICE_ROOT = "root";
private String contentType = "application/xml";
private static final Logger logger = Logger.getLogger(ServiceView.class);
@Override
public String getContentType() {
return contentType;
}
@Override
public void render(Map<String, ?> map, HttpServletRequest request, HttpServletResponse response) throws Exception {
String extension = getExtension(request);
logger.debug("using " + extension);
XStream xstream = null;
if (extension.equals("json")) {
contentType = "application/json";
JettisonMappedXmlDriver jmxd = new JettisonMappedXmlDriver();
xstream = new XStream(jmxd);
} else {
contentType = "application/xml";
xstream = new XStream();
}
xstream.autodetectAnnotations(true);
ResponseContainer responseContainer = new ResponseContainer();
for (String key : map.keySet())
{
Object value = map.get(key);
if (value instanceof BeanPropertyBindingResult)
continue;
responseContainer.addResult(value);
}
PrintWriter writer = response.getWriter();
String json = xstream.toXML(responseContainer);
writer.write(json);
}
/**
* Generates and appropriate extension based on the existing HTTP request.
*
* @param request
* @return
*/
private String getExtension(HttpServletRequest request) {
String uri = request.getRequestURI();
logger.debug("parsing uri: " + uri);
String extension = "xml";
if (uri.endsWith(".json")) {
extension = "json";
}
return extension;
}
}
@XStreamAlias("response")
class ResponseContainer
{
@XStreamImplicit()
private List<Object> results = new ArrayList<Object>();
public void addResult(Object result)
{
results.add(result);
}
}