use of javax.validation.ConstraintViolationException in project apex-core by apache.
the class OiOStreamTest method validatePositiveOiOOptionalInput.
@Test
public void validatePositiveOiOOptionalInput() {
LogicalPlan plan = new LogicalPlan();
RecoverableInputOperator inputOp1 = plan.addOperator("InputOperator1", new RecoverableInputOperator());
GenericOperator genOp = plan.addOperator("GenericOperator", new GenericOperator());
plan.addStream("OiO1", inputOp1.output, genOp.ip1).setLocality(Locality.THREAD_LOCAL);
try {
plan.validate();
Assert.assertTrue("OiO validation", true);
} catch (ConstraintViolationException ex) {
Assert.fail("OiO Single Connected InputPort");
}
}
use of javax.validation.ConstraintViolationException in project apex-core by apache.
the class OiOStreamTest method validatePositiveOiOiO.
@Test
public void validatePositiveOiOiO() {
logger.info("Checking the logic for sanity checking of OiO");
LogicalPlan plan = new LogicalPlan();
ThreadIdValidatingInputOperator inputOperator = plan.addOperator("inputOperator", new ThreadIdValidatingInputOperator());
ThreadIdValidatingGenericIntermediateOperator intermediateOperator = plan.addOperator("intermediateOperator", new ThreadIdValidatingGenericIntermediateOperator());
ThreadIdValidatingOutputOperator outputOperator = plan.addOperator("outputOperator", new ThreadIdValidatingOutputOperator());
plan.addStream("OiO1", inputOperator.output, intermediateOperator.input).setLocality(Locality.THREAD_LOCAL);
plan.addStream("OiO2", intermediateOperator.output, outputOperator.input).setLocality(Locality.THREAD_LOCAL);
try {
plan.validate();
Assert.assertTrue("OiOiO validation", true);
} catch (ConstraintViolationException ex) {
Assert.fail("OiOiO validation");
}
}
use of javax.validation.ConstraintViolationException in project apex-core by apache.
the class OiOStreamTest method validateNegativeOiO.
@Test
public void validateNegativeOiO() {
LogicalPlan plan = new LogicalPlan();
RecoverableInputOperator inputOp1 = plan.addOperator("InputOperator1", new RecoverableInputOperator());
RecoverableInputOperator inputOp2 = plan.addOperator("InputOperator2", new RecoverableInputOperator());
GenericOperator genOp = plan.addOperator("GenericOperator", new GenericOperator());
StreamMeta oio1 = plan.addStream("OiO1", inputOp1.output, genOp.ip1).setLocality(Locality.THREAD_LOCAL);
StreamMeta oio2 = plan.addStream("OiO2", inputOp2.output, genOp.ip2).setLocality(Locality.THREAD_LOCAL);
try {
plan.validate();
Assert.fail("OIO Both InputPorts");
} catch (ConstraintViolationException ex) {
Assert.assertTrue("OiO validation passed", true);
} catch (ValidationException ex) {
Assert.assertTrue("OiO validation passed", true);
}
oio1.setLocality(null);
try {
plan.validate();
Assert.fail("OIO First InputPort");
} catch (ConstraintViolationException ex) {
Assert.assertTrue("OiO validation passed", true);
} catch (ValidationException ex) {
Assert.assertTrue("OiO validation passed", true);
}
oio1.setLocality(Locality.THREAD_LOCAL);
oio2.setLocality(null);
try {
plan.validate();
Assert.fail("OIO Second InputPort");
} catch (ConstraintViolationException ex) {
Assert.assertTrue("OiO validation passed", true);
} catch (ValidationException ex) {
Assert.assertTrue("OiO validation passed", true);
}
}
use of javax.validation.ConstraintViolationException in project apex-core by apache.
the class OiOStreamTest method validateNegativeOiOiOdiamond.
@Test
public void validateNegativeOiOiOdiamond() {
logger.info("Checking the logic for sanity checking of OiO");
LogicalPlan plan = new LogicalPlan();
ThreadIdValidatingInputOperator inputOperator = plan.addOperator("inputOperator", new ThreadIdValidatingInputOperator());
ThreadIdValidatingGenericIntermediateOperator intermediateOperator1 = plan.addOperator("intermediateOperator1", new ThreadIdValidatingGenericIntermediateOperator());
ThreadIdValidatingGenericIntermediateOperator intermediateOperator2 = plan.addOperator("intermediateOperator2", new ThreadIdValidatingGenericIntermediateOperator());
ThreadIdValidatingGenericOperatorWithTwoInputPorts outputOperator = plan.addOperator("outputOperator", new ThreadIdValidatingGenericOperatorWithTwoInputPorts());
plan.addStream("OiOin", inputOperator.output, intermediateOperator1.input, intermediateOperator2.input).setLocality(Locality.THREAD_LOCAL);
plan.addStream("OiOout1", intermediateOperator1.output, outputOperator.input).setLocality(Locality.THREAD_LOCAL);
plan.addStream("nonOiOout2", intermediateOperator2.output, outputOperator.input2).setLocality(null);
try {
plan.validate();
Assert.fail("OIOIO negative diamond");
} catch (ConstraintViolationException ex) {
Assert.assertTrue("OIOIO negative diamond", true);
} catch (ValidationException ex) {
Assert.assertTrue("OIOIO negative diamond", true);
}
}
use of javax.validation.ConstraintViolationException in project apex-core by apache.
the class LogicalPlan method validate.
/**
* Validate the plan. Includes checks that required ports are connected,
* required configuration parameters specified, graph free of cycles etc.
*
* @throws ConstraintViolationException
*/
public void validate() throws ConstraintViolationException {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
checkAttributeValueSerializable(this.getAttributes(), DAG.class.getName());
// clear oioRoot values in all operators
for (OperatorMeta n : operators.values()) {
n.oioRoot = null;
}
// clear visited on all operators
for (OperatorMeta n : operators.values()) {
n.nindex = null;
n.lowlink = null;
// validate configuration
Set<ConstraintViolation<Operator>> constraintViolations = validator.validate(n.getOperator());
if (!constraintViolations.isEmpty()) {
Set<ConstraintViolation<?>> copySet = new HashSet<>(constraintViolations.size());
// (should be public <T> ConstraintViolationException(String message, Set<ConstraintViolation<T>> constraintViolations) { ... })
for (ConstraintViolation<Operator> cv : constraintViolations) {
copySet.add(cv);
}
throw new ConstraintViolationException("Operator " + n.getName() + " violates constraints " + copySet, copySet);
}
OperatorMeta.PortMapping portMapping = n.getPortMapping();
checkAttributeValueSerializable(n.getAttributes(), n.getName());
// Check operator annotation
if (n.operatorAnnotation != null) {
// Check if partition property of the operator is being honored
if (!n.operatorAnnotation.partitionable()) {
// Check if any of the input ports have partition attributes set
for (InputPortMeta pm : portMapping.inPortMap.values()) {
Boolean paralellPartition = pm.getValue(PortContext.PARTITION_PARALLEL);
if (paralellPartition) {
throw new ValidationException("Operator " + n.getName() + " is not partitionable but PARTITION_PARALLEL attribute is set");
}
}
// Check if the operator implements Partitioner
if (n.getValue(OperatorContext.PARTITIONER) != null || n.attributes != null && !n.attributes.contains(OperatorContext.PARTITIONER) && Partitioner.class.isAssignableFrom(n.getOperator().getClass())) {
throw new ValidationException("Operator " + n.getName() + " provides partitioning capabilities but the annotation on the operator class declares it non partitionable!");
}
}
// a multiple of application window count
if (!n.operatorAnnotation.checkpointableWithinAppWindow()) {
if (n.getValue(OperatorContext.CHECKPOINT_WINDOW_COUNT) % n.getValue(OperatorContext.APPLICATION_WINDOW_COUNT) != 0) {
throw new ValidationException("Operator " + n.getName() + " cannot be check-pointed between an application window " + "but the checkpoint-window-count " + n.getValue(OperatorContext.CHECKPOINT_WINDOW_COUNT) + " is not a multiple application-window-count " + n.getValue(OperatorContext.APPLICATION_WINDOW_COUNT));
}
}
}
// check that non-optional ports are connected
for (InputPortMeta pm : portMapping.inPortMap.values()) {
checkAttributeValueSerializable(pm.getAttributes(), n.getName() + "." + pm.getPortName());
StreamMeta sm = n.inputStreams.get(pm);
if (sm == null) {
if ((pm.portAnnotation == null || !pm.portAnnotation.optional()) && pm.classDeclaringHiddenPort == null) {
throw new ValidationException("Input port connection required: " + n.name + "." + pm.getPortName());
}
} else {
if (pm.classDeclaringHiddenPort != null) {
throw new ValidationException(String.format("Invalid port connected: %s.%s is hidden by %s.%s", pm.classDeclaringHiddenPort.getName(), pm.getPortName(), pm.operatorMeta.getOperator().getClass().getName(), pm.getPortName()));
}
// check locality constraints
DAG.Locality locality = sm.getLocality();
if (locality == DAG.Locality.THREAD_LOCAL) {
if (n.inputStreams.size() > 1) {
validateThreadLocal(n);
}
}
if (pm.portAnnotation != null && pm.portAnnotation.schemaRequired()) {
//since schema is required, the port attribute TUPLE_CLASS should be present
if (pm.attributes.get(PortContext.TUPLE_CLASS) == null) {
throw new ValidationException("Attribute " + PortContext.TUPLE_CLASS.getName() + " missing on port : " + n.name + "." + pm.getPortName());
}
}
}
}
for (OutputPortMeta pm : portMapping.outPortMap.values()) {
checkAttributeValueSerializable(pm.getAttributes(), n.getName() + "." + pm.getPortName());
if (!n.outputStreams.containsKey(pm)) {
if ((pm.portAnnotation != null && !pm.portAnnotation.optional()) && pm.classDeclaringHiddenPort == null) {
throw new ValidationException("Output port connection required: " + n.name + "." + pm.getPortName());
}
} else {
//port is connected
if (pm.classDeclaringHiddenPort != null) {
throw new ValidationException(String.format("Invalid port connected: %s.%s is hidden by %s.%s", pm.classDeclaringHiddenPort.getName(), pm.getPortName(), pm.operatorMeta.getOperator().getClass().getName(), pm.getPortName()));
}
if (pm.portAnnotation != null && pm.portAnnotation.schemaRequired()) {
//since schema is required, the port attribute TUPLE_CLASS should be present
if (pm.attributes.get(PortContext.TUPLE_CLASS) == null) {
throw new ValidationException("Attribute " + PortContext.TUPLE_CLASS.getName() + " missing on port : " + n.name + "." + pm.getPortName());
}
}
}
}
}
ValidationContext validatonContext = new ValidationContext();
for (OperatorMeta n : operators.values()) {
if (n.nindex == null) {
findStronglyConnected(n, validatonContext);
}
}
if (!validatonContext.invalidCycles.isEmpty()) {
throw new ValidationException("Loops in graph: " + validatonContext.invalidCycles);
}
List<List<String>> invalidDelays = new ArrayList<>();
for (OperatorMeta n : rootOperators) {
findInvalidDelays(n, invalidDelays, new Stack<OperatorMeta>());
}
if (!invalidDelays.isEmpty()) {
throw new ValidationException("Invalid delays in graph: " + invalidDelays);
}
for (StreamMeta s : streams.values()) {
if (s.source == null) {
throw new ValidationException("Stream source not connected: " + s.getName());
}
if (s.sinks.isEmpty()) {
throw new ValidationException("Stream sink not connected: " + s.getName());
}
}
// Validate root operators are input operators
for (OperatorMeta om : this.rootOperators) {
if (!(om.getOperator() instanceof InputOperator)) {
throw new ValidationException(String.format("Root operator: %s is not a Input operator", om.getName()));
}
}
// processing mode
Set<OperatorMeta> visited = Sets.newHashSet();
for (OperatorMeta om : this.rootOperators) {
validateProcessingMode(om, visited);
}
validateAffinityRules();
}
Aggregations