blob: c3ee59ded1b51097a0cc832233d447a8211b698f [file] [log] [blame]
/**
* 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.dataformat.castor;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import org.apache.camel.Exchange;
import org.apache.camel.spi.ClassResolver;
import org.apache.camel.spi.DataFormat;
import org.apache.camel.util.ObjectHelper;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.XMLContext;
/**
* An abstract class which implement <a
* href="http://camel.apache.org/data-format.html">data format</a> ({@link DataFormat})
* interface which leverage the Castor library for XML marshaling and
* unmarshaling
*
* @version
*/
public abstract class AbstractCastorDataFormat implements DataFormat {
/**
* The default encoding used for stream access.
*/
public static final String DEFAULT_ENCODING = "UTF-8";
private String encoding = DEFAULT_ENCODING;
private XMLContext xmlContext;
private String mappingFile;
private String[] classNames;
private String[] packages;
private boolean validation;
private Marshaller marshaller;
private Unmarshaller unmarshaller;
public AbstractCastorDataFormat() {
}
public AbstractCastorDataFormat(XMLContext xmlContext) {
this.xmlContext = xmlContext;
}
public void marshal(Exchange exchange, Object body, OutputStream outputStream) throws Exception {
Writer writer = new OutputStreamWriter(outputStream, encoding);
Marshaller.marshal(body, writer);
}
public Object unmarshal(Exchange exchange, InputStream inputStream) throws Exception {
Reader reader = new InputStreamReader(inputStream, encoding);
return getUnmarshaller(exchange).unmarshal(reader);
}
public XMLContext getXmlContext(ClassResolver resolver) throws Exception {
if (xmlContext == null) {
xmlContext = new XMLContext();
if (ObjectHelper.isNotEmpty(getMappingFile())) {
Mapping xmlMap = new Mapping();
xmlMap.loadMapping(resolver.loadResourceAsURL(getMappingFile()));
xmlContext.addMapping(xmlMap);
}
if (getPackages() != null) {
xmlContext.addPackages(getPackages());
}
if (getClassNames() != null) {
for (String name : getClassNames()) {
Class clazz = resolver.resolveClass(name);
xmlContext.addClass(clazz);
}
}
}
return xmlContext;
}
public Unmarshaller getUnmarshaller(Exchange exchange) throws Exception {
if (this.unmarshaller == null) {
this.unmarshaller = getXmlContext(exchange.getContext().getClassResolver()).createUnmarshaller();
this.unmarshaller.setValidation(isValidation());
}
return this.unmarshaller;
}
public Marshaller getMarshaller(Exchange exchange) throws Exception {
if (this.marshaller == null) {
this.marshaller = getXmlContext(exchange.getContext().getClassResolver()).createMarshaller();
this.marshaller.setValidation(isValidation());
}
return this.marshaller;
}
public void setXmlContext(XMLContext xmlContext) {
this.xmlContext = xmlContext;
}
public String getMappingFile() {
return mappingFile;
}
public void setMappingFile(String mappingFile) {
this.mappingFile = mappingFile;
}
public void setMarshaller(Marshaller marshaller) {
this.marshaller = marshaller;
}
public void setUnmarshaller(Unmarshaller unmarshaller) {
this.unmarshaller = unmarshaller;
}
public String[] getClassNames() {
return classNames;
}
public void setClassNames(String[] classNames) {
this.classNames = classNames;
}
public String[] getPackages() {
return packages;
}
public void setPackages(String[] packages) {
this.packages = packages;
}
public String getEncoding() {
return encoding;
}
public void setEncoding(String encoding) {
this.encoding = encoding;
}
public boolean isValidation() {
return validation;
}
public void setValidation(boolean validation) {
this.validation = validation;
}
}