/******************************************************************************* * Copyright 2015 Software Evolution and Architecture Lab, University of Zurich * * 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 * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. ******************************************************************************/ package eu.cloudwave.wp5.feedback.eclipse.costs.core.feedbackhandler; import java.util.Map; import com.google.common.collect.ImmutableMap; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; import eu.cloudwave.wp5.common.constants.AggregationInterval; import eu.cloudwave.wp5.common.constants.Headers; import eu.cloudwave.wp5.common.constants.Urls; import eu.cloudwave.wp5.common.dto.ApplicationDto; import eu.cloudwave.wp5.common.dto.costs.AggregatedIncomingRequestsDto; import eu.cloudwave.wp5.common.dto.costs.AggregatedMicroserviceRequestsDto; import eu.cloudwave.wp5.common.dto.costs.InitialInvocationCheckDto; import eu.cloudwave.wp5.common.rest.RestRequestHeader; import eu.cloudwave.wp5.feedback.eclipse.base.infrastructure.rest.RestClient; /** * Implementation of {@link FeedbackHandlerClient}. * * This class makes use of the generic {@link RestClient} and provides methods on top of it to access the Feedback * Handler Server. THe URL for this server is loaded from the plug-in preferences store. * */ public class FeedbackHandlerClientImpl implements FeedbackHandlerClient { @Inject private RestClient restClient; private final String rootUrl; @Inject public FeedbackHandlerClientImpl(final @Assisted String rootUrl) { this.rootUrl = rootUrl; } /** * {@inheritDoc} */ @Override public AggregatedMicroserviceRequestsDto[] allRequests( final String accessToken, final String applicationId, final AggregationInterval aggregationInterval, final String timeRangeFrom, final String timeRangeTo) { final String url = url(Urls.COST__ALL); return performGETRequest(url, accessToken, applicationId, aggregationInterval, timeRangeFrom, timeRangeTo); } /** * {@inheritDoc} */ @Override public AggregatedMicroserviceRequestsDto[] requestsByCallee( String accessToken, String applicationId, final AggregationInterval aggregationInterval, final String timeRangeFrom, final String timeRangeTo) { final String url = url(Urls.COST__FILTER__CALLEE); return performGETRequest(url, accessToken, applicationId, aggregationInterval, timeRangeFrom, timeRangeTo); } /** * {@inheritDoc} */ @Override public AggregatedMicroserviceRequestsDto requestsByCalleeOverall( String accessToken, String applicationId, final AggregationInterval aggregationInterval, final String timeRangeFrom, final String timeRangeTo) { final String url = url(Urls.COST__FILTER__CALLEE__OVERALL); final Map<String, String> urlVariables = ImmutableMap.of(); RestRequestHeader headerId = RestRequestHeader.of(Headers.APPLICATION_ID, applicationId); RestRequestHeader headerToken = RestRequestHeader.of(Headers.ACCESS_TOKEN, accessToken); RestRequestHeader headerInterval = RestRequestHeader.of(Headers.AGGREGATION_INTERVAL, aggregationInterval.toString()); RestRequestHeader headerTimeFrom = RestRequestHeader.of(Headers.TIME_RANGE_FROM, timeRangeFrom); RestRequestHeader headerTimeTo = RestRequestHeader.of(Headers.TIME_RANGE_TO, timeRangeTo); return restClient.get(url, urlVariables, AggregatedMicroserviceRequestsDto.class, headerId, headerToken, headerInterval, headerTimeFrom, headerTimeTo); } /** * {@inheritDoc} */ @Override public AggregatedMicroserviceRequestsDto[] requestsByCaller( String accessToken, String applicationId, final AggregationInterval aggregationInterval, final String timeRangeFrom, final String timeRangeTo) { final String url = url(Urls.COST__FILTER__CALLEE); return performGETRequest(url, accessToken, applicationId, aggregationInterval, timeRangeFrom, timeRangeTo); } /** * Cost Controller methods that return {@link AggregatedMicroserviceRequestsDto} objects require the same headers but * have a different url. This helper class performs the GET request and returns the list of results. * * @param url * @param accessToken * @param applicationId * @param timeRangeFrom * @param timeRangeTo * * @return An array of {@link AggregatedMicroserviceRequestsDto} */ private AggregatedMicroserviceRequestsDto[] performGETRequest( final String url, String accessToken, String applicationId, final AggregationInterval aggregationInterval, final String timeRangeFrom, final String timeRangeTo) { final Map<String, String> urlVariables = ImmutableMap.of(); RestRequestHeader headerId = RestRequestHeader.of(Headers.APPLICATION_ID, applicationId); RestRequestHeader headerToken = RestRequestHeader.of(Headers.ACCESS_TOKEN, accessToken); RestRequestHeader headerInterval = RestRequestHeader.of(Headers.AGGREGATION_INTERVAL, aggregationInterval.toString()); RestRequestHeader headerTimeFrom = RestRequestHeader.of(Headers.TIME_RANGE_FROM, timeRangeFrom); RestRequestHeader headerTimeTo = RestRequestHeader.of(Headers.TIME_RANGE_TO, timeRangeTo); return restClient.get(url, urlVariables, AggregatedMicroserviceRequestsDto[].class, headerId, headerToken, headerInterval, headerTimeFrom, headerTimeTo); } /** * {@inheritDoc} */ @Override public AggregatedIncomingRequestsDto[] allIncomingRequests(String accessToken, String applicationId, AggregationInterval aggregationInterval, String timeRangeFrom, String timeRangeTo) { final String url = url(Urls.COST__INCOMING__ALL); return getIncomingRequest(url, accessToken, applicationId, null, aggregationInterval, timeRangeFrom, timeRangeTo); } /** * {@inheritDoc} */ @Override public AggregatedIncomingRequestsDto[] incomingRequestsByIdentifier( String accessToken, String applicationId, String requestedApplicationId, AggregationInterval aggregationInterval, String timeRangeFrom, String timeRangeTo) { final String url = url(Urls.COST__INCOMING__FILTER__IDENTIFIER); return getIncomingRequest(url, accessToken, applicationId, requestedApplicationId, aggregationInterval, timeRangeFrom, timeRangeTo); } /** * {@inheritDoc} */ @Override public AggregatedIncomingRequestsDto[] incomingRequestsByIdentifier(String accessToken, String applicationId, AggregationInterval aggregationInterval, String timeRangeFrom, String timeRangeTo) { final String url = url(Urls.COST__INCOMING__FILTER__IDENTIFIER); return getIncomingRequest(url, accessToken, applicationId, null, aggregationInterval, timeRangeFrom, timeRangeTo); } /** * Cost Controller methods that return {@link AggregatedIncomingRequestsDto} objects require the same headers but have * a different url. This helper class performs the GET request and returns the list of results. * * @param url * {@link String} * @param accessToken * {@link String} used for auth * @param applicationId * {@link String} used for auth (and if requestedApplicationId is null, the applicationId is also used as * identifier of the microservice which are interested in) * @param requestedApplicationId * {@link String} with the application id of the microservice which we are interested in * @param aggregationInterval * {@link AggregationInterval} * @param timeRangeFrom * {@link String} that specifies the start time of the time range * @param timeRangeTo * {@link String} that specifies the end time of the time range * * @return An array of {@link AggregatedMicroserviceRequestsDto} */ private AggregatedIncomingRequestsDto[] getIncomingRequest( final String url, String accessToken, String applicationId, String requestedApplicationId, final AggregationInterval aggregationInterval, final String timeRangeFrom, final String timeRangeTo) { final Map<String, String> urlVariables = ImmutableMap.of(); RestRequestHeader headerId = RestRequestHeader.of(Headers.APPLICATION_ID, applicationId); RestRequestHeader headerToken = RestRequestHeader.of(Headers.ACCESS_TOKEN, accessToken); RestRequestHeader headerInterval = RestRequestHeader.of(Headers.AGGREGATION_INTERVAL, aggregationInterval.toString()); RestRequestHeader headerTimeFrom = RestRequestHeader.of(Headers.TIME_RANGE_FROM, timeRangeFrom); RestRequestHeader headerTimeTo = RestRequestHeader.of(Headers.TIME_RANGE_TO, timeRangeTo); if (requestedApplicationId != null && !requestedApplicationId.isEmpty()) { return restClient.get(url, urlVariables, AggregatedIncomingRequestsDto[].class, headerId, headerToken, headerInterval, headerTimeFrom, headerTimeTo, RestRequestHeader.of(Headers.REQUESTED_APPLICATION_ID, requestedApplicationId)); } else { return restClient.get(url, urlVariables, AggregatedIncomingRequestsDto[].class, headerId, headerToken, headerInterval, headerTimeFrom, headerTimeTo); } } /** * {@inheritDoc} */ @Override public AggregatedIncomingRequestsDto overallIncomingRequestsByIdentifier( String accessToken, String applicationId, String requestedApplicationId, AggregationInterval aggregationInterval, String timeRangeFrom, String timeRangeTo) { final String url = url(Urls.COST__INCOMING__FILTER__IDENTIFIER__OVERALL); final Map<String, String> urlVariables = ImmutableMap.of(); RestRequestHeader headerId = RestRequestHeader.of(Headers.APPLICATION_ID, applicationId); RestRequestHeader headerToken = RestRequestHeader.of(Headers.ACCESS_TOKEN, accessToken); RestRequestHeader headerInterval = RestRequestHeader.of(Headers.AGGREGATION_INTERVAL, aggregationInterval.toString()); RestRequestHeader headerTimeFrom = RestRequestHeader.of(Headers.TIME_RANGE_FROM, timeRangeFrom); RestRequestHeader headerTimeTo = RestRequestHeader.of(Headers.TIME_RANGE_TO, timeRangeTo); if (requestedApplicationId != null && !requestedApplicationId.isEmpty()) { return restClient.get(url, urlVariables, AggregatedIncomingRequestsDto.class, headerId, headerToken, headerInterval, headerTimeFrom, headerTimeTo, RestRequestHeader.of(Headers.REQUESTED_APPLICATION_ID, requestedApplicationId)); } else { return restClient.get(url, urlVariables, AggregatedIncomingRequestsDto.class, headerId, headerToken, headerInterval, headerTimeFrom, headerTimeTo); } } /** * {@inheritDoc} */ @Override public AggregatedIncomingRequestsDto overallIncomingRequestsByIdentifier(String accessToken, String applicationId, AggregationInterval aggregationInterval, String timeRangeFrom, String timeRangeTo) { return overallIncomingRequestsByIdentifier(accessToken, applicationId, null, aggregationInterval, timeRangeFrom, timeRangeTo); } /** * {@inheritDoc} */ @Override public Boolean isNewlyInvoked(String accessToken, String applicationId, InitialInvocationCheckDto invocation) { final String url = url(Urls.COST__INVOCATION__CHECK); final Map<String, String> urlVariables = ImmutableMap.of(); RestRequestHeader headerId = RestRequestHeader.of(Headers.APPLICATION_ID, applicationId); RestRequestHeader headerToken = RestRequestHeader.of(Headers.ACCESS_TOKEN, accessToken); RestRequestHeader invokedClass = RestRequestHeader.of(Headers.INVOKED_CLASS, invocation.getInvokedClassName()); RestRequestHeader invokedMethod = RestRequestHeader.of(Headers.INVOKED_METHOD, invocation.getInvokedMethodName()); RestRequestHeader callerClass = RestRequestHeader.of(Headers.CALLER_CLASS, invocation.getCallerClassName()); RestRequestHeader callerMethod = RestRequestHeader.of(Headers.CALLER_METHOD, invocation.getCallerMethodName()); return restClient.get(url, urlVariables, Boolean.class, headerId, headerToken, invokedClass, invokedMethod, callerClass, callerMethod); } /** * {@inheritDoc} */ @Override public ApplicationDto currentApplication(String accessToken, String applicationId) { final String url = url(Urls.MONITORING__LOGIN); final Map<String, String> urlVariables = ImmutableMap.of(); RestRequestHeader headerId = RestRequestHeader.of(Headers.APPLICATION_ID, applicationId); RestRequestHeader headerToken = RestRequestHeader.of(Headers.ACCESS_TOKEN, accessToken); return restClient.get(url, urlVariables, ApplicationDto.class, headerId, headerToken); } /** * {@inheritDoc} */ @Override public ApplicationDto application(String accessToken, String applicationId, String requestedApplicationId) { final String url = url(Urls.MONITORING__APPLICATION); final Map<String, String> urlVariables = ImmutableMap.of(); RestRequestHeader headerId = RestRequestHeader.of(Headers.APPLICATION_ID, applicationId); RestRequestHeader headerToken = RestRequestHeader.of(Headers.ACCESS_TOKEN, accessToken); RestRequestHeader headerReqId = RestRequestHeader.of(Headers.REQUESTED_APPLICATION_ID, requestedApplicationId); return restClient.get(url, urlVariables, ApplicationDto.class, headerId, headerToken, headerReqId); } /** * Helper that concatenates a given url with the root url * * @param urlFragment * @return */ private String url(final String urlFragment) { return Urls.concatenate(rootUrl, urlFragment); } }