| /* |
| * 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.axis2.format; |
| |
| import javax.activation.DataSource; |
| |
| import org.apache.axiom.om.OMElement; |
| import org.apache.axis2.AxisFault; |
| import org.apache.axis2.builder.Builder; |
| import org.apache.axis2.context.MessageContext; |
| |
| /** |
| * Message builder able to build messages from {@link DataSource} objects. |
| * This interface can be optionally implemented by {@link Builder} |
| * implementations that support building messages from {@link DataSource} objects. |
| * Since by definition the data from a {@link DataSource} can be read multiple |
| * times, this interface can be used by message builders to avoid storing the |
| * message content in memory. |
| * <p> |
| * If a message builder implements this interface and the transport is able to |
| * provide the message payload as a data source, then the method defined by this |
| * interface should be preferred over the method defined by {@link Builder}. |
| * <p> |
| * Implementing this interface helps optimizing message processing with transports |
| * that use messaging providers that store messages in memory or on the file system. |
| * Examples are JMS and VFS. |
| * <p> |
| * The builder will typically expose the data source directly or indirectly through |
| * the returned {@link OMElement}, e.g. by adding to the tree an {@link org.apache.axiom.om.OMText} |
| * or {@link org.apache.axiom.om.OMDataSource} node referencing the data source. |
| * This means that the builder will not be able to guarantee that all streams requested |
| * from the data source are properly closed. Note that code accessing the returned |
| * {@link OMElement} can't be expected to take care of this since in many cases the fact |
| * that a data source is being used is completely transparent to that code. |
| * It is therefore the responsibility of the transport to make sure that all resources linked to |
| * the data source itself as well as any open stream requested from that data source are properly |
| * released after the message has been processed. Depending on the type of transport, there are |
| * three possible cases: |
| * <ol> |
| * <li>All resources allocated to the data source or streams requested from it are |
| * memory based. In that case the garbage collector will take care of freeing |
| * these resources and the transport should simply pass the data source object |
| * to the builder.</li> |
| * <li>There are operation system resources linked to the data source and open |
| * streams will become invalid when these resources are freed, i.e. |
| * it is not required that all streams be closed explicitly. |
| * In this case the transport only needs to take care to properly dispose of |
| * the data source after the message has been processed by the Axis2 engine.</li> |
| * <li>Requesting a stream from the data source allocates operation system resources |
| * (e.g. a network connection) that remain linked to the stream, i.e. all streams requested |
| * from the data source must be closed properly. In that case the transport should use |
| * {@link ManagedDataSourceFactory#create(DataSource)} to wrap the original data source |
| * before passing it to the builder. After the message has been processed it should |
| * then call {@link ManagedDataSource#destroy()} on the wrapper to close all remaining |
| * open streams.</li> |
| * </ol> |
| */ |
| public interface DataSourceMessageBuilder extends Builder { |
| public OMElement processDocument(DataSource dataSource, String contentType, |
| MessageContext messageContext) throws AxisFault; |
| } |