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    }