package com.telefonica.claudia.driver_mon; import java.io.IOException; import org.apache.log4j.Logger; import org.restlet.Client; import org.restlet.data.Protocol; import org.restlet.data.Reference; import org.restlet.data.Response; import org.restlet.resource.DomRepresentation; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import com.telefonica.claudia.smi.DataTypesUtils; import com.telefonica.claudia.smi.monitoring.MonitorException; import com.telefonica.claudia.smi.monitoring.bean.MeasureDescriptor; import com.telefonica.claudia.smi.monitoring.bean.MeasuredValue; import com.telefonica.claudia.smi.monitoring.bean.MeasuredValueFilter; import com.telefonica.claudia.smi.monitoring.bean.MeasuredValueList; public class TCloudMonitoringClient { private static Logger logger = Logger.getLogger(TCloudMonitoringClient.class); private Client client; public TCloudMonitoringClient() { client = new Client(Protocol.HTTP); } public MeasuredValueList getReplicaMeasure(String url, MeasuredValueFilter filter, MeasureDescriptor descriptor) throws MonitorException { Reference urlTask = new Reference(url); if (filter.getFrom()!=null) urlTask.addQueryParameter("from", DataTypesUtils.date2String(filter.getFrom().getTime())); if (filter.getTo()!=null) urlTask.addQueryParameter("to", DataTypesUtils.date2String(filter.getTo().getTime())); if (filter.getSamples()!=0) urlTask.addQueryParameter("samples", String.valueOf(filter.getSamples())); if (filter.getInterval()!=0) urlTask.addQueryParameter("interval", String.valueOf(filter.getInterval())); logger.debug("Asking for measures for veereplica at url: " + urlTask); Response response = client.get(urlTask); MeasuredValueList mvl = new MeasuredValueList(descriptor); switch (response.getStatus().getCode()) { case 401: // Unauthorized case 403: // Forbidden throw new MonitorException("Forbidden: " + response.getStatus().getDescription()); case 400: // Bad Request case 404: // Not found throw new MonitorException("Bad Request: " + response.getStatus().getDescription()); case 501: case 500: throw new MonitorException("Internal error: " + response.getStatus().getDescription()); case 202: case 201: case 200: try { DomRepresentation domR = response.getEntityAsDom(); domR.setNamespaceAware(true); Document responseXml = domR.getDocument(); NodeList samples = responseXml.getElementsByTagNameNS("*", "Sample"); for (int i=0; i< samples.getLength(); i++) { Element sample= (Element) samples.item(i); String units = DataTypesUtils.STANDARD_STORAGE_UNIT_DEFAULT; String date= sample.getAttribute("timestamp"); double convertedValue = Double.parseDouble(sample.getAttribute("value"))*DataTypesUtils.getStorageUnitConversion(units); MeasuredValue mv = new MeasuredValue(""+convertedValue, DataTypesUtils.string2Date(date), units); mvl.add(mv); } } catch (IOException e) { throw new MonitorException("I/O exception reading answer: " + response.getStatus().getDescription()); } catch (Throwable e) { throw new MonitorException("Internal error while decoding the answer: " + e.getMessage()); } } return mvl; } }