001 package org.hackystat.telemetry.service.resource.chart; 002 003 import java.io.StringWriter; 004 005 import javax.xml.bind.JAXBContext; 006 import javax.xml.bind.Marshaller; 007 import javax.xml.parsers.DocumentBuilder; 008 import javax.xml.parsers.DocumentBuilderFactory; 009 import javax.xml.transform.Transformer; 010 import javax.xml.transform.TransformerFactory; 011 import javax.xml.transform.dom.DOMSource; 012 import javax.xml.transform.stream.StreamResult; 013 014 import org.hackystat.telemetry.service.resource.chart.jaxb.TelemetryChartIndex; 015 import org.hackystat.telemetry.service.resource.chart.jaxb.TelemetryChartRef; 016 import org.hackystat.telemetry.analyzer.configuration.jaxb.TelemetryDefinition; 017 import org.hackystat.telemetry.service.resource.telemetry.TelemetryResource; 018 import org.restlet.Context; 019 import org.restlet.data.MediaType; 020 import org.restlet.data.Request; 021 import org.restlet.data.Response; 022 import org.restlet.resource.Representation; 023 import org.restlet.resource.Variant; 024 import org.w3c.dom.Document; 025 026 /** 027 * Processes GET {host}/charts and returns a TelemetryChartIndex representation. 028 * Requires the authenticated user to be {email} or else the Admin user for the sensorbase connected 029 * to this service. 030 * 031 * @author Philip Johnson 032 */ 033 public class ChartsResource extends TelemetryResource { 034 035 /** 036 * The standard constructor. 037 * 038 * @param context The context. 039 * @param request The request object. 040 * @param response The response object. 041 */ 042 public ChartsResource(Context context, Request request, Response response) { 043 super(context, request, response); 044 } 045 046 /** 047 * Returns a TelemetryChartIndex instance providing pointers to all defined Charts. 048 * 049 * @param variant The representational variant requested. 050 * @return The representation. 051 */ 052 @Override 053 public Representation represent(Variant variant) { 054 try { 055 if (variant.getMediaType().equals(MediaType.TEXT_XML)) { 056 TelemetryChartIndex index = new TelemetryChartIndex(); 057 for (TelemetryDefinition definition : this.getTelemetryDefinitions()) { 058 if (definition.getDefinitionType().equalsIgnoreCase("Chart")) { 059 TelemetryChartRef ref = new TelemetryChartRef(); 060 ref.setName(definition.getName()); 061 ref.setHref(this.telemetryServer.getHostName() + "chart/" + definition.getName()); 062 index.getTelemetryChartRef().add(ref); 063 } 064 } 065 return super.getStringRepresentation(makeChartIndexXml(index)); 066 } 067 } 068 catch (Exception e) { 069 setStatusError("Error getting chart definitions", e); 070 return null; 071 } 072 // Shouldn't ever get here. 073 return null; 074 } 075 076 /** 077 * Returns the passed TelemetryChart instance as a String encoding of its XML representation. 078 * 079 * @param index The SensorData instance. 080 * @return The XML String representation. 081 */ 082 private String makeChartIndexXml(TelemetryChartIndex index) { 083 StringWriter writer = new StringWriter(); 084 try { 085 JAXBContext jaxbContext = JAXBContext 086 .newInstance(org.hackystat.telemetry.service.resource.chart.jaxb.ObjectFactory.class); 087 Marshaller marshaller = jaxbContext.createMarshaller(); 088 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 089 dbf.setNamespaceAware(true); 090 DocumentBuilder documentBuilder = dbf.newDocumentBuilder(); 091 Document doc = documentBuilder.newDocument(); 092 marshaller.marshal(index, doc); 093 DOMSource domSource = new DOMSource(doc); 094 StreamResult result = new StreamResult(writer); 095 TransformerFactory tf = TransformerFactory.newInstance(); 096 Transformer transformer = tf.newTransformer(); 097 transformer.transform(domSource, result); 098 } 099 catch (Exception e) { 100 System.out.println(e); 101 } 102 return writer.toString(); 103 } 104 105 106 }