@Override public InetAddress getLocalAddress() { readLock.lock(); try { if (nicValidationResult != null && !nicValidationResult.isValid()) { return null; } return localAddress; } finally { readLock.unlock(); } }
public boolean isValid() { for (final ValidationResult result : validate()) { if (!result.isValid()) { return false; } } return true; }
@Override public boolean isValid() { if (!targetExists.get()) { return false; } if (getConnectableType() == ConnectableType.REMOTE_OUTPUT_PORT && getConnections(Relationship.ANONYMOUS).isEmpty()) { // if it's an output port, ensure that there is an outbound connection return false; } final boolean groupValid = remoteGroup.validate().stream() .allMatch(result -> result.isValid()); return groupValid; }
public void assertValid() { final StringBuilder sb = new StringBuilder(); int failureCount = 0; for (final ValidationResult result : validate()) { if (!result.isValid()) { sb.append(result.toString()).append("\n"); failureCount++; } } if (failureCount > 0) { Assert.fail("Processor has " + failureCount + " validation failures:\n" + sb.toString()); } }
@Override public void verifyCanStart() { super.verifyCanStart(); if (getConnectableType() == ConnectableType.REMOTE_INPUT_PORT && getIncomingConnections().isEmpty()) { throw new IllegalStateException("Port " + getName() + " has no incoming connections"); } final Optional<ValidationResult> resultOption = remoteGroup.validate().stream() .filter(result -> !result.isValid()) .findFirst(); if (resultOption.isPresent()) { throw new IllegalStateException("Remote Process Group is not valid: " + resultOption.get().toString()); } }
@Override public ValidationResult validate(final String subject, final String value, final ValidationContext context) { final String[] filenames = value.split(","); for (final String filename : filenames) { final ValidationResult result = StandardValidators.FILE_EXISTS_VALIDATOR.validate(subject, filename.trim(), context); if (!result.isValid()) { return result; } } return new ValidationResult.Builder().subject(subject).input(value).valid(true).build(); } }
@Override public ValidationResult validate(final String subject, final String value, final ValidationContext context) { final String[] filenames = value.split(","); for (final String filename : filenames) { final ValidationResult result = StandardValidators.FILE_EXISTS_VALIDATOR.validate(subject, filename.trim(), context); if (!result.isValid()) { return result; } } return new ValidationResult.Builder().subject(subject).input(value).valid(true).build(); } }
@Override public void assertValid(final ControllerService service) { final StateManager serviceStateManager = controllerServiceStateManagers.get(service.getIdentifier()); if (serviceStateManager == null) { throw new IllegalStateException("Controller Service has not been added to this TestRunner via the #addControllerService method"); } final ValidationContext validationContext = new MockValidationContext(context, serviceStateManager, variableRegistry).getControllerServiceValidationContext(service); final Collection<ValidationResult> results = context.getControllerService(service.getIdentifier()).validate(validationContext); for (final ValidationResult result : results) { if (!result.isValid()) { Assert.fail("Expected Controller Service to be valid but it is invalid due to: " + result.toString()); } } }
@Override public void assertNotValid(final ControllerService service) { final StateManager serviceStateManager = controllerServiceStateManagers.get(service.getIdentifier()); if (serviceStateManager == null) { throw new IllegalStateException("Controller Service has not been added to this TestRunner via the #addControllerService method"); } final ValidationContext validationContext = new MockValidationContext(context, serviceStateManager, variableRegistry).getControllerServiceValidationContext(service); final Collection<ValidationResult> results = context.getControllerService(service.getIdentifier()).validate(validationContext); for (final ValidationResult result : results) { if (!result.isValid()) { return; } } Assert.fail("Expected Controller Service " + service + " to be invalid but it is valid"); }
@Override public void enableControllerService(final ControllerService service) { final ControllerServiceConfiguration configuration = context.getConfiguration(service.getIdentifier()); if (configuration == null) { throw new IllegalArgumentException("Controller Service " + service + " is not known"); } if (configuration.isEnabled()) { throw new IllegalStateException("Cannot enable Controller Service " + service + " because it is not disabled"); } // ensure controller service is valid before enabling final ValidationContext validationContext = new MockValidationContext(context).getControllerServiceValidationContext(service); final Collection<ValidationResult> results = context.getControllerService(service.getIdentifier()).validate(validationContext); for (final ValidationResult result : results) { if (!result.isValid()) { throw new IllegalStateException("Cannot enable Controller Service " + service + " because it is in an invalid state: " + result.toString()); } } try { final ConfigurationContext configContext = new MockConfigurationContext(service, configuration.getProperties(), context,variableRegistry); ReflectionUtils.invokeMethodsWithAnnotation(OnEnabled.class, service, configContext); } catch (final InvocationTargetException ite) { ite.getCause().printStackTrace(); Assert.fail("Failed to enable Controller Service " + service + " due to " + ite.getCause()); } catch (final Exception e) { e.printStackTrace(); Assert.fail("Failed to enable Controller Service " + service + " due to " + e); } configuration.setEnabled(true); }
@Override public ValidationResult validate(String subject, String input, ValidationContext context) { ValidationResult result = new ValidationResult.Builder() .subject(subject).valid(true).input(input).build(); List<String> args = ArgumentUtils.splitArgs(input, context.getProperty(ARG_DELIMITER).getValue().charAt(0)); for (String arg : args) { ValidationResult valResult = ATTRIBUTE_EXPRESSION_LANGUAGE_VALIDATOR.validate(subject, arg, context); if (!valResult.isValid()) { result = valResult; break; } } return result; } }).build();
@Override protected Collection<ValidationResult> customValidate(final ValidationContext context) { final List<ValidationResult> validationResults = new ArrayList<>(super.customValidate(context)); final Validator rateValidator; switch (context.getProperty(RATE_CONTROL_CRITERIA).getValue().toLowerCase()) { case DATA_RATE: rateValidator = StandardValidators.DATA_SIZE_VALIDATOR; break; case ATTRIBUTE_RATE: rateValidator = StandardValidators.POSITIVE_LONG_VALIDATOR; final String rateAttr = context.getProperty(RATE_CONTROL_ATTRIBUTE_NAME).getValue(); if (rateAttr == null) { validationResults.add(new ValidationResult.Builder() .subject(RATE_CONTROL_ATTRIBUTE_NAME.getName()) .explanation("<Rate Controlled Attribute> property must be set if using <Rate Control Criteria> of 'attribute value'") .build()); } break; case FLOWFILE_RATE: default: rateValidator = StandardValidators.POSITIVE_LONG_VALIDATOR; break; } final ValidationResult rateResult = rateValidator.validate("Maximum Rate", context.getProperty(MAX_RATE).getValue(), context); if (!rateResult.isValid()) { validationResults.add(rateResult); } return validationResults; }
@Override protected Collection<ValidationResult> customValidate(final ValidationContext validationContext) { final List<ValidationResult> problems = new ArrayList<>(super.customValidate(validationContext)); // If the capture group zero is not going to be included, each dynamic property must have at least one group final boolean includeCaptureGroupZero = validationContext.getProperty(INCLUDE_CAPTURE_GROUP_ZERO).getValue().equalsIgnoreCase("true"); getLogger().debug("Include capture group zero is " + includeCaptureGroupZero); if (!includeCaptureGroupZero) { final Validator oneGroupMinimumValidator = StandardValidators.createRegexValidator(1, 40, true); for (Map.Entry<PropertyDescriptor, String> prop : validationContext.getProperties().entrySet()) { PropertyDescriptor pd = prop.getKey(); if (pd.isDynamic()) { String value = validationContext.getProperty(pd).getValue(); getLogger().debug("Evaluating dynamic property " + pd.getDisplayName() + " (" + pd.getName() + ") with value " + value); ValidationResult result = oneGroupMinimumValidator.validate(pd.getDisplayName(), value, validationContext); getLogger().debug("Validation result: " + result.toString()); if (!result.isValid()) { problems.add(result); } } } } return problems; }
@Override public ValidationResult validate(final String subject, final String input, final ValidationContext context) { final String[] splits = input.split(","); if (splits.length == 0) { return new ValidationResult.Builder() .subject(subject) .input(input) .valid(false) .explanation("At least one URL must be specified") .build(); } for (final String split : splits) { final String url = split.trim(); final ValidationResult result = StandardValidators.URL_VALIDATOR.validate(subject, url, context); if (result != null && !result.isValid()) { return result; } } return new ValidationResult.Builder().subject(subject).input(input).valid(true).build(); }
@Test public void testInvalidOnNonBooleanProperty() { final RouteOnAttribute proc = new RouteOnAttribute(); final MockProcessContext ctx = new MockProcessContext(proc); final ValidationResult validationResult = ctx.setProperty("RouteA", "${a:length()"); // Should be boolean assertFalse(validationResult.isValid()); }
@Test public void testInvalidOnMisconfiguredProperty() { final RouteOnAttribute proc = new RouteOnAttribute(); final MockProcessContext ctx = new MockProcessContext(proc); final ValidationResult validationResult = ctx.setProperty("RouteA", "${a:equals('b')"); // Missing closing brace assertFalse(validationResult.isValid()); }
@Test public void testFilenameUpdatedOnCompress() throws IOException { final TestRunner runner = TestRunners.newTestRunner(CompressContent.class); runner.setProperty(CompressContent.MODE, "compress"); runner.setProperty(CompressContent.COMPRESSION_FORMAT, "gzip"); assertTrue(runner.setProperty(CompressContent.UPDATE_FILENAME, "true").isValid()); runner.enqueue(Paths.get("src/test/resources/CompressedData/SampleFile.txt")); runner.run(); runner.assertAllFlowFilesTransferred(CompressContent.REL_SUCCESS, 1); MockFlowFile flowFile = runner.getFlowFilesForRelationship(CompressContent.REL_SUCCESS).get(0); flowFile.assertAttributeEquals("filename", "SampleFile.txt.gz"); }
public static Validator createListValidator(boolean trimEntries, boolean excludeEmptyEntries, Validator validator) { return (subject, input, context) -> { if (context.isExpressionLanguageSupported(subject) && context.isExpressionLanguagePresent(input)) { return new ValidationResult.Builder().subject(subject).input(input).explanation("Expression Language Present").valid(true).build(); } try { if (input == null) { return new ValidationResult.Builder().subject(subject).input(null).explanation("List must have at least one non-empty element").valid(false).build(); } final String[] list = input.split(","); for (String item : list) { String itemToValidate = trimEntries ? item.trim() : item; if (!isEmpty(itemToValidate) || !excludeEmptyEntries) { ValidationResult result = validator.validate(subject, itemToValidate, context); if (!result.isValid()) { return result; } } } return new ValidationResult.Builder().subject(subject).input(input).explanation("Valid List").valid(true).build(); } catch (final Exception e) { return new ValidationResult.Builder().subject(subject).input(input).explanation("Not a valid list").valid(false).build(); } }; }
@Test public void testDecompressFailure() throws IOException { final TestRunner runner = TestRunners.newTestRunner(CompressContent.class); runner.setProperty(CompressContent.MODE, "decompress"); runner.setProperty(CompressContent.COMPRESSION_FORMAT, "gzip"); byte[] data = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; runner.enqueue(data); assertTrue(runner.setProperty(CompressContent.UPDATE_FILENAME, "true").isValid()); runner.run(); runner.assertQueueEmpty(); runner.assertAllFlowFilesTransferred(CompressContent.REL_FAILURE, 1); runner.getFlowFilesForRelationship(CompressContent.REL_FAILURE).get(0).assertContentEquals(data); } }
@Override public ValidationResult validate(final String subject, final String input, final ValidationContext context) { if (context.isExpressionLanguageSupported(subject) && context.isExpressionLanguagePresent(input)) { return new ValidationResult.Builder().subject(subject).input(input).explanation("Expression Language Present").valid(true).build(); } final ValidationResult vr = DATA_SIZE_VALIDATOR.validate(subject, input, context); if (!vr.isValid()) { return vr; } final long dataSizeBytes = DataUnit.parseDataSize(input, DataUnit.B).longValue(); if (dataSizeBytes < minBytesInclusive) { return new ValidationResult.Builder().subject(subject).input(input).valid(false).explanation("Cannot be smaller than " + minBytesInclusive + " bytes").build(); } if (dataSizeBytes > maxBytesInclusive) { return new ValidationResult.Builder().subject(subject).input(input).valid(false).explanation("Cannot be larger than " + maxBytesInclusive + " bytes").build(); } return new ValidationResult.Builder().subject(subject).input(input).valid(true).build(); } };