@Override public void onTrigger(final ProcessContext context, final ProcessSession session) { final ComponentLog logger = getLogger(); final Criteria criteria = criteriaCache.get(); List<FlowFile> flowFiles = session.get(100); if (flowFiles.isEmpty()) { return; } final Map<PropertyDescriptor, String> properties = context.getProperties(); // get the default actions final Map<String, Action> defaultActions = getDefaultActions(properties); // 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 perserved in the list final Map<FlowFile, List<Rule>> matchedRules = new HashMap<>(); for (FlowFile flowFile : flowFiles) { matchedRules.clear(); // if there is update criteria specified, evaluate it if (criteria != null && evaluateCriteria(session, context, criteria, flowFile, matchedRules)) { // 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(); // execute each matching rule(s) match = executeActions(session, context, rules, defaultActions, match); logger.info( "Updated attributes for {}; transferring to '{}'", new Object[] {match, REL_SUCCESS.getName()}); // transfer the match session.getProvenanceReporter().modifyAttributes(match); session.transfer(match, REL_SUCCESS); } } else { // transfer the flowfile to no match (that has the default actions applied) flowFile = executeActions(session, context, null, defaultActions, flowFile); logger.info( "Updated attributes for {}; transferring to '{}'", new Object[] {flowFile, REL_SUCCESS.getName()}); session.getProvenanceReporter().modifyAttributes(flowFile); session.transfer(flowFile, REL_SUCCESS); } } }
protected String processFlowFile( final ComponentLog logger, final DebugLevels logLevel, final FlowFile flowFile, final ProcessSession session, final ProcessContext context) { final Set<String> attributeKeys = getAttributesToLog(flowFile.getAttributes().keySet(), context); final ComponentLog LOG = getLogger(); final String dashedLine; String logPrefix = context.getProperty(LOG_PREFIX).evaluateAttributeExpressions(flowFile).getValue(); if (StringUtil.isBlank(logPrefix)) { dashedLine = StringUtils.repeat('-', 50); } else { // abbreviate long lines logPrefix = StringUtils.abbreviate(logPrefix, 40); // center the logPrefix and pad with dashes logPrefix = StringUtils.center(logPrefix, 40, '-'); // five dashes on the left and right side, plus the dashed logPrefix dashedLine = StringUtils.repeat('-', 5) + logPrefix + StringUtils.repeat('-', 5); } // Pretty print metadata final StringBuilder message = new StringBuilder(); message.append("logging for flow file ").append(flowFile); message.append("\n"); message.append(dashedLine); message.append("\nStandard FlowFile Attributes"); message.append( String.format( "\nKey: '%1$s'\n\tValue: '%2$s'", "entryDate", new Date(flowFile.getEntryDate()))); message.append( String.format( "\nKey: '%1$s'\n\tValue: '%2$s'", "lineageStartDate", new Date(flowFile.getLineageStartDate()))); message.append(String.format("\nKey: '%1$s'\n\tValue: '%2$s'", "fileSize", flowFile.getSize())); message.append("\nFlowFile Attribute Map Content"); for (final String key : attributeKeys) { message.append( String.format("\nKey: '%1$s'\n\tValue: '%2$s'", key, flowFile.getAttribute(key))); } message.append("\n"); message.append(dashedLine); // The user can request to log the payload final boolean logPayload = context.getProperty(LOG_PAYLOAD).asBoolean(); if (logPayload) { message.append("\n"); if (flowFile.getSize() < ONE_MB) { final FlowFilePayloadCallback callback = new FlowFilePayloadCallback(); session.read(flowFile, callback); message.append(callback.getContents()); } else { message.append("\n Not including payload since it is larger than one mb."); } } final String outputMessage = message.toString().trim(); // Uses optional property to specify logging level switch (logLevel) { case info: LOG.info(outputMessage); break; case debug: LOG.debug(outputMessage); break; case warn: LOG.warn(outputMessage); break; case trace: LOG.trace(outputMessage); break; case error: LOG.error(outputMessage); break; default: LOG.debug(outputMessage); } return outputMessage; }