/**
* 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.model.dataformat;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.apache.camel.CamelContext;
import org.apache.camel.model.DataFormatDefinition;
import org.apache.camel.spi.DataFormat;
import org.apache.camel.spi.Metadata;
import org.apache.camel.spi.RouteContext;
import org.apache.camel.util.ObjectHelper;
/**
* Jackson XML data format
*
* @version
*/
@Metadata(firstVersion = "2.16.0", label = "dataformat,transformation,xml", title = "JacksonXML")
@XmlRootElement(name = "jacksonxml")
@XmlAccessorType(XmlAccessType.FIELD)
public class JacksonXMLDataFormat extends DataFormatDefinition {
@XmlAttribute
private String xmlMapper;
@XmlAttribute
private Boolean prettyPrint;
@XmlAttribute
private String unmarshalTypeName;
@XmlTransient
private Class<?> unmarshalType;
@XmlAttribute
private Class<?> jsonView;
@XmlAttribute
private String include;
@XmlAttribute
private Boolean allowJmsType;
@XmlAttribute
private String collectionTypeName;
@XmlTransient
private Class<?> collectionType;
@XmlAttribute
private Boolean useList;
@XmlAttribute
private Boolean enableJaxbAnnotationModule;
@XmlAttribute
private String moduleClassNames;
@XmlAttribute
private String moduleRefs;
@XmlAttribute
private String enableFeatures;
@XmlAttribute
private String disableFeatures;
@XmlAttribute
private Boolean allowUnmarshallType;
public JacksonXMLDataFormat() {
super("jacksonxml");
}
public String getXmlMapper() {
return xmlMapper;
}
/**
* Lookup and use the existing XmlMapper with the given id.
*/
public void setXmlMapper(String xmlMapper) {
this.xmlMapper = xmlMapper;
}
public Boolean getPrettyPrint() {
return prettyPrint;
}
/**
* To enable pretty printing output nicely formatted.
* <p/>
* Is by default false.
*/
public void setPrettyPrint(Boolean prettyPrint) {
this.prettyPrint = prettyPrint;
}
public String getUnmarshalTypeName() {
return unmarshalTypeName;
}
/**
* Class name of the java type to use when unarmshalling
*/
public void setUnmarshalTypeName(String unmarshalTypeName) {
this.unmarshalTypeName = unmarshalTypeName;
}
public Class<?> getUnmarshalType() {
return unmarshalType;
}
/**
* Class of the java type to use when unarmshalling
*/
public void setUnmarshalType(Class<?> unmarshalType) {
this.unmarshalType = unmarshalType;
}
public Class<?> getJsonView() {
return jsonView;
}
/**
* When marshalling a POJO to JSON you might want to exclude certain fields
* from the JSON output. With Jackson you can use JSON views to accomplish
* this. This option is to refer to the class which has @JsonView
* annotations
*/
public void setJsonView(Class<?> jsonView) {
this.jsonView = jsonView;
}
public String getInclude() {
return include;
}
/**
* If you want to marshal a pojo to JSON, and the pojo has some fields with
* null values. And you want to skip these null values, you can set this
* option to <tt>NOT_NULL</tt>
*/
public void setInclude(String include) {
this.include = include;
}
public Boolean getAllowJmsType() {
return allowJmsType;
}
/**
* Used for JMS users to allow the JMSType header from the JMS spec to
* specify a FQN classname to use to unmarshal to.
*/
public void setAllowJmsType(Boolean allowJmsType) {
this.allowJmsType = allowJmsType;
}
public String getCollectionTypeName() {
return collectionTypeName;
}
/**
* Refers to a custom collection type to lookup in the registry to use. This
* option should rarely be used, but allows to use different collection
* types than java.util.Collection based as default.
*/
public void setCollectionTypeName(String collectionTypeName) {
this.collectionTypeName = collectionTypeName;
}
public Boolean getUseList() {
return useList;
}
/**
* To unarmshal to a List of Map or a List of Pojo.
*/
public void setUseList(Boolean useList) {
this.useList = useList;
}
public Boolean getEnableJaxbAnnotationModule() {
return enableJaxbAnnotationModule;
}
/**
* Whether to enable the JAXB annotations module when using jackson. When
* enabled then JAXB annotations can be used by Jackson.
*/
public void setEnableJaxbAnnotationModule(Boolean enableJaxbAnnotationModule) {
this.enableJaxbAnnotationModule = enableJaxbAnnotationModule;
}
public String getModuleClassNames() {
return moduleClassNames;
}
/**
* To use custom Jackson modules com.fasterxml.jackson.databind.Module
* specified as a String with FQN class names. Multiple classes can be
* separated by comma.
*/
public void setModuleClassNames(String moduleClassNames) {
this.moduleClassNames = moduleClassNames;
}
public String getModuleRefs() {
return moduleRefs;
}
/**
* To use custom Jackson modules referred from the Camel registry. Multiple
* modules can be separated by comma.
*/
public void setModuleRefs(String moduleRefs) {
this.moduleRefs = moduleRefs;
}
public String getEnableFeatures() {
return enableFeatures;
}
/**
* Set of features to enable on the Jackson
* <tt>com.fasterxml.jackson.databind.ObjectMapper</tt>.
* <p/>
* The features should be a name that matches a enum from
* <tt>com.fasterxml.jackson.databind.SerializationFeature</tt>,
* <tt>com.fasterxml.jackson.databind.DeserializationFeature</tt>, or
* <tt>com.fasterxml.jackson.databind.MapperFeature</tt>
* <p/>
* Multiple features can be separated by comma
*/
public void setEnableFeatures(String enableFeatures) {
this.enableFeatures = enableFeatures;
}
public String getDisableFeatures() {
return disableFeatures;
}
/**
* Set of features to disable on the Jackson
* <tt>com.fasterxml.jackson.databind.ObjectMapper</tt>.
* <p/>
* The features should be a name that matches a enum from
* <tt>com.fasterxml.jackson.databind.SerializationFeature</tt>,
* <tt>com.fasterxml.jackson.databind.DeserializationFeature</tt>, or
* <tt>com.fasterxml.jackson.databind.MapperFeature</tt>
* <p/>
* Multiple features can be separated by comma
*/
public void setDisableFeatures(String disableFeatures) {
this.disableFeatures = disableFeatures;
}
public Boolean getAllowUnmarshallType() {
return allowUnmarshallType;
}
/**
* If enabled then Jackson is allowed to attempt to use the CamelJacksonUnmarshalType header during the unmarshalling.
* <p/>
* This should only be enabled when desired to be used.
*/
public void setAllowUnmarshallType(Boolean allowUnmarshallType) {
this.allowUnmarshallType = allowUnmarshallType;
}
@Override
public String getDataFormatName() {
return "jacksonxml";
}
@Override
protected DataFormat createDataFormat(RouteContext routeContext) {
if (unmarshalType == null && unmarshalTypeName != null) {
try {
unmarshalType = routeContext.getCamelContext().getClassResolver().resolveMandatoryClass(unmarshalTypeName);
} catch (ClassNotFoundException e) {
throw ObjectHelper.wrapRuntimeCamelException(e);
}
}
if (collectionType == null && collectionTypeName != null) {
try {
collectionType = routeContext.getCamelContext().getClassResolver().resolveMandatoryClass(collectionTypeName);
} catch (ClassNotFoundException e) {
throw ObjectHelper.wrapRuntimeCamelException(e);
}
}
return super.createDataFormat(routeContext);
}
@Override
protected void configureDataFormat(DataFormat dataFormat, CamelContext camelContext) {
if (xmlMapper != null) {
// must be a reference value
String ref = xmlMapper.startsWith("#") ? xmlMapper : "#" + xmlMapper;
setProperty(camelContext, dataFormat, "xmlMapper", ref);
}
if (unmarshalType != null) {
setProperty(camelContext, dataFormat, "unmarshalType", unmarshalType);
}
if (prettyPrint != null) {
setProperty(camelContext, dataFormat, "prettyPrint", prettyPrint);
}
if (jsonView != null) {
setProperty(camelContext, dataFormat, "jsonView", jsonView);
}
if (include != null) {
setProperty(camelContext, dataFormat, "include", include);
}
if (allowJmsType != null) {
setProperty(camelContext, dataFormat, "allowJmsType", allowJmsType);
}
if (collectionType != null) {
setProperty(camelContext, dataFormat, "collectionType", collectionType);
}
if (useList != null) {
setProperty(camelContext, dataFormat, "useList", useList);
}
if (enableJaxbAnnotationModule != null) {
setProperty(camelContext, dataFormat, "enableJaxbAnnotationModule", enableJaxbAnnotationModule);
}
if (moduleClassNames != null) {
setProperty(camelContext, dataFormat, "modulesClassNames", moduleClassNames);
}
if (moduleRefs != null) {
setProperty(camelContext, dataFormat, "moduleRefs", moduleRefs);
}
if (enableFeatures != null) {
setProperty(camelContext, dataFormat, "enableFeatures", enableFeatures);
}
if (disableFeatures != null) {
setProperty(camelContext, dataFormat, "disableFeatures", disableFeatures);
}
if (allowUnmarshallType != null) {
setProperty(camelContext, dataFormat, "allowUnmarshallType", allowUnmarshallType);
}
}
}