/**
* 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.model.DataFormatDefinition;
import org.apache.camel.model.transformer.CustomTransformerDefinition;
import org.apache.camel.model.transformer.DataFormatTransformerDefinition;
import org.apache.camel.model.transformer.EndpointTransformerDefinition;
import org.apache.camel.model.transformer.TransformerDefinition;
import org.apache.camel.spi.DataType;
import org.apache.camel.spi.Transformer;
/**
* A <a href="http://camel.apache.org/dsl.html">Java DSL</a> which is
* used to build a {@link org.apache.camel.spi.Transformer} and register into {@link org.apache.camel.CamelContext}.
* It requires 'scheme' or a pair of 'from' and 'to' to be specified by scheme(), from() and to() method.
* And then you can choose a type of transformer by withUri(), withDataFormat(), withJava() or withBean() method.
*/
public class TransformerBuilder {
private String scheme;
private String from;
private String to;
private String uri;
private DataFormatDefinition dataFormat;
private Class<? extends Transformer> clazz;
private String beanRef;
/**
* Set the scheme name supported by the transformer.
* If you specify 'csv', the transformer will be picked up for all of 'csv' from/to
* Java transformation. Note that the scheme matching is performed only when
* no exactly matched transformer exists.
*
* @param scheme scheme name
*/
public TransformerBuilder scheme(String scheme) {
this.scheme = scheme;
return this;
}
/**
* Set the 'from' data type name.
* If you specify 'xml:XYZ', the transformer will be picked up if source type is
* 'xml:XYZ'. If you specify just 'xml', the transformer matches with all of
* 'xml' source type like 'xml:ABC' or 'xml:DEF'.
*
* @param from 'from' data type name
*/
public TransformerBuilder fromType(String from) {
this.from = from;
return this;
}
/**
* Set the 'from' data type using Java class.
*
* @param clazz 'from' Java class
*/
public TransformerBuilder fromType(Class<?> from) {
this.from = new DataType(from).toString();
return this;
}
/**
* Set the 'to' data type name.
* If you specify 'json:XYZ', the transformer will be picked up if destination type is
* 'json:XYZ'. If you specify just 'json', the transformer matches with all of
* 'json' destination type like 'json:ABC' or 'json:DEF'.
*
* @param to 'to' data type
*/
public TransformerBuilder toType(String to) {
this.to = to;
return this;
}
/**
* Set the 'to' data type using Java class.
*
* @param to 'to' Java class
*/
public TransformerBuilder toType(Class<?> to) {
this.to = new DataType(to).toString();
return this;
}
/**
* Set the URI to be used for the endpoint {@code Transformer}.
* @see {@code EndpointTransformerDefinition}, {@code ProcessorTransformer}
*
* @param uri endpoint URI
*/
public TransformerBuilder withUri(String uri) {
resetType();
this.uri = uri;
return this;
}
/**
* Set the {@code DataFormatDefinition} to be used for the {@code DataFormat} {@code Transformer}.
* @see {@code DataFormatTransformerDefinition}, {@code DataFormatTransformer}
*
* @param dataFormatDefinition {@code DataFormatDefinition}
*/
public TransformerBuilder withDataFormat(DataFormatDefinition dataFormatDefinition) {
resetType();
this.dataFormat = dataFormatDefinition;
return this;
}
/**
* Set the Java {@code Class} represents a custom {@code Transformer} implementation class.
* @see {@code CustomTransformerDefinition}
*
* @param clazz {@code Class} object represents custom transformer implementation
*/
public TransformerBuilder withJava(Class<? extends Transformer> clazz) {
resetType();
this.clazz = clazz;
return this;
}
/**
* Set the Java Bean name to be used for custom {@code Transformer}.
* @see {@code CustomTransformerDefinition}
*
* @param ref bean name for the custom {@code Transformer}
*/
public TransformerBuilder withBean(String ref) {
resetType();
this.beanRef = ref;
return this;
}
private void resetType() {
this.uri = null;
this.dataFormat = null;
this.clazz = null;
this.beanRef = null;
}
/**
* Configure a Transformer according to the configurations built on this builder
* and register it into given {@code CamelContext}.
*
* @param camelContext {@code CamelContext}
*/
public void configure(CamelContext camelContext) {
TransformerDefinition transformer;
if (uri != null) {
EndpointTransformerDefinition etd = new EndpointTransformerDefinition();
etd.setUri(uri);
transformer = etd;
} else if (dataFormat != null) {
DataFormatTransformerDefinition dtd = new DataFormatTransformerDefinition();
dtd.setDataFormatType(dataFormat);
transformer = dtd;
} else if (clazz != null) {
CustomTransformerDefinition ctd = new CustomTransformerDefinition();
ctd.setClassName(clazz.getName());
transformer = ctd;
} else if (beanRef != null) {
CustomTransformerDefinition ctd = new CustomTransformerDefinition();
ctd.setRef(beanRef);
transformer = ctd;
} else {
throw new IllegalArgumentException("No Transformer type was specified");
}
if (scheme != null) {
transformer.setScheme(scheme);
} else {
transformer.setFromType(from);
transformer.setToType(to);
}
camelContext.getTransformers().add(transformer);
}
}