/** * 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.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.function.Supplier; import org.apache.camel.ComponentVerifier; import org.apache.camel.IllegalOptionException; import org.apache.camel.NoSuchOptionException; import org.apache.camel.util.function.ThrowingBiConsumer; import org.apache.camel.util.function.ThrowingConsumer; public final class ResultBuilder { private Optional<ComponentVerifier.Scope> scope; private Optional<ComponentVerifier.Result.Status> status; private List<ComponentVerifier.VerificationError> verificationErrors; public ResultBuilder() { this.scope = Optional.empty(); this.status = scope.empty(); } // ********************************** // Accessors // ********************************** public ResultBuilder scope(ComponentVerifier.Scope scope) { this.scope = Optional.of(scope); return this; } public ResultBuilder status(ComponentVerifier.Result.Status status) { this.status = Optional.of(status); return this; } public ResultBuilder error(ComponentVerifier.VerificationError verificationError) { if (this.verificationErrors == null) { this.verificationErrors = new ArrayList<>(); } this.verificationErrors.add(verificationError); this.status = Optional.of(ComponentVerifier.Result.Status.ERROR); return this; } public ResultBuilder error(Optional<ComponentVerifier.VerificationError> error) { error.ifPresent(e -> error(e)); return this; } public ResultBuilder error(Supplier<Optional<ComponentVerifier.VerificationError>> supplier) { return error(supplier.get()); } public ResultBuilder error(ThrowingConsumer<ResultBuilder, Exception> consumer) { try { consumer.accept(this); } catch (NoSuchOptionException e) { error(ResultErrorBuilder.withMissingOption(e.getOptionName()).build()); } catch (IllegalOptionException e) { error(ResultErrorBuilder.withIllegalOption(e.getOptionName(), e.getOptionValue()).build()); } catch (Exception e) { error(ResultErrorBuilder.withException(e).build()); } return this; } public <T> ResultBuilder error(T data, ThrowingBiConsumer<ResultBuilder, T, Exception> consumer) { try { consumer.accept(this, data); } catch (NoSuchOptionException e) { error(ResultErrorBuilder.withMissingOption(e.getOptionName()).build()); } catch (IllegalOptionException e) { error(ResultErrorBuilder.withIllegalOption(e.getOptionName(), e.getOptionValue()).build()); } catch (Exception e) { error(ResultErrorBuilder.withException(e).build()); } return this; } public ResultBuilder errors(List<ComponentVerifier.VerificationError> verificationErrors) { verificationErrors.forEach(this::error); return this; } // ********************************** // Build // ********************************** public ComponentVerifier.Result build() { return new DefaultResult( scope.orElse(ComponentVerifier.Scope.PARAMETERS), status.orElse(ComponentVerifier.Result.Status.UNSUPPORTED), verificationErrors != null ? Collections.unmodifiableList(verificationErrors) : Collections.emptyList() ); } // ********************************** // Helpers // ********************************** public static ResultBuilder withStatus(ComponentVerifier.Result.Status status) { return new ResultBuilder().status(status); } public static ResultBuilder withStatusAndScope(ComponentVerifier.Result.Status status, ComponentVerifier.Scope scope) { return new ResultBuilder().status(status).scope(scope); } public static ResultBuilder withScope(ComponentVerifier.Scope scope) { return new ResultBuilder().scope(scope); } public static ResultBuilder unsupported() { return withStatusAndScope(ComponentVerifier.Result.Status.UNSUPPORTED, ComponentVerifier.Scope.PARAMETERS); } public static ResultBuilder unsupportedScope(ComponentVerifier.Scope scope) { return withStatusAndScope(ComponentVerifier.Result.Status.UNSUPPORTED, scope); } }