@POST @Timed @Consumes(MediaType.APPLICATION_JSON) @ApiOperation(value = "Update extractor order of an input") @ApiResponses(value = {@ApiResponse(code = 404, message = "No such input on this node.")}) @Path("order") public void order( @ApiParam(name = "inputId", value = "Persist ID (!) of input.", required = true) @PathParam("inputId") String inputPersistId, @ApiParam(name = "JSON body", required = true) OrderExtractorsRequest oer) throws NotFoundException { checkPermission(RestPermissions.INPUTS_EDIT, inputPersistId); final Input mongoInput = inputService.find(inputPersistId); for (Extractor extractor : inputService.getExtractors(mongoInput)) { if (oer.order().containsValue(extractor.getId())) { extractor.setOrder(Tools.getKeyByValue(oer.order(), extractor.getId())); } // Docs embedded in MongoDB array cannot be updated atomically... :/ inputService.removeExtractor(mongoInput, extractor.getId()); try { inputService.addExtractor(mongoInput, extractor); } catch (ValidationException e) { LOG.warn("Validation error for extractor update.", e); } } LOG.info("Updated extractor ordering of input <persist:{}>.", inputPersistId); }
@PUT @Timed @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @ApiOperation(value = "Update an extractor") @Path("/{extractorId}") @ApiResponses( value = { @ApiResponse(code = 404, message = "No such input on this node."), @ApiResponse(code = 404, message = "No such extractor on this input."), @ApiResponse(code = 400, message = "No such extractor type."), @ApiResponse(code = 400, message = "Field the extractor should write on is reserved."), @ApiResponse(code = 400, message = "Missing or invalid configuration.") }) public ExtractorSummary update( @ApiParam(name = "inputId", required = true) @PathParam("inputId") String inputId, @ApiParam(name = "extractorId", required = true) @PathParam("extractorId") String extractorId, @ApiParam(name = "JSON body", required = true) @Valid @NotNull CreateExtractorRequest cer) throws NotFoundException { checkPermission(RestPermissions.INPUTS_EDIT, inputId); final MessageInput input = persistedInputs.get(inputId); if (input == null) { LOG.error("Input <{}> not found.", inputId); throw new javax.ws.rs.NotFoundException("Couldn't find input " + inputId); } final Input mongoInput = inputService.find(input.getPersistId()); final Extractor originalExtractor = inputService.getExtractor(mongoInput, extractorId); final Extractor extractor = buildExtractorFromRequest(cer, originalExtractor.getId()); inputService.removeExtractor(mongoInput, originalExtractor.getId()); try { inputService.addExtractor(mongoInput, extractor); } catch (ValidationException e) { LOG.error("Extractor persist validation failed.", e); throw new BadRequestException(e); } final String msg = "Updated extractor <" + originalExtractor.getId() + "> of type [" + cer.extractorType() + "] in input <" + inputId + ">."; LOG.info(msg); activityWriter.write(new Activity(msg, ExtractorsResource.class)); return toSummary(extractor); }
@DELETE @Timed @ApiOperation(value = "Delete an extractor") @Path("/{extractorId}") @ApiResponses( value = { @ApiResponse(code = 400, message = "Invalid request."), @ApiResponse(code = 404, message = "Input not found."), @ApiResponse(code = 404, message = "Extractor not found.") }) @Produces(MediaType.APPLICATION_JSON) public void terminate( @ApiParam(name = "inputId", required = true) @PathParam("inputId") String inputId, @ApiParam(name = "extractorId", required = true) @PathParam("extractorId") String extractorId) throws NotFoundException { checkPermission(RestPermissions.INPUTS_EDIT, inputId); final MessageInput input = persistedInputs.get(inputId); if (input == null) { LOG.error("Input <{}> not found.", inputId); throw new javax.ws.rs.NotFoundException("Couldn't find input " + inputId); } // Remove from Mongo. final Input mongoInput = inputService.find(input.getPersistId()); final Extractor extractor = inputService.getExtractor(mongoInput, extractorId); inputService.removeExtractor(mongoInput, extractor.getId()); final String msg = "Deleted extractor <" + extractorId + "> of type [" + extractor.getType() + "] " + "from input <" + inputId + ">."; LOG.info(msg); activityWriter.write(new Activity(msg, InputsResource.class)); }
private ExtractorSummary toSummary(Extractor extractor) { final ExtractorMetrics metrics = ExtractorMetrics.create( MetricUtils.buildTimerMap( metricRegistry.getTimers().get(extractor.getTotalTimerName())), MetricUtils.buildTimerMap( metricRegistry.getTimers().get(extractor.getConverterTimerName()))); return ExtractorSummary.create( extractor.getId(), extractor.getTitle(), extractor.getType().toString().toLowerCase(), extractor.getCursorStrategy().toString().toLowerCase(), extractor.getSourceField(), extractor.getTargetField(), extractor.getExtractorConfig(), extractor.getCreatorUserId(), extractor.converterConfigMap(), extractor.getConditionType().toString().toLowerCase(), extractor.getConditionValue(), extractor.getOrder(), extractor.getExceptionCount(), extractor.getConverterExceptionCount(), metrics); }