001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.servicemix.components.util;
018:
019: import java.io.File;
020: import java.io.IOException;
021: import java.io.InputStream;
022: import java.io.ObjectOutputStream;
023: import java.io.OutputStream;
024: import java.io.OutputStreamWriter;
025:
026: import javax.jbi.JBIException;
027: import javax.jbi.messaging.MessageExchange;
028: import javax.jbi.messaging.MessagingException;
029: import javax.jbi.messaging.NormalizedMessage;
030: import javax.xml.transform.Source;
031: import javax.xml.transform.TransformerException;
032: import javax.xml.transform.stream.StreamResult;
033: import javax.xml.transform.stream.StreamSource;
034:
035: import org.apache.servicemix.expression.Expression;
036: import org.apache.servicemix.expression.PropertyExpression;
037: import org.apache.servicemix.jbi.NoMessageContentAvailableException;
038:
039: /**
040: * A default file transformer which assumes the file is already in XML format and
041: * requires no transformation other than to be wrapped in a normalized message..
042: *
043: * @org.apache.xbean.XBean
044: * @version $Revision: 564374 $
045: */
046: public class DefaultFileMarshaler extends MarshalerSupport implements
047: FileMarshaler {
048:
049: public static final String FILE_NAME_PROPERTY = "org.apache.servicemix.file.name";
050: public static final String FILE_PATH_PROPERTY = "org.apache.servicemix.file.path";
051: public static final String FILE_CONTENT = "org.apache.servicemix.file.content";
052:
053: protected static final PropertyExpression FILE_NAME_EXPRESSION = new PropertyExpression(
054: FILE_NAME_PROPERTY);
055: protected static final PropertyExpression FILE_CONTENT_EXPRESSION = new PropertyExpression(
056: FILE_CONTENT);
057:
058: private Expression fileName = FILE_NAME_EXPRESSION;
059: private Expression content = FILE_CONTENT_EXPRESSION;
060:
061: public void readMessage(MessageExchange exchange,
062: NormalizedMessage message, InputStream in, String path)
063: throws IOException, JBIException {
064: message.setContent(new StreamSource(in, path));
065: message.setProperty(FILE_NAME_PROPERTY, new File(path)
066: .getName());
067: message.setProperty(FILE_PATH_PROPERTY, path);
068: }
069:
070: public String getOutputName(MessageExchange exchange,
071: NormalizedMessage message) throws MessagingException {
072: return asString(fileName.evaluate(exchange, message));
073: }
074:
075: public void writeMessage(MessageExchange exchange,
076: NormalizedMessage message, OutputStream out, String path)
077: throws IOException, JBIException {
078: try {
079: Object value = content.evaluate(exchange, message);
080: if (value != null) {
081: writeValue(value, out);
082: } else {
083: writeMessageContent(exchange, message, out, path);
084: }
085: } catch (IOException e) {
086: throw new MessagingException(e);
087: }
088: }
089:
090: // Properties
091: //-------------------------------------------------------------------------
092: public Expression getContent() {
093: return content;
094: }
095:
096: public void setContent(Expression content) {
097: this .content = content;
098: }
099:
100: public Expression getFileName() {
101: return fileName;
102: }
103:
104: public void setFileName(Expression fileName) {
105: this .fileName = fileName;
106: }
107:
108: // Implementation methods
109: //-------------------------------------------------------------------------
110:
111: /**
112: * Writes the given value to the output stream
113: *
114: * @param value the value to be written to the stream
115: * @param out the output stream
116: */
117: protected void writeValue(Object value, OutputStream out)
118: throws IOException, MessagingException {
119: if (value instanceof String) {
120: OutputStreamWriter writer = new OutputStreamWriter(out);
121: writer.write((String) value);
122: writer.flush();
123: } else if (value instanceof byte[]) {
124: out.write((byte[]) value);
125: } else {
126: ObjectOutputStream objectOut = new ObjectOutputStream(out);
127: objectOut.writeObject(value);
128: }
129: }
130:
131: /**
132: * Writes the message content to the given output stream
133: *
134: * @param message the message who's content we are about to write
135: * @param out the destination of the output
136: * @param path the name of the output resource (file, uri, url)
137: */
138: protected void writeMessageContent(MessageExchange exchange,
139: NormalizedMessage message, OutputStream out, String path)
140: throws MessagingException {
141: Source src = message.getContent();
142: if (src == null) {
143: throw new NoMessageContentAvailableException(exchange);
144: }
145: try {
146: getTransformer().toResult(src, new StreamResult(out));
147: } catch (TransformerException e) {
148: throw new MessagingException(e);
149: }
150: }
151: }
|