org.ebayopensource.turmeric.monitoring.client.model.MetricsQueryServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.ebayopensource.turmeric.monitoring.client.model.MetricsQueryServiceImpl.java

Source

/*******************************************************************************
 * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at 
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *******************************************************************************/
package org.ebayopensource.turmeric.monitoring.client.model;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.ebayopensource.turmeric.monitoring.client.ConsoleUtil;

import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.http.client.URL;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;

/**
 * MetricsQueryServiceImpl
 * 
 * Talks to a remote server that can supply SOAMetricsQueryService wsdl.
 * 
 * At the time of writing, turmeric does not support JSONP, so the remote server is in fact a proxy that talks tothe
 * SOAMetricsQueryService and returns the results.
 * 
 * Calls are made using a REST url (ie call is encoded in query params - referred to in documentation as "NV" style
 * invocation).
 * 
 * Data is returned as JSON.
 * 
 */
public class MetricsQueryServiceImpl extends AbstractConsoleService implements MetricsQueryService {
    private static Logger errorLogger = Logger.getLogger("errorLogger");

    /**
     * Instantiates a new metrics query service impl.
     */
    public MetricsQueryServiceImpl() {
        Map<String, String> config = ConsoleUtil.getConfig();
        if (config == null)
            return;

        String tmp = config.get("maxAggregationPeriod");
        if (tmp != null) {
            try {
                MetricCriteria.maxAggregationPeriod = Integer.valueOf(tmp).intValue();
            } catch (NumberFormatException e) {
                // log?
            }
        }

        tmp = config.get("medAggregationPeriod");
        if (tmp != null) {
            try {
                MetricCriteria.medAggregationPeriod = Integer.valueOf(tmp).intValue();
            } catch (NumberFormatException e) {
                // log?
            }
        }
        tmp = config.get("minAggregationPeriod");
        if (tmp != null) {
            try {
                MetricCriteria.minAggregationPeriod = Integer.valueOf(tmp).intValue();
            } catch (NumberFormatException e) {
                // log?
            }
        }
    }

    /**
     * Call the remote server to obtain metrics measurements.
     * 
     * @param criteria
     *            the criteria
     * @param resourceCriteria
     *            the resource criteria
     * @param callback
     *            the callback
     * @see org.ebayopensource.turmeric.monitoring.client.model.MetricsQueryService#getMetricData(org.ebayopensource.turmeric.monitoring.client.model.MetricCriteria,
     *      org.ebayopensource.turmeric.monitoring.client.model.MetricResourceCriteria,
     *      com.google.gwt.user.client.rpc.AsyncCallback)
     */
    public void getMetricData(final MetricCriteria criteria, final MetricResourceCriteria resourceCriteria,
            final AsyncCallback<MetricData> callback) {

        final String url = URL.encode(MetricsDataRequest.getRestURL(criteria, resourceCriteria));
        GWT.log("calling the getMetricsData =" + url);
        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url);
        final MetricData data = new MetricData();
        data.setRestUrl(url);
        data.setMetricCriteria(criteria);
        data.setMetricResourceCriteria(resourceCriteria);

        try {
            builder.sendRequest(null, new RequestCallback() {

                public void onError(Request request, Throwable err) {
                    callback.onFailure(err);
                }

                public void onResponseReceived(Request request, Response response) {
                    if (response.getStatusCode() != Response.SC_OK) {
                        callback.onFailure(getErrorAsThrowable(response));
                    } else if (response.getHeader(ERROR_HEADER) != null
                            && response.getHeader(ERROR_HEADER).length() > 0) {
                        callback.onFailure(getErrorAsThrowable(response));
                    } else {
                        String responseText = response.getText();
                        GWT.log("getMetricData. responseText =" + responseText);
                        MetricsDataResponse metricsResponse = MetricsDataResponse.fromJSON(response.getText());
                        if (metricsResponse == null) {
                            GWT.log("bad response: " + response.getText());
                            callback.onFailure(new Throwable(ConsoleUtil.messages.badOrMissingResponseData()));
                        } else {
                            JsArray<MetricGroupDataJS> rows = metricsResponse.getReturnData();
                            List<MetricGroupData> results = new ArrayList<MetricGroupData>();
                            if (rows != null) {
                                for (int i = 0; i < rows.length(); i++) {
                                    MetricGroupDataJS js = rows.get(i);
                                    results.add(js);
                                }
                            }
                            data.setReturnData(results);
                            callback.onSuccess(data);
                        }
                    }
                }
            });
        } catch (RequestException x) {
            callback.onFailure(x);
        }
    }

    /**
     * Gets the metric data download url.
     * 
     * @param criteria
     *            the criteria
     * @param resourceCriteria
     *            the resource criteria
     * @return the metric data download url
     * @see org.ebayopensource.turmeric.monitoring.client.model.MetricsQueryService#getMetricDataDownloadUrl(org.ebayopensource.turmeric.monitoring.client.model.MetricCriteria,
     *      org.ebayopensource.turmeric.monitoring.client.model.MetricResourceCriteria)
     */
    public String getMetricDataDownloadUrl(MetricCriteria criteria, MetricResourceCriteria resourceCriteria) {
        return URL.encode(MetricsDataRequest.getRestDownloadUrl(criteria, resourceCriteria));
    }

    /**
     * Call the remote server to obtain the list of services and their operations.
     * 
     * @param callback
     *            the callback
     * @see org.ebayopensource.turmeric.monitoring.client.model.MetricsQueryService#getServices(com.google.gwt.user.client.rpc.AsyncCallback)
     */
    public void getServices(final AsyncCallback<Map<String, Set<String>>> callback) {

        final String url = MetricsMetaDataRequest.getRestURL("Service", null, "Service");

        // the final results
        final Map<String, Set<String>> serviceMap = new TreeMap<String, Set<String>>();

        // Ask for the services
        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(url));
        try {
            builder.sendRequest(null, new RequestCallback() {

                public void onError(Request request, Throwable err) {
                    errorLogger.log(Level.SEVERE, "Error in getServices call", err);
                    callback.onFailure(err);
                }

                public void onResponseReceived(Request request, Response response) {
                    if (response.getStatusCode() != Response.SC_OK) {
                        errorLogger.log(Level.SEVERE, "Errored request in getServices call: " + url
                                + " response code=" + response.getStatusCode() + " response=" + response.getText());
                        callback.onFailure(getErrorAsThrowable(response));
                    } else if (response.getHeader(ERROR_HEADER) != null
                            && response.getHeader(ERROR_HEADER).length() > 0) {
                        errorLogger.log(Level.SEVERE, "Errored request in getServices call: " + url
                                + " response code=" + response.getStatusCode() + " response=" + response.getText());
                        callback.onFailure(getErrorAsThrowable(response));
                    } else {
                        // convert JSON to list of service names
                        GWT.log(response.getText());
                        MetricsMetaDataResponse metaDataResponse = MetricsMetaDataResponse
                                .fromJSON(response.getText());
                        if (metaDataResponse == null)
                            callback.onFailure(new Throwable(ConsoleUtil.messages.badRequestData()));
                        else {
                            Set<String> services = metaDataResponse.getOrderedResourceEntityResponseNames();
                            for (String s : services) {
                                GWT.log("service " + s);
                                serviceMap.put(s, new TreeSet<String>());
                            }

                            // Now ask for the operations of all the services
                            getServiceOperationsJSON(serviceMap, callback);
                        }
                    }
                }
            });
        } catch (RequestException x) {
            errorLogger.log(Level.SEVERE, "Error in getServices call", x);
            callback.onFailure(x);
        }
    }

    /**
     * Talk to the remote server to obtain a list of all operations for the given services.
     * 
     * @param serviceMap
     *            keys are the list of services for which to obtain the operations
     * @param callback
     *            the callback
     */
    public void getServiceOperations(final Map<String, Set<String>> serviceMap,
            final AsyncCallback<Map<String, Set<String>>> callback) {

        final String url = MetricsMetaDataRequest.getRestURL("Service", serviceMap.keySet(), "Operation");
        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(url));
        try {
            builder.sendRequest(null, new RequestCallback() {

                public void onError(Request request, Throwable err) {
                    errorLogger.log(Level.SEVERE, "Error in getServiceOperations call", err);
                    callback.onFailure(err);
                }

                public void onResponseReceived(final Request request, final Response response) {
                    if (response.getStatusCode() != Response.SC_OK) {
                        errorLogger.log(Level.SEVERE, "Errored request in getServiceOperations call: " + url
                                + " response code=" + response.getStatusCode() + " response=" + response.getText());
                        callback.onFailure(getErrorAsThrowable(response));
                    } else if (response.getHeader(ERROR_HEADER) != null
                            && response.getHeader(ERROR_HEADER).length() > 0) {
                        errorLogger.log(Level.SEVERE, "Errored request in getServiceOperations call: " + url
                                + " response code=" + response.getStatusCode() + " response=" + response.getText());
                        callback.onFailure(getErrorAsThrowable(response));
                    } else {
                        MetricsMetaDataResponse metaDataResponse = MetricsMetaDataResponse
                                .fromJSON(response.getText());
                        if (metaDataResponse == null)
                            callback.onFailure(new Throwable(ConsoleUtil.messages.badOrMissingResponseData()));
                        else {
                            Set<String> operationNames = metaDataResponse.getOrderedResourceEntityResponseNames();
                            String error = null;
                            Iterator<String> itor = operationNames.iterator();
                            while (itor.hasNext() && error == null) {
                                String s = itor.next();

                                int dot = s.indexOf(".");
                                if (dot < 0) {
                                    error = s;
                                } else {
                                    Set<String> operations = serviceMap.get(s.substring(0, dot));
                                    if (operations != null)
                                        operations.add(s.substring(dot + 1));
                                }
                            }
                            if (error != null)
                                callback.onFailure(new Throwable(error));
                            else
                                callback.onSuccess(serviceMap);
                        }
                    }
                }
            });
        } catch (RequestException x) {
            errorLogger.log(Level.SEVERE, "Error in getServiceOperations call", x);
            callback.onFailure(x);
        }
    }

    /**
     * Gets the service operations json.
     * 
     * @param serviceMap
     *            the service map
     * @param callback
     *            the callback
     */
    public void getServiceOperationsJSON(final Map<String, Set<String>> serviceMap,
            final AsyncCallback<Map<String, Set<String>>> callback) {

        final String url = MetricsMetaDataRequest.getJSONUrl();
        final String json = MetricsMetaDataRequest.getJSON("Service", serviceMap.keySet(), "Operation");
        RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, URL.encode(url));
        try {
            builder.sendRequest(json, new RequestCallback() {

                public void onError(Request request, Throwable err) {
                    callback.onFailure(err);
                }

                public void onResponseReceived(final Request request, final Response response) {
                    if (response.getStatusCode() != Response.SC_OK) {
                        errorLogger.log(Level.SEVERE, "Errored request in getServiceOperationsJSON call: " + url
                                + " response code=" + response.getStatusCode() + " response=" + response.getText());
                        callback.onFailure(getErrorAsThrowable(response));
                    } else if (response.getHeader(ERROR_HEADER) != null
                            && response.getHeader(ERROR_HEADER).length() > 0) {
                        errorLogger.log(Level.SEVERE, "Errored request in getServiceOperationsJSON call: " + url
                                + " Response=" + response.getText());
                        callback.onFailure(getErrorAsThrowable(response));
                    } else {
                        MetricsMetaDataResponse metaDataResponse = MetricsMetaDataResponse
                                .fromJSON(response.getText());
                        if (metaDataResponse == null)
                            callback.onFailure(new Throwable(ConsoleUtil.messages.badOrMissingResponseData()));
                        else {
                            Set<String> operationNames = metaDataResponse.getOrderedResourceEntityResponseNames();
                            String error = null;
                            Iterator<String> itor = operationNames.iterator();
                            while (itor.hasNext() && error == null) {
                                String s = itor.next();

                                int dot = s.indexOf(".");
                                if (dot < 0) {
                                    error = s;
                                } else {
                                    Set<String> operations = serviceMap.get(s.substring(0, dot));
                                    if (operations != null)
                                        operations.add(s.substring(dot + 1));
                                }
                            }
                            if (error != null)
                                callback.onFailure(new Throwable(error));
                            else
                                callback.onSuccess(serviceMap);
                        }
                    }
                }
            });
        } catch (RequestException x) {
            errorLogger.log(Level.SEVERE, "Error in getServiceOperationsJSON call", x);
            callback.onFailure(x);
        }
    }

    /**
     * Gets the error data.
     * 
     * @param errorCriteria
     *            the error criteria
     * @param metricCriteria
     *            the metric criteria
     * @param callback
     *            the callback
     * @see org.ebayopensource.turmeric.monitoring.client.model.MetricsQueryService#getErrorData(org.ebayopensource.turmeric.monitoring.client.model.MetricsQueryService.ErrorType,
     *      java.util.List, java.util.List, java.util.List, java.lang.String, boolean,
     *      org.ebayopensource.turmeric.monitoring.client.model.MetricsQueryService.ErrorCategory,
     *      org.ebayopensource.turmeric.monitoring.client.model.MetricsQueryService.ErrorSeverity,
     *      org.ebayopensource.turmeric.monitoring.client.model.MetricCriteria)
     */
    public void getErrorData(final ErrorCriteria errorCriteria, final MetricCriteria metricCriteria,
            final AsyncCallback<ErrorMetricData> callback) {
        final String url = URL.encode(ErrorMetricsDataRequest.getRestURL(errorCriteria, metricCriteria));
        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url);
        final ErrorMetricData data = new ErrorMetricData();
        data.setRestUrl(url);
        data.setErrorCriteria(errorCriteria);
        data.setMetricCriteria(metricCriteria);

        try {
            builder.sendRequest(null, new RequestCallback() {

                public void onError(Request request, Throwable err) {
                    callback.onFailure(err);
                }

                public void onResponseReceived(Request request, Response response) {
                    if (response.getStatusCode() != Response.SC_OK) {
                        errorLogger.log(Level.SEVERE, "Errored request in getErrorData call: " + url
                                + " response code=" + response.getStatusCode() + " response=" + response.getText());
                        callback.onFailure(getErrorAsThrowable(response));
                    } else if (response.getHeader(ERROR_HEADER) != null
                            && response.getHeader(ERROR_HEADER).length() > 0) {
                        errorLogger.log(Level.SEVERE,
                                "Errored request in getErrorData call: " + url + " Response=" + response.getText());
                        callback.onFailure(getErrorAsThrowable(response));
                    } else {
                        ErrorMetricsDataResponse metricsResponse = ErrorMetricsDataResponse
                                .fromJSON(response.getText());
                        if (metricsResponse == null) {
                            errorLogger.log(Level.SEVERE, "Errored request in getErrorData call: " + url
                                    + " Response=" + response.getText());
                            callback.onFailure(new Throwable(ConsoleUtil.messages.badOrMissingResponseData()));
                        } else {
                            JsArray<ErrorViewDataJS> rows = metricsResponse.getReturnData();
                            List<ErrorViewData> results = new ArrayList<ErrorViewData>();
                            if (rows != null) {
                                for (int i = 0; i < rows.length(); i++) {
                                    ErrorViewDataJS js = rows.get(i);
                                    results.add(js);
                                }
                            }
                            data.setReturnData(results);
                            callback.onSuccess(data);
                        }
                    }
                }
            });
        } catch (RequestException x) {
            errorLogger.log(Level.SEVERE, "error in getErrorData call", x);
            callback.onFailure(x);
            GWT.log("Exception in server call: " + x.toString());
        }
    }

    /**
     * Gets the error data download url.
     * 
     * @param ec
     *            the ec
     * @param mc
     *            the mc
     * @return the error data download url
     * @see org.ebayopensource.turmeric.monitoring.client.model.MetricsQueryService#getErrorDataDownloadUrl(org.ebayopensource.turmeric.monitoring.client.model.ErrorCriteria,
     *      org.ebayopensource.turmeric.monitoring.client.model.MetricCriteria)
     */
    public String getErrorDataDownloadUrl(ErrorCriteria ec, MetricCriteria mc) {
        return URL.encode(ErrorMetricsDataRequest.getRestDownloadUrl(ec, mc));
    }

    /**
     * Gets the error detail.
     * 
     * @param errorId
     *            the error id
     * @param errorName
     *            the error name
     * @param service
     *            the service
     * @param callback
     *            the callback
     * @see org.ebayopensource.turmeric.monitoring.client.model.MetricsQueryService#getErrorDetail(java.lang.String,
     *      java.lang.String, com.google.gwt.user.client.rpc.AsyncCallback)
     */
    public void getErrorDetail(final String errorId, final String errorName, final String service,
            final AsyncCallback<ErrorDetail> callback) {
        final String url = URL.encode(ErrorMetricsMetadataRequest.getRestURL(errorId, errorName, service));
        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url);

        try {
            builder.sendRequest(null, new RequestCallback() {

                public void onError(Request request, Throwable err) {
                    errorLogger.log(Level.SEVERE, "Error in getErrorDetail call:", err);
                    callback.onFailure(err);
                }

                public void onResponseReceived(Request request, Response response) {
                    if (response.getStatusCode() != Response.SC_OK) {
                        errorLogger.log(Level.SEVERE, "Errored request in getErrorDetail call: " + url
                                + " response code=" + response.getStatusCode() + " response=" + response.getText());
                        callback.onFailure(new Throwable("Error " + response.getStatusCode()));
                    } else if (response.getHeader(ERROR_HEADER) != null
                            && response.getHeader(ERROR_HEADER).length() > 0) {
                        errorLogger.log(Level.SEVERE, "Errored request in getErrorDetail call: " + url
                                + " response code=" + response.getStatusCode() + " response=" + response.getText());
                        callback.onFailure(new Throwable(ConsoleUtil.messages.badRequestData()));
                    } else {
                        ErrorMetricsMetadataResponse metricsResponse = ErrorMetricsMetadataResponse
                                .fromJSON(response.getText());
                        if (metricsResponse == null) {
                            callback.onFailure(new Throwable(ConsoleUtil.messages.badOrMissingResponseData()));
                        } else {

                            ErrorDetailJS js = metricsResponse.getReturnData();
                            if (js == null)
                                callback.onFailure(new Throwable(ConsoleUtil.messages.badOrMissingResponseData()));
                            else
                                callback.onSuccess(js);
                        }
                    }
                }
            });
        } catch (RequestException x) {
            errorLogger.log(Level.SEVERE, "Error in getErrorDetail call", x);
            callback.onFailure(x);
        }
    }

    /**
     * Gets the error time slot data.
     * 
     * @param ec
     *            the ec
     * @param mc
     *            the mc
     * @param callback
     *            the callback
     * @see org.ebayopensource.turmeric.monitoring.client.model.MetricsQueryService#getErrorTimeSlotData(org.ebayopensource.turmeric.monitoring.client.model.ErrorCriteria,
     *      org.ebayopensource.turmeric.monitoring.client.model.MetricCriteria,
     *      com.google.gwt.user.client.rpc.AsyncCallback)
     */
    public void getErrorTimeSlotData(final ErrorCriteria ec, final MetricCriteria mc,
            final AsyncCallback<ErrorTimeSlotData> callback) {

        final String url = URL.encode(ErrorMetricsGraphRequest.getRestURL(ec, mc));
        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url);
        final ErrorTimeSlotData data = new ErrorTimeSlotData();
        data.setRestUrl(url);
        data.setErrorCriteria(ec);
        data.setMetricCriteria(mc);
        GWT.log("getErrorTimeSlotData.url =" + url);
        try {
            builder.sendRequest(null, new RequestCallback() {

                public void onError(Request request, Throwable err) {
                    callback.onFailure(err);
                }

                public void onResponseReceived(Request request, Response response) {
                    if (response.getStatusCode() != Response.SC_OK) {
                        callback.onFailure(new Throwable("Error " + response.getStatusCode()));
                    } else if (response.getHeader(ERROR_HEADER) != null
                            && response.getHeader(ERROR_HEADER).length() > 0) {
                        callback.onFailure(new Throwable(ConsoleUtil.messages.badRequestData()));
                    } else {
                        String responseText = response.getText();
                        ErrorMetricsGraphResponse graphResponse = ErrorMetricsGraphResponse.fromJSON(responseText);
                        if (graphResponse == null) {
                            callback.onFailure(new Throwable(ConsoleUtil.messages.badOrMissingResponseData()));
                        } else {
                            JsArray<MetricGraphDataJS> rows = graphResponse.getReturnData();
                            List<TimeSlotValue> results = new ArrayList<TimeSlotValue>();
                            if (rows != null) {
                                for (int i = 0; i < rows.length(); i++) {
                                    MetricGraphDataJS js = rows.get(i);
                                    results.add(js);
                                }
                            }
                            data.setReturnData(results);
                            callback.onSuccess(data);

                        }
                    }
                }
            });
        } catch (RequestException x) {
            callback.onFailure(x);
        }
    }

    private void getMetricValueForDate(MetricValue mv, final AsyncCallback<TimeSlotData> callback)
            throws RequestException {

        final TimeSlotData data = new TimeSlotData();
        data.setReturnData(new ArrayList<TimeSlotValue>(0));

        final String url = URL.encode(MetricValueRequest.getRestURL(mv));
        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url);
        builder.setTimeoutMillis(60000);
        GWT.log("getMetricValueForDate url ->" + url);
        builder.sendRequest(null, new RequestCallback() {
            public void onError(Request request, Throwable err) {
                GWT.log("Error calling the SQMS", err);
                callback.onFailure(err);
            }

            public void onResponseReceived(Request request, Response response) {
                if (response.getStatusCode() != Response.SC_OK) {
                    GWT.log("Response status code: " + response.getStatusCode());
                    callback.onFailure(new RequestException("Response status code: " + response.getStatusCode()));
                } else if (response.getHeader(ERROR_HEADER) != null
                        && response.getHeader(ERROR_HEADER).length() > 0) {
                    GWT.log("Error. Response headers : " + response.getHeadersAsString());
                    callback.onFailure(
                            new RequestException("Error. Response headers : " + response.getHeadersAsString()));
                } else {
                    GWT.log(response.getText());
                    MetricValueResponse graphResponse = MetricValueResponse.fromJSON(response.getText());
                    if (graphResponse == null) {
                        GWT.log("Null response");
                    } else {
                        JsArray<MetricGraphDataJS> rows = graphResponse.getReturnData();
                        // GWT.log("rows.size = "+rows.length());
                        List<TimeSlotValue> results = new ArrayList<TimeSlotValue>();
                        if (rows != null) {
                            for (int i = 0; i < rows.length(); i++) {
                                MetricGraphDataJS js = rows.get(i);
                                results.add(js);
                            }
                        }
                        // GWT.log("results  = "+results.size());
                        data.getReturnData().addAll(results);
                        // GWT.log("adding all results: "+data.getReturnData().size());
                        callback.onSuccess(data);
                    }
                }
            }
        });

    }

    /**
     * Gets the metric value trend.
     * 
     * @param firstDate
     *            the first date
     * @param secondDate
     *            the second date
     * @param callback
     *            the callback
     * @see org.ebayopensource.turmeric.monitoring.client.model.MetricsQueryService#getServiceMetricValueTrend(org.ebayopensource.turmeric.monitoring.client.model.MetricValue,
     *      org.ebayopensource.turmeric.monitoring.client.model.MetricValue,
     *      com.google.gwt.user.client.rpc.AsyncCallback)
     */
    @Override
    public void getMetricValueTrend(final MetricValue firstDate, final MetricValue secondDate,
            final AsyncCallback<List<TimeSlotData>> callback) {
        try {
            final TimeSlotData firstDateRange = new TimeSlotData();
            final TimeSlotData secondDateRange = new TimeSlotData();
            this.getMetricValueForDate(firstDate, new AsyncCallback<TimeSlotData>() {

                @Override
                public void onFailure(Throwable arg0) {
                    errorLogger.log(Level.SEVERE,
                            "Error in getMetricValueTrend for the date:" + firstDate.getStartTime(), arg0);
                    Window.alert("Error: " + arg0.getMessage());
                }

                @Override
                public void onSuccess(TimeSlotData arg0) {
                    firstDateRange.setReturnData(arg0.getReturnData());
                    try {
                        getMetricValueForDate(secondDate, new AsyncCallback<TimeSlotData>() {

                            @Override
                            public void onFailure(Throwable arg0) {
                                errorLogger.log(Level.SEVERE,
                                        "Error in getMetricValueTrend for the date:" + secondDate.getStartTime(),
                                        arg0);
                                Window.alert("Error: " + arg0.getMessage());
                            }

                            @Override
                            public void onSuccess(TimeSlotData arg0) {
                                secondDateRange.setReturnData(arg0.getReturnData());
                                List<TimeSlotData> results = new ArrayList<TimeSlotData>();
                                results.add(firstDateRange);
                                results.add(secondDateRange);
                                callback.onSuccess(results);
                            }

                        });
                    } catch (RequestException e) {
                        e.printStackTrace();
                    }
                }

            });

        } catch (RequestException x) {
            callback.onFailure(x);
        }

    }

    /**
     * Gets the error trend.
     * 
     * @param ec
     *            the ec
     * @param firstDate
     *            the first date
     * @param secondDate
     *            the second date
     * @param callback
     *            the callback
     * @see org.ebayopensource.turmeric.monitoring.client.model.MetricsQueryService#getErrorTrend(org.ebayopensource.turmeric.monitoring.client.model.ErrorCriteria,
     *      org.ebayopensource.turmeric.monitoring.client.model.MetricCriteria,
     *      org.ebayopensource.turmeric.monitoring.client.model.MetricCriteria,
     *      com.google.gwt.user.client.rpc.AsyncCallback)
     */
    @Override
    public void getErrorTrend(final ErrorCriteria ec, final MetricCriteria firstDate,
            final MetricCriteria secondDate, final AsyncCallback<List<ErrorTimeSlotData>> callback) {
        final ErrorTimeSlotData firstDateRange = new ErrorTimeSlotData();
        final ErrorTimeSlotData secondDateRange = new ErrorTimeSlotData();
        // GWT.log("getErrorTrend.firstDate ="+firstDate.date1);
        this.getErrorTimeSlotData(ec, firstDate, new AsyncCallback<ErrorTimeSlotData>() {

            @Override
            public void onFailure(Throwable arg0) {
                Window.alert("Error: " + arg0.getMessage());
            }

            @Override
            public void onSuccess(ErrorTimeSlotData arg0) {
                firstDateRange.setReturnData(arg0.getReturnData());
                getErrorTimeSlotData(ec, secondDate, new AsyncCallback<ErrorTimeSlotData>() {

                    @Override
                    public void onFailure(Throwable arg0) {
                        Window.alert("Error: " + arg0.getMessage());
                    }

                    @Override
                    public void onSuccess(ErrorTimeSlotData arg0) {
                        secondDateRange.setReturnData(arg0.getReturnData());
                        List<ErrorTimeSlotData> results = new ArrayList<ErrorTimeSlotData>();
                        results.add(firstDateRange);
                        results.add(secondDateRange);
                        callback.onSuccess(results);
                    }

                });
            }
        });

    }

    /**
     * Gets the service consumers.
     * 
     * @param serviceName
     *            the service name
     * @param callback
     *            the callback
     * @see org.ebayopensource.turmeric.monitoring.client.model.MetricsQueryService#getServiceConsumers(java.lang.String,
     *      com.google.gwt.user.client.rpc.AsyncCallback)
     */
    public void getServiceConsumers(final String serviceName, final AsyncCallback<Set<String>> callback) {

        Set<String> serviceNames = new HashSet<String>();
        serviceNames.add(serviceName);
        final String url = MetricsMetaDataRequest.getRestURL("Service", serviceNames, "Consumer");
        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(url));
        try {
            builder.sendRequest(null, new RequestCallback() {

                public void onError(Request request, Throwable err) {
                    callback.onFailure(err);
                }

                public void onResponseReceived(final Request request, final Response response) {
                    if (response.getStatusCode() != Response.SC_OK) {
                        GWT.log("Errored request: " + url + " response code=" + response.getStatusCode()
                                + " response=" + response.getText());
                        callback.onFailure(getErrorAsThrowable(response));
                    } else if (response.getHeader(ERROR_HEADER) != null
                            && response.getHeader(ERROR_HEADER).length() > 0) {
                        GWT.log("Errored request: " + url + " response code=" + response.getStatusCode()
                                + " response=" + response.getText());
                        callback.onFailure(getErrorAsThrowable(response));
                    } else {
                        MetricsMetaDataResponse metaDataResponse = MetricsMetaDataResponse
                                .fromJSON(response.getText());
                        if (metaDataResponse == null)
                            callback.onFailure(new Throwable(ConsoleUtil.messages.badOrMissingResponseData()));
                        else {
                            Set<String> consumerNames = metaDataResponse.getOrderedResourceEntityResponseNames();

                            callback.onSuccess(consumerNames);
                        }
                    }
                }
            });
        } catch (RequestException x) {
            callback.onFailure(x);
        }
    }

}