package aws.cfn.resources.shared; import software.amazon.cloudformation.proxy.HandlerErrorCode; import software.amazon.cloudformation.proxy.OperationStatus; import software.amazon.cloudformation.proxy.ProgressEvent; import java.io.PrintWriter; import java.io.StringWriter; public interface HandlerMixins { ResourceModel getModel(); default ProgressEvent success() { return ProgressEvent.builder() .resourceModel(getModel()) .status(OperationStatus.SUCCESS) .build(); } default ProgressEvent success(String message) { return ProgressEvent.builder() .resourceModel(getModel()) .status(OperationStatus.SUCCESS) .message(message) .build(); } default ProgressEvent failure(HandlerErrorCode code) { return failure(code, null); } default ProgressEvent failure(String message) { return failure(HandlerErrorCode.GeneralServiceException, message); } default ProgressEvent failure(Throwable exception) { // include stack traces StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); exception.printStackTrace(pw); return failure(sw.getBuffer().toString()); //return failure(""+exception); } default ProgressEvent failure(HandlerErrorCode code, String message) { return ProgressEvent.builder() .resourceModel(getModel()) .status(OperationStatus.FAILED) .errorCode(code) .message(message) .build(); } default ProgressEvent inProgress() { return ProgressEvent.builder() .resourceModel(getModel()) .status(OperationStatus.IN_PROGRESS) .build(); } class FailureToSetInResult extends RuntimeException { private static final long serialVersionUID = 1L; final ProgressEvent result; private FailureToSetInResult(ProgressEvent result) { this.result = result; } public ProgressEvent getResult() { return result; } @Override public String toString() { return getClass().getSimpleName()+"["+result.getErrorCode()+"]: "+result.getMessage(); } } default FailureToSetInResult fail(ProgressEvent failure) { throw new FailureToSetInResult(failure); } default FailureToSetInResult fail(Throwable exception) { return fail(failure(exception)); } default FailureToSetInResult failNotFound() { return fail(failure(HandlerErrorCode.NotFound, "The requested resource cannot be found.")); } default FailureToSetInResult fail(HandlerErrorCode code, String message) { return fail(failure(code, message)); } }