blob: 34d3a9725d304b161587ff7254b33c9ab95bd3ef [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.servicemix.jbi.transformer;
import java.io.IOException;
import java.util.Iterator;
import javax.activation.DataHandler;
import javax.jbi.messaging.MessageExchange;
import javax.jbi.messaging.MessagingException;
import javax.jbi.messaging.NormalizedMessage;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamSource;
import org.xml.sax.SAXException;
import org.apache.servicemix.jbi.helper.MessageUtil;
import org.apache.servicemix.jbi.jaxp.BytesSource;
import org.apache.servicemix.jbi.jaxp.ResourceSource;
import org.apache.servicemix.jbi.jaxp.SourceTransformer;
import org.apache.servicemix.jbi.jaxp.StringSource;
import org.apache.servicemix.jbi.marshaler.PojoMarshaler;
/**
* A simple transformer which copies the properties and content from the source message to the destination message.
*
* @version $Revision: 564374 $
*/
public class CopyTransformer implements MessageTransformer {
private static final CopyTransformer INSTANCE = new CopyTransformer();
private SourceTransformer sourceTransformer = new SourceTransformer();
private boolean copyProperties;
private boolean copyAttachments;
private boolean copySecuritySubject;
private boolean copyContent;
public CopyTransformer() {
this(true, true, true, true);
}
public CopyTransformer(boolean copySecuritySubject, boolean copyContent, boolean copyProperties, boolean copyAttachments) {
super();
this.copySecuritySubject = copySecuritySubject;
this.copyContent = copyContent;
this.copyProperties = copyProperties;
this.copyAttachments = copyAttachments;
}
/**
* @return the copyAttachments
*/
public boolean isCopyAttachments() {
return copyAttachments;
}
/**
* @param copyAttachments the copyAttachments to set
*/
public void setCopyAttachments(boolean copyAttachments) {
this.copyAttachments = copyAttachments;
}
/**
* @return the copyProperties
*/
public boolean isCopyProperties() {
return copyProperties;
}
/**
* @param copyProperties the copyProperties to set
*/
public void setCopyProperties(boolean copyProperties) {
this.copyProperties = copyProperties;
}
/**
* @return the copySecuritySubject
*/
public boolean isCopySecuritySubject() {
return copySecuritySubject;
}
/**
* @param copySecuritySubject the copySecuritySubject to set
*/
public void setCopySecuritySubject(boolean copySecuritySubject) {
this.copySecuritySubject = copySecuritySubject;
}
/**
* Returns the singleton instance
*
* @return the singleton instance
*/
public static CopyTransformer getInstance() {
return INSTANCE;
}
public boolean transform(MessageExchange exchange, NormalizedMessage from,
NormalizedMessage to) throws MessagingException {
if (copyProperties) {
copyProperties(from, to);
}
if (copyContent) {
copyContent(from, to);
}
if (copyAttachments) {
copyAttachments(from, to);
}
if (copySecuritySubject) {
copySecuritySubject(from, to);
}
return true;
}
private void copyContent(NormalizedMessage from, NormalizedMessage to) throws MessagingException {
Source content = from.getContent();
if ((content instanceof StreamSource || content instanceof SAXSource)
&& !(content instanceof StringSource)
&& !(content instanceof BytesSource)
&& !(content instanceof ResourceSource)) {
// lets avoid stream open exceptions by using a temporary format
try {
content = sourceTransformer.toDOMSource(from);
} catch (TransformerException e) {
throw new MessagingException(e);
} catch (ParserConfigurationException e) {
throw new MessagingException(e);
} catch (IOException e) {
throw new MessagingException(e);
} catch (SAXException e) {
throw new MessagingException(e);
}
}
to.setContent(content);
}
public NormalizedMessage transform(MessageExchange exchange, NormalizedMessage in)
throws MessagingException {
NormalizedMessage out = new MessageUtil.NormalizedMessageImpl();
transform(exchange, in, out);
return out;
}
/**
* Copies all of the properties from one message to another
*
* @param from the message containing the properties
* @param to the destination messages where the properties are set
*/
public static void copyProperties(NormalizedMessage from,
NormalizedMessage to) {
for (Iterator iter = from.getPropertyNames().iterator(); iter.hasNext();) {
String name = (String) iter.next();
// Do not copy transient properties
if (!PojoMarshaler.BODY.equals(name)) {
Object value = from.getProperty(name);
to.setProperty(name, value);
}
}
}
/**
* Copies the attachments from a message to another message
*
* @param from the message with the attachments
* @param to the message to which attachments are added
* @throws MessagingException if an attachment could not be added
*/
public static void copyAttachments(NormalizedMessage from,
NormalizedMessage to) throws MessagingException {
for (Iterator iter = from.getAttachmentNames().iterator(); iter
.hasNext();) {
String name = (String) iter.next();
DataHandler value = from.getAttachment(name);
to.addAttachment(name, value);
}
}
/**
* Copies the subject from a message to another message
*
* @param from the message with the subject
* @param to the message to which the subject is added
* @throws MessagingException if an attachment could not be added
*/
public static void copySecuritySubject(NormalizedMessage from,
NormalizedMessage to) throws MessagingException {
to.setSecuritySubject(from.getSecuritySubject());
}
}