/**
* 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.builder;
import org.apache.camel.CamelContext;
import org.apache.camel.Expression;
import org.apache.camel.Predicate;
import org.apache.camel.impl.validator.ProcessorValidator;
import org.apache.camel.model.language.ExpressionDefinition;
import org.apache.camel.model.validator.CustomValidatorDefinition;
import org.apache.camel.model.validator.EndpointValidatorDefinition;
import org.apache.camel.model.validator.PredicateValidatorDefinition;
import org.apache.camel.model.validator.ValidatorDefinition;
import org.apache.camel.spi.AsPredicate;
import org.apache.camel.spi.DataType;
import org.apache.camel.spi.Validator;
/**
* A <a href="http://camel.apache.org/dsl.html">Java DSL</a> which is
* used to build a {@link org.apache.camel.spi.Validator} and register into {@link org.apache.camel.CamelContext}.
* It requires a 'type' to be specified by type() method.
* And then you can choose a type of validator by withUri(), withPredicate(), withJava() or withBean() method.
*/
public class ValidatorBuilder {
private String type;
private String uri;
private ExpressionDefinition expression;
private Class<? extends Validator> clazz;
private String beanRef;
/**
* Set the data type name.
* If you specify 'xml:XYZ', the validator will be picked up if source type is
* 'xml:XYZ'. If you specify just 'xml', the validator matches with all of
* 'xml' source type like 'xml:ABC' or 'xml:DEF'.
*
* @param type 'from' data type name
*/
public ValidatorBuilder type(String type) {
this.type = type;
return this;
}
/**
* Set the data type using Java class.
*
* @param type Java class represents data type
*/
public ValidatorBuilder type(Class<?> type) {
this.type = new DataType(type).toString();
return this;
}
/**
* Set the URI to be used for the endpoint {@link Validator}.
* @see {@link EndpointValidatorDefinition}, {@link ProcessorValidator}
*
* @param uri endpoint URI
*/
public ValidatorBuilder withUri(String uri) {
resetType();
this.uri = uri;
return this;
}
/**
* Set the {@link Expression} to be used for the predicate {@link Validator}.
* @see {@link PredicateValidatorDefinition}, {@link ProcessorValidator}
*
* @param expression validation expression
*/
public ValidatorBuilder withExpression(@AsPredicate Expression expression) {
resetType();
this.expression = new ExpressionDefinition(expression);
return this;
}
/**
* Set the {@link Predicate} to be used for the predicate {@link Validator}.
* @see {@link PredicateValidatorDefinition}, {@link ProcessorValidator}
*
* @param predicate validation predicate
*/
public ValidatorBuilder withExpression(@AsPredicate Predicate predicate) {
resetType();
this.expression = new ExpressionDefinition(predicate);
return this;
}
/**
* Set the Java {@code Class} represents a custom {@code Validator} implementation class.
* @see {@code CustomValidatorDefinition}
*
* @param clazz {@code Class} object represents custom validator implementation
*/
public ValidatorBuilder withJava(Class<? extends Validator> clazz) {
resetType();
this.clazz = clazz;
return this;
}
/**
* Set the Java Bean name to be used for custom {@code Validator}.
* @see {@code CustomValidatorDefinition}
*
* @param ref bean name for the custom {@code Validator}
*/
public ValidatorBuilder withBean(String ref) {
resetType();
this.beanRef = ref;
return this;
}
private void resetType() {
this.uri = null;
this.expression = null;
this.clazz = null;
this.beanRef = null;
}
/**
* Configure a Validator according to the configurations built on this builder
* and register it into given {@code CamelContext}.
*
* @param camelContext {@code CamelContext}
*/
public void configure(CamelContext camelContext) {
ValidatorDefinition validator;
if (uri != null) {
EndpointValidatorDefinition etd = new EndpointValidatorDefinition();
etd.setUri(uri);
validator = etd;
} else if (expression != null) {
PredicateValidatorDefinition dtd = new PredicateValidatorDefinition();
dtd.setExpression(expression);
validator = dtd;
} else if (clazz != null) {
CustomValidatorDefinition ctd = new CustomValidatorDefinition();
ctd.setClassName(clazz.getName());
validator = ctd;
} else if (beanRef != null) {
CustomValidatorDefinition ctd = new CustomValidatorDefinition();
ctd.setRef(beanRef);
validator = ctd;
} else {
throw new IllegalArgumentException("No Validator type was specified");
}
validator.setType(type);
camelContext.getValidators().add(validator);
}
}