use of org.apache.nifi.update.attributes.Action in project nifi by apache.
the class RuleResource method createAction.
@POST
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Path("/rules/actions")
public Response createAction(@Context final UriInfo uriInfo, final ActionEntity requestEntity) {
// generate a new id
final String uuid = UUID.randomUUID().toString();
final Action action;
try {
// create the condition object
final UpdateAttributeModelFactory factory = new UpdateAttributeModelFactory();
action = factory.createAction(requestEntity.getAction());
action.setId(uuid);
} catch (final IllegalArgumentException iae) {
throw new WebApplicationException(iae, badRequest(iae.getMessage()));
}
// build the response
final ActionEntity responseEntity = new ActionEntity();
responseEntity.setClientId(requestEntity.getClientId());
responseEntity.setProcessorId(requestEntity.getProcessorId());
responseEntity.setRevision(requestEntity.getRevision());
responseEntity.setAction(DtoFactory.createActionDTO(action));
// generate the response
final UriBuilder uriBuilder = uriInfo.getAbsolutePathBuilder();
final ResponseBuilder response = Response.created(uriBuilder.path(uuid).build()).entity(responseEntity);
return noCache(response).build();
}
use of org.apache.nifi.update.attributes.Action in project nifi by apache.
the class RuleResource method updateRule.
@PUT
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Path("/rules/{id}")
public Response updateRule(@Context final UriInfo uriInfo, @PathParam("id") final String ruleId, final RuleEntity requestEntity) {
// get the web context
final NiFiWebConfigurationContext nifiWebContext = (NiFiWebConfigurationContext) servletContext.getAttribute("nifi-web-configuration-context");
// ensure the rule has been specified
if (requestEntity == null || requestEntity.getRule() == null) {
throw new WebApplicationException(badRequest("The rule must be specified."));
}
final RuleDTO ruleDto = requestEntity.getRule();
// ensure the id has been specified
if (ruleDto.getId() == null) {
throw new WebApplicationException(badRequest("The rule id must be specified."));
}
if (!ruleDto.getId().equals(ruleId)) {
throw new WebApplicationException(badRequest("The rule id in the path does not equal the rule id in the request body."));
}
// ensure the rule name was specified
if (ruleDto.getName() == null || ruleDto.getName().isEmpty()) {
throw new WebApplicationException(badRequest("The rule name must be specified and cannot be blank."));
}
// ensure there are some conditions
if (ruleDto.getConditions() == null || ruleDto.getConditions().isEmpty()) {
throw new WebApplicationException(badRequest("The rule conditions must be set."));
}
// ensure there are some actions
if (ruleDto.getActions() == null || ruleDto.getActions().isEmpty()) {
throw new WebApplicationException(badRequest("The rule actions must be set."));
}
// build the web context config
final NiFiWebConfigurationRequestContext requestContext = getConfigurationRequestContext(requestEntity.getProcessorId(), requestEntity.getRevision(), requestEntity.getClientId());
// load the criteria
final UpdateAttributeModelFactory factory = new UpdateAttributeModelFactory();
final Criteria criteria = getCriteria(nifiWebContext, requestContext);
// attempt to locate the rule
Rule rule = criteria.getRule(ruleId);
// if the rule isn't found add it
boolean newRule = false;
if (rule == null) {
newRule = true;
rule = new Rule();
rule.setId(ruleId);
}
try {
// evaluate the conditions and actions before modifying the rule
final Set<Condition> conditions = factory.createConditions(ruleDto.getConditions());
final Set<Action> actions = factory.createActions(ruleDto.getActions());
// update the rule
rule.setName(ruleDto.getName());
rule.setConditions(conditions);
rule.setActions(actions);
} catch (final IllegalArgumentException iae) {
throw new WebApplicationException(iae, badRequest(iae.getMessage()));
}
// add the new rule if application
if (newRule) {
criteria.addRule(rule);
}
// save the criteria
saveCriteria(requestContext, criteria);
// create the response entity
final RuleEntity responseEntity = new RuleEntity();
responseEntity.setClientId(requestEntity.getClientId());
responseEntity.setRevision(requestEntity.getRevision());
responseEntity.setProcessorId(requestEntity.getProcessorId());
responseEntity.setRule(DtoFactory.createRuleDTO(rule));
// generate the response
final ResponseBuilder response;
if (newRule) {
final UriBuilder uriBuilder = uriInfo.getAbsolutePathBuilder();
response = Response.created(uriBuilder.path(ruleId).build()).entity(responseEntity);
} else {
response = Response.ok(responseEntity);
}
return noCache(response).build();
}
use of org.apache.nifi.update.attributes.Action in project nifi by apache.
the class DtoFactory method createRuleDTO.
public static RuleDTO createRuleDTO(final Rule rule) {
final RuleDTO dto = new RuleDTO();
dto.setId(rule.getId());
dto.setName(rule.getName());
if (rule.getConditions() != null) {
final Set<ConditionDTO> conditions = new TreeSet<>();
for (final Condition condition : rule.getConditions()) {
conditions.add(createConditionDTO(condition));
}
dto.setConditions(conditions);
}
if (rule.getActions() != null) {
final Set<ActionDTO> actions = new TreeSet<>();
for (final Action action : rule.getActions()) {
actions.add(createActionDTO(action));
}
dto.setActions(actions);
}
return dto;
}
use of org.apache.nifi.update.attributes.Action in project nifi by apache.
the class UpdateAttribute method getDefaultActions.
// Gets the default actions.
private Map<String, Action> getDefaultActions(final Map<PropertyDescriptor, String> properties) {
final Map<String, Action> defaultActions = new HashMap<>();
for (final Map.Entry<PropertyDescriptor, String> entry : properties.entrySet()) {
if (entry.getKey() != STORE_STATE && entry.getKey() != STATEFUL_VARIABLES_INIT_VALUE) {
final Action action = new Action();
action.setAttribute(entry.getKey().getName());
action.setValue(entry.getValue());
defaultActions.put(action.getAttribute(), action);
}
}
return defaultActions;
}
use of org.apache.nifi.update.attributes.Action in project nifi by apache.
the class UpdateAttribute method onTrigger.
@Override
public void onTrigger(final ProcessContext context, final ProcessSession session) {
final ComponentLog logger = getLogger();
final Criteria criteria = criteriaCache.get();
FlowFile incomingFlowFile = session.get();
if (incomingFlowFile == null) {
return;
}
// record which rule should be applied to which flow file - when operating
// in 'use clone' mode, this collection will contain a number of entries
// that map to single element lists. this is because the original flowfile
// is cloned for each matching rule. in 'use original' mode, this collection
// will contain a single entry that maps a list of multiple rules. this is
// because is the original flowfile is used for all matching rules. in this
// case the order of the matching rules is preserved in the list
final Map<FlowFile, List<Rule>> matchedRules = new HashMap<>();
final Map<String, String> stateInitialAttributes;
final Map<String, String> stateWorkingAttributes;
StateMap stateMap = null;
try {
if (stateful) {
stateMap = context.getStateManager().getState(Scope.LOCAL);
stateInitialAttributes = stateMap.toMap();
stateWorkingAttributes = new HashMap<>(stateMap.toMap());
} else {
stateInitialAttributes = null;
stateWorkingAttributes = null;
}
} catch (IOException e) {
logger.error("Failed to get the initial state when processing {}; transferring FlowFile back to its incoming queue", new Object[] { incomingFlowFile }, e);
session.transfer(incomingFlowFile);
context.yield();
return;
}
Map<String, Action> defaultActions = this.defaultActions;
List<FlowFile> flowFilesToTransfer = new LinkedList<>();
// if there is update criteria specified, evaluate it
if (criteria != null && evaluateCriteria(session, context, criteria, incomingFlowFile, matchedRules, stateInitialAttributes)) {
// apply the actions for each rule and transfer the flowfile
for (final Map.Entry<FlowFile, List<Rule>> entry : matchedRules.entrySet()) {
FlowFile match = entry.getKey();
final List<Rule> rules = entry.getValue();
boolean updateWorking = incomingFlowFile.equals(match);
// execute each matching rule(s)
match = executeActions(session, context, rules, defaultActions, match, stateInitialAttributes, stateWorkingAttributes);
if (updateWorking) {
incomingFlowFile = match;
}
if (debugEnabled) {
logger.debug("Updated attributes for {}; transferring to '{}'", new Object[] { match, REL_SUCCESS.getName() });
}
// add the match to the list to transfer
flowFilesToTransfer.add(match);
}
} else {
// Either we're running without any rules or the FlowFile didn't match any
incomingFlowFile = executeActions(session, context, null, defaultActions, incomingFlowFile, stateInitialAttributes, stateWorkingAttributes);
if (debugEnabled) {
logger.debug("Updated attributes for {}; transferring to '{}'", new Object[] { incomingFlowFile, REL_SUCCESS.getName() });
}
// add the flowfile to the list to transfer
flowFilesToTransfer.add(incomingFlowFile);
}
if (stateInitialAttributes != null) {
try {
// Able to use "equals()" since we're just checking if the map was modified at all
if (!stateWorkingAttributes.equals(stateInitialAttributes)) {
boolean setState = context.getStateManager().replace(stateMap, stateWorkingAttributes, Scope.LOCAL);
if (!setState) {
logger.warn("Failed to update the state after successfully processing {} due to having an old version of the StateMap. This is normally due to multiple threads running at " + "once; transferring to '{}'", new Object[] { incomingFlowFile, REL_FAILED_SET_STATE.getName() });
flowFilesToTransfer.remove(incomingFlowFile);
if (flowFilesToTransfer.size() > 0) {
session.remove(flowFilesToTransfer);
}
session.transfer(incomingFlowFile, REL_FAILED_SET_STATE);
return;
}
}
} catch (IOException e) {
logger.error("Failed to set the state after successfully processing {} due a failure when setting the state. This is normally due to multiple threads running at " + "once; transferring to '{}'", new Object[] { incomingFlowFile, REL_FAILED_SET_STATE.getName() }, e);
flowFilesToTransfer.remove(incomingFlowFile);
if (flowFilesToTransfer.size() > 0) {
session.remove(flowFilesToTransfer);
}
session.transfer(incomingFlowFile, REL_FAILED_SET_STATE);
context.yield();
return;
}
}
for (FlowFile toTransfer : flowFilesToTransfer) {
session.getProvenanceReporter().modifyAttributes(toTransfer);
}
session.transfer(flowFilesToTransfer, REL_SUCCESS);
}
Aggregations