/**
* 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.camel.impl.verifier;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Supplier;
import org.apache.camel.ComponentVerifier.VerificationError;
import org.apache.camel.util.ObjectHelper;
public final class ResultErrorBuilder {
private VerificationError.Code code;
private String description;
private Set<String> parameters;
private Map<VerificationError.Attribute, Object> attributes;
public ResultErrorBuilder() {
}
// **********************************
// Accessors
// **********************************
public ResultErrorBuilder code(VerificationError.Code code) {
this.code = code;
return this;
}
public ResultErrorBuilder code(String code) {
code(VerificationError.asCode(code));
return this;
}
public ResultErrorBuilder description(String description) {
this.description = description;
return this;
}
public ResultErrorBuilder parameterKey(String parameter) {
if (parameter != null) {
if (this.parameters == null) {
this.parameters = new HashSet<>();
}
this.parameters.add(parameter);
}
return this;
}
public ResultErrorBuilder parameterKeys(Collection<String> parameterList) {
if (parameterList != null) {
parameterList.forEach(this::parameterKey);
}
return this;
}
public ResultErrorBuilder detail(String key, Object value) {
detail(VerificationError.asAttribute(key), value);
return this;
}
public ResultErrorBuilder detail(VerificationError.Attribute key, Object value) {
if (value != null) {
if (this.attributes == null) {
this.attributes = new HashMap<>();
}
this.attributes.put(key, value);
}
return this;
}
public <T> ResultErrorBuilder detail(String key, Supplier<Optional<T>> supplier) {
detail(VerificationError.asAttribute(key), supplier);
return this;
}
public <T> ResultErrorBuilder detail(VerificationError.Attribute key, Supplier<Optional<T>> supplier) {
supplier.get().ifPresent(value -> detail(key, value));
return this;
}
public ResultErrorBuilder details(Map<VerificationError.Attribute, Object> details) {
for (Map.Entry<VerificationError.Attribute, Object> entry : details.entrySet()) {
detail(entry.getKey(), entry.getValue());
}
return this;
}
// **********************************
// Build
// **********************************
public VerificationError build() {
return new DefaultResultVerificationError(
code,
description,
parameters != null ? Collections.unmodifiableSet(parameters) : Collections.emptySet(),
attributes != null ? Collections.unmodifiableMap(attributes) : Collections.emptyMap()
);
}
// **********************************
// Helpers
// **********************************
public static ResultErrorBuilder fromError(VerificationError error) {
return new ResultErrorBuilder()
.code(error.getCode())
.description(error.getDescription())
.parameterKeys(error.getParameterKeys())
.details(error.getDetails());
}
public static ResultErrorBuilder withCode(VerificationError.Code code) {
return new ResultErrorBuilder().code(code);
}
public static ResultErrorBuilder withCode(String code) {
return new ResultErrorBuilder().code(code);
}
public static ResultErrorBuilder withHttpCode(int code) {
return withCode(convertHttpCodeToErrorCode(code))
.detail(VerificationError.HttpAttribute.HTTP_CODE, code);
}
public static ResultErrorBuilder withHttpCodeAndText(int code, String text) {
return withCodeAndDescription(convertHttpCodeToErrorCode(code), text)
.detail(VerificationError.HttpAttribute.HTTP_CODE, code)
.detail(VerificationError.HttpAttribute.HTTP_TEXT, text);
}
private static VerificationError.StandardCode convertHttpCodeToErrorCode(int code) {
return code >= 400 && code < 500 ? VerificationError.StandardCode.AUTHENTICATION : VerificationError.StandardCode.GENERIC;
}
public static ResultErrorBuilder withCodeAndDescription(VerificationError.Code code, String description) {
return new ResultErrorBuilder().code(code).description(description);
}
public static ResultErrorBuilder withUnsupportedScope(String scope) {
return new ResultErrorBuilder()
.code(VerificationError.StandardCode.UNSUPPORTED_SCOPE)
.description("Unsupported scope: " + scope);
}
public static ResultErrorBuilder withUnsupportedComponent(String component) {
return new ResultErrorBuilder()
.code(VerificationError.StandardCode.UNSUPPORTED_COMPONENT)
.description("Unsupported component: " + component);
}
public static ResultErrorBuilder withException(Exception exception) {
return new ResultErrorBuilder()
.code(VerificationError.StandardCode.EXCEPTION)
.description(exception.getMessage())
.detail(VerificationError.ExceptionAttribute.EXCEPTION_INSTANCE, exception)
.detail(VerificationError.ExceptionAttribute.EXCEPTION_CLASS, exception.getClass().getName());
}
public static ResultErrorBuilder withMissingOption(String optionName) {
return new ResultErrorBuilder()
.code(VerificationError.StandardCode.MISSING_PARAMETER)
.description(optionName + " should be set")
.parameterKey(optionName);
}
public static ResultErrorBuilder withUnknownOption(String optionName) {
return new ResultErrorBuilder()
.code(VerificationError.StandardCode.UNKNOWN_PARAMETER)
.description("Unknown option " + optionName)
.parameterKey(optionName);
}
public static ResultErrorBuilder withIllegalOption(String optionName) {
return new ResultErrorBuilder()
.code(VerificationError.StandardCode.ILLEGAL_PARAMETER)
.description("Illegal option " + optionName)
.parameterKey(optionName);
}
public static ResultErrorBuilder withIllegalOption(String optionName, String optionValue) {
return ObjectHelper.isNotEmpty(optionValue)
? new ResultErrorBuilder()
.code(VerificationError.StandardCode.ILLEGAL_PARAMETER_VALUE)
.description(optionName + " has wrong value (" + optionValue + ")")
.parameterKey(optionName)
: withIllegalOption(optionName);
}
}