blob: ddbf69ee0f0d3c8f4d80ec91b249930e9699085b [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.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;
}