/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.nifi.processor.util.pattern;
import static org.apache.nifi.processor.util.pattern.ErrorTypes.Destination.Failure;
import static org.apache.nifi.processor.util.pattern.ErrorTypes.Destination.ProcessException;
import static org.apache.nifi.processor.util.pattern.ErrorTypes.Destination.Retry;
import static org.apache.nifi.processor.util.pattern.ErrorTypes.Destination.Self;
import static org.apache.nifi.processor.util.pattern.ErrorTypes.Penalty.None;
import static org.apache.nifi.processor.util.pattern.ErrorTypes.Penalty.Penalize;
import static org.apache.nifi.processor.util.pattern.ErrorTypes.Penalty.Yield;
/**
* Represents general error types and how it should be treated.
*/
public enum ErrorTypes {
/**
* Procedure setting has to be fixed, otherwise the same error would occur irrelevant to the input.
* In order to NOT call failing process frequently, this should be yielded.
*/
PersistentFailure(ProcessException, Yield),
/**
* It is unknown whether the error is persistent or temporal, related to the input or not.
*/
UnknownFailure(ProcessException, None),
/**
* The input will be sent to the failure route for recovery without penalizing.
* Basically, the input should not be sent to the same procedure again unless the issue has been solved.
*/
InvalidInput(Failure, None),
/**
* The procedure is temporarily unavailable, usually due to the external service unavailability.
* Retrying maybe successful, but it should be yielded for a while.
*/
TemporalFailure(Retry, Yield),
/**
* The input was not processed successfully due to some temporal error
* related to the specifics of the input. Retrying maybe successful,
* but it should be penalized for a while.
*/
TemporalInputFailure(Retry, Penalize),
/**
* The input was not ready for being processed. It will be kept in the incoming queue and also be penalized.
*/
Defer(Self, Penalize);
private final Destination destination;
private final Penalty penalty;
ErrorTypes(Destination destination, Penalty penalty){
this.destination = destination;
this.penalty = penalty;
}
public Result result() {
return new Result(destination, penalty);
}
/**
* Represents the destination of input.
*/
public enum Destination {
ProcessException, Failure, Retry, Self
}
/**
* Indicating yield or penalize the processing when transfer the input.
*/
public enum Penalty {
Yield, Penalize, None
}
public Destination destination(){
return this.destination;
}
public Penalty penalty(){
return this.penalty;
}
/**
* Result represents a result of a procedure.
* ErrorTypes enum contains basic error result patterns.
*/
public static class Result {
private final Destination destination;
private final Penalty penalty;
public Result(Destination destination, Penalty penalty) {
this.destination = destination;
this.penalty = penalty;
}
public Destination destination() {
return destination;
}
public Penalty penalty() {
return penalty;
}
@Override
public String toString() {
return "Result{" +
"destination=" + destination +
", penalty=" + penalty +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Result result = (Result) o;
if (destination != result.destination) return false;
return penalty == result.penalty;
}
@Override
public int hashCode() {
int result = destination != null ? destination.hashCode() : 0;
result = 31 * result + (penalty != null ? penalty.hashCode() : 0);
return result;
}
}
}