/******************************************************************************* * 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.feedbackhandler.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import eu.cloudwave.wp5.common.constants.Headers; import eu.cloudwave.wp5.common.constants.Urls; import eu.cloudwave.wp5.common.dto.costs.AggregatedIncomingRequestsDto; import eu.cloudwave.wp5.common.dto.costs.AggregatedMicroserviceRequestsDto; import eu.cloudwave.wp5.common.util.AggregationIntervalConverter; import eu.cloudwave.wp5.feedbackhandler.advices.CostDataProvider; import eu.cloudwave.wp5.feedbackhandler.advices.IncomingRequestsDataProvider; import eu.cloudwave.wp5.feedbackhandler.advices.InvocationDataProvider; import eu.cloudwave.wp5.feedbackhandler.model.db.DbApplication; import eu.cloudwave.wp5.feedbackhandler.repositories.ProcedureExecutionRepository; @RestController public class CostController extends AbstractBaseRestController { @Autowired private ProcedureExecutionRepository repository; @Autowired private CostDataProvider costDataProvider; @Autowired private IncomingRequestsDataProvider incomingRequestsDataProvider; @Autowired private InvocationDataProvider invocationDataProvider; @RequestMapping(Urls.COST__ALL) @ResponseStatus(HttpStatus.OK) public List<AggregatedMicroserviceRequestsDto> all( @RequestHeader(Headers.ACCESS_TOKEN) final String accessToken, @RequestHeader(Headers.APPLICATION_ID) final String applicationId, @RequestHeader(Headers.AGGREGATION_INTERVAL) final String aggregationInterval, @RequestHeader(value = Headers.TIME_RANGE_FROM, required = false) final Long timeRangeFrom, @RequestHeader(value = Headers.TIME_RANGE_TO, required = false) final Long timeRangeTo) { sampleLogger.info("Request to " + Urls.COST__ALL); return costDataProvider.getAllAggregatedRequests(AggregationIntervalConverter.fromString(aggregationInterval), timeRangeFrom, timeRangeTo); } @RequestMapping(Urls.COST__FILTER__CALLEE) @ResponseStatus(HttpStatus.OK) public List<AggregatedMicroserviceRequestsDto> byCallee( @RequestHeader(Headers.ACCESS_TOKEN) final String accessToken, @RequestHeader(Headers.APPLICATION_ID) final String applicationId, @RequestHeader(Headers.AGGREGATION_INTERVAL) final String aggregationInterval, @RequestHeader(value = Headers.TIME_RANGE_FROM, required = false) final Long timeRangeFrom, @RequestHeader(value = Headers.TIME_RANGE_TO, required = false) final Long timeRangeTo) { sampleLogger.info("Request to " + Urls.COST__FILTER__CALLEE); final DbApplication application = handleUnauthorized(applicationId, accessToken); return costDataProvider.getAggregatedRequestsByCallee(application, AggregationIntervalConverter.fromString(aggregationInterval), timeRangeFrom, timeRangeTo); } @RequestMapping(Urls.COST__FILTER__CALLEE__OVERALL) @ResponseStatus(HttpStatus.OK) public AggregatedMicroserviceRequestsDto overallByCallee( @RequestHeader(Headers.ACCESS_TOKEN) final String accessToken, @RequestHeader(Headers.APPLICATION_ID) final String applicationId, @RequestHeader(Headers.AGGREGATION_INTERVAL) final String aggregationInterval, @RequestHeader(value = Headers.TIME_RANGE_FROM, required = false) final Long timeRangeFrom, @RequestHeader(value = Headers.TIME_RANGE_TO, required = false) final Long timeRangeTo) { sampleLogger.info("Request to " + Urls.COST__FILTER__CALLEE__OVERALL); final DbApplication application = handleUnauthorized(applicationId, accessToken); return costDataProvider.getOverallAggregatedRequestsByCallee(application, AggregationIntervalConverter.fromString(aggregationInterval), timeRangeFrom, timeRangeTo); } @RequestMapping(Urls.COST__FILTER__CALLER) @ResponseStatus(HttpStatus.OK) public List<AggregatedMicroserviceRequestsDto> byCaller( @RequestHeader(Headers.ACCESS_TOKEN) final String accessToken, @RequestHeader(Headers.APPLICATION_ID) final String applicationId, @RequestHeader(Headers.AGGREGATION_INTERVAL) final String aggregationInterval, @RequestHeader(value = Headers.TIME_RANGE_FROM, required = false) final Long timeRangeFrom, @RequestHeader(value = Headers.TIME_RANGE_TO, required = false) final Long timeRangeTo) { sampleLogger.info("Request to " + Urls.COST__FILTER__CALLER); final DbApplication application = handleUnauthorized(applicationId, accessToken); return costDataProvider.getAggregatedRequestsByCaller(application, AggregationIntervalConverter.fromString(aggregationInterval), timeRangeFrom, timeRangeTo); } @RequestMapping(Urls.COST__INCOMING__ALL) @ResponseStatus(HttpStatus.OK) public List<AggregatedIncomingRequestsDto> allIncoming( @RequestHeader(Headers.ACCESS_TOKEN) final String accessToken, @RequestHeader(Headers.APPLICATION_ID) final String applicationId, @RequestHeader(Headers.AGGREGATION_INTERVAL) final String aggregationInterval, @RequestHeader(value = Headers.TIME_RANGE_FROM, required = false) final Long timeRangeFrom, @RequestHeader(value = Headers.TIME_RANGE_TO, required = false) final Long timeRangeTo) { sampleLogger.info("Request to " + Urls.COST__INCOMING__ALL); return incomingRequestsDataProvider.getAllIncomingRequests(AggregationIntervalConverter.fromString(aggregationInterval), timeRangeFrom, timeRangeTo); } @RequestMapping(Urls.COST__INCOMING__FILTER__IDENTIFIER) @ResponseStatus(HttpStatus.OK) public List<AggregatedIncomingRequestsDto> incomingByIdentifier( @RequestHeader(Headers.ACCESS_TOKEN) final String accessToken, @RequestHeader(Headers.APPLICATION_ID) final String applicationId, @RequestHeader(Headers.AGGREGATION_INTERVAL) final String aggregationInterval, @RequestHeader(value = Headers.REQUESTED_APPLICATION_ID, required = false) final String requestedApplicationId, @RequestHeader(value = Headers.TIME_RANGE_FROM, required = false) final Long timeRangeFrom, @RequestHeader(value = Headers.TIME_RANGE_TO, required = false) final Long timeRangeTo) { sampleLogger.info("Request to " + Urls.COST__INCOMING__FILTER__IDENTIFIER); DbApplication application; if (requestedApplicationId != null) { // only use access token and associated application id for authorization handleUnauthorized(applicationId, accessToken); // use the requested application id for db queries application = applicationRepository.findOne(requestedApplicationId); // does the requested application exist? if (application == null) return null; } else { application = handleUnauthorized(applicationId, accessToken); } return incomingRequestsDataProvider.getIncomingRequestsByIdentifier(application, AggregationIntervalConverter.fromString(aggregationInterval), timeRangeFrom, timeRangeTo); } @RequestMapping(Urls.COST__INCOMING__FILTER__IDENTIFIER__OVERALL) @ResponseStatus(HttpStatus.OK) public AggregatedIncomingRequestsDto incomingByIdentifierOverall( @RequestHeader(Headers.ACCESS_TOKEN) final String accessToken, @RequestHeader(Headers.APPLICATION_ID) final String applicationId, @RequestHeader(Headers.AGGREGATION_INTERVAL) final String aggregationInterval, @RequestHeader(value = Headers.REQUESTED_APPLICATION_ID, required = false) final String requestedApplicationId, @RequestHeader(value = Headers.TIME_RANGE_FROM, required = false) final Long timeRangeFrom, @RequestHeader(value = Headers.TIME_RANGE_TO, required = false) final Long timeRangeTo) { sampleLogger.info("Request to " + Urls.COST__INCOMING__FILTER__IDENTIFIER__OVERALL); DbApplication application; if (requestedApplicationId == null) { application = handleUnauthorized(applicationId, accessToken); } else { // only use access token and associated application id for authorization handleUnauthorized(applicationId, accessToken); // use the requested application id for db queries application = applicationRepository.findOne(requestedApplicationId); // does the requested application exist? if (application == null) return null; } return incomingRequestsDataProvider.getOverallIncomingRequestsByIdentifier(application, AggregationIntervalConverter.fromString(aggregationInterval), timeRangeFrom, timeRangeTo); } @RequestMapping(Urls.COST__INVOCATION__CHECK) @ResponseStatus(HttpStatus.OK) public Boolean isNewlyInvoked( @RequestHeader(Headers.ACCESS_TOKEN) final String accessToken, @RequestHeader(Headers.APPLICATION_ID) final String applicationId, @RequestHeader(Headers.INVOKED_CLASS) final String invokedClassName, @RequestHeader(Headers.INVOKED_METHOD) final String invokedMethodName, @RequestHeader(Headers.CALLER_CLASS) final String callerClassName, @RequestHeader(Headers.CALLER_METHOD) final String callerMethodName) { sampleLogger.info("Request to " + Urls.COST__INVOCATION__CHECK); return invocationDataProvider.isNewlyInvoked(invokedClassName, invokedMethodName, callerClassName, callerMethodName); } }