package rocks.inspectit.server.service.rest;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.DateTimeFormat.ISO;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import rocks.inspectit.server.service.rest.error.JsonError;
import rocks.inspectit.shared.all.communication.data.InvocationSequenceData;
import rocks.inspectit.shared.cs.cmr.service.IInvocationDataAccessService;
import rocks.inspectit.shared.cs.communication.comparator.DefaultDataComparatorEnum;
import rocks.inspectit.shared.cs.communication.comparator.ResultComparator;
/**
* Restful service provider for detail {@link InvocationSequenceData} information.
*
* @author Mario Mann
*
*/
@Controller
@RequestMapping(value = "/data/invocations")
public class InvocationSequenceRestfulService {
/**
* Default comparator for the
* {@link #getInvocationSequenceOverview(long, Date, Date, long, int, long)} method. Sorts by
* invocation id in ascending order.
*/
private static final ResultComparator<InvocationSequenceData> OVERVIEW_COMPARATOR = new ResultComparator<>(DefaultDataComparatorEnum.ID, true);
/**
* Reference to the existing {@link IInvocationDataAccessService}.
*/
@Autowired
private IInvocationDataAccessService invocationDataAccessService;
/**
* Handling of all the exceptions happening in this controller.
*
* @param exception
* Exception being thrown
* @return {@link ModelAndView}
*/
@ExceptionHandler(Exception.class)
public ModelAndView handleAllException(Exception exception) {
return new JsonError(exception).asModelAndView();
}
/**
* Provides overview of several invocation data.
*
* *
* <p>
* <i> Example URL: /data/invocations</i>
* </p>
*
* @param agentId
* Agent ID.
* @param fromDate
* Begin of time period.
* @param toDate
* End of time period.
* @param latestReadId
* Latest read ID of the invocations, only invocations with higher id are submitted.
* @param businessTrxId
* Business transaction ID.
* @param applicationId
* Application ID.
* @param limit
* The limit/size of the results.
* @param minDuration
* Minimum duration in milliseconds of the invocation to be returned.
* @return a list of {@link InvocationSequenceData}.
*/
@RequestMapping(method = GET, value = "")
@ResponseBody
public List<InvocationSequenceData> getInvocationSequenceOverview(@RequestParam(value = "agentId", required = false, defaultValue = "0") Long agentId, // NOCHK
@RequestParam(value = "fromDate", required = false) @DateTimeFormat(iso = ISO.DATE_TIME) Date fromDate,
@RequestParam(value = "toDate", required = false) @DateTimeFormat(iso = ISO.DATE_TIME) Date toDate,
@RequestParam(value = "latestReadId", required = false, defaultValue = "0") Long latestReadId,
@RequestParam(value = "businessTrxId", required = false, defaultValue = "0") int businessTrxId, @RequestParam(value = "appId", required = false, defaultValue = "0") int applicationId,
@RequestParam(value = "limit", defaultValue = "100") int limit, @RequestParam(value = "minDuration", defaultValue = "0") long minDuration) {
List<InvocationSequenceData> result = invocationDataAccessService.getInvocationSequenceOverview(agentId, limit, fromDate, toDate, latestReadId + 1, businessTrxId, applicationId,
OVERVIEW_COMPARATOR);
// manually filter the duration
for (Iterator<InvocationSequenceData> it = result.iterator(); it.hasNext();) {
if (it.next().getDuration() < minDuration) {
it.remove();
}
}
return result;
}
/**
* Provides detail informations of an invocation sequence data.
*
* <p>
* <i> Example URL: /data/invocations/{id}</i>
* </p>
*
* @param id
* Invocation sequence ID.
* @return detail information of an {@link InvocationSequenceData}.
*/
@RequestMapping(method = GET, value = "{id}")
@ResponseBody
public InvocationSequenceData getInvocationSequenceDetails(@PathVariable long id) {
InvocationSequenceData template = new InvocationSequenceData();
template.setId(id);
InvocationSequenceData result = invocationDataAccessService.getInvocationSequenceDetail(template);
return result;
}
/**
* Header information for swagger requests.
*
* @param response
* Response information
*/
@ModelAttribute
public void setVaryResponseHeader(HttpServletResponse response) {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
}
}