All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.axiom.util.blob.WritableBlob Maven / Gradle / Ivy

There is a newer version: 1.4.0
Show newest version
/*
 * 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.axiom.util.blob;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.axiom.ext.io.StreamCopyException;

/**
 * A writable blob.
 * 

* The behavior of the methods defined by this interface is described in terms of three logical * states the blob can be in: *

*
NEW *
The blob has just been created and no data has been written to it yet. *
UNCOMMITTED *
Data is being written to the blob. *
COMMITTED *
All data has been written to the blob and the blob will no longer accept any new data. *
* Whether or not reading data from the blob if is in state NEW or UNCOMMITTED depends on the * return value of {@link #isSupportingReadUncommitted()}. *

* Blobs are not thread safe. * * @deprecated Use {@link org.apache.axiom.blob.WritableBlob} instead. */ public interface WritableBlob extends Blob { /** * Determine whether the blob supports reading in state NEW or UNCOMMITTED. If this method * returns false and the blob is in state NEW or UNCOMMITTED, any call to a method * defined by the {@link Blob} superinterface will result in an {@link IllegalStateException}. * If this method returns true, then any data written to the blob will be * immediately available for reading. This is also true for an input stream obtained from * {@link Blob#getInputStream()} before the data is written. This implies that it is possible * for the input stream to first report the end of the stream and later allow reading additional * data. Therefore, a pair of streams obtained from {@link #getOutputStream()} and * {@link Blob#getInputStream()} behaves differently than a {@link java.io.PipedOutputStream} * and {@link java.io.PipedInputStream} pair, because in this situation * {@link java.io.PipedInputStream} would block. * * @return true if the blob allows reading the data in state NEW or UNCOMMITTED; * false if the blob allows read operations only in state COMMITTED */ boolean isSupportingReadUncommitted(); /** * Create an output stream to write data to the blob. *

* Precondition: The blob is in state NEW. *

* Postcondition: The blob is in state UNCOMMITTED. *

* Note that the pre- and postconditions imply that this method may be called at most once for * a given blob instance. *

* Calls to methods of the returned output stream will modify the state of the blob * according to the following rules: *

    *
  • A call to {@link OutputStream#close()} will change the state to COMMITTED. *
  • Calls to other methods will not modify the state of the blob. They will result in * an {@link IOException} if the state is COMMITTED, i.e. if the stream has already been * closed. *
* * @return an output stream that can be used to write data to the blob * * @throws IllegalStateException if the blob is not in state NEW */ BlobOutputStream getOutputStream(); /** * Read data from the given input stream and write it to the blob. *

* A call to this method has the same effect as requesting an output stream using * {@link #getOutputStream()} and copying the data from the input stream to that * output stream, but the implementation will achieve this result in a more efficient way. *

* Precondition: The blob is in state NEW or UNCOMMITTED. *

* Postcondition: The blob is in state UNCOMMITTED if commit is * false. It is in state COMMITTED if commit is true. *

* The precondition implies that this method may be used after a call to * {@link #getOutputStream()}. In that case it is illegal to set commit to * true (because this would invalidate the state of the output stream). *

* The method transfers data from the input stream to the blob until one of the following * conditions is met: *

    *
  • The end of the input stream is reached. *
  • The value of the length argument is different from -1 * and the number of bytes transferred is equal to length. *
* * @param in An input stream to read data from. This method will not * close the stream. * @param length the number of bytes to transfer, or -1 if the method should * transfer data until the end of the input stream is reached * @param commit indicates whether the blob should be in state COMMITTED after the operation * @return the number of bytes transferred * @throws StreamCopyException * @throws IllegalStateException if the blob is in state COMMITTED or if * {@link #getOutputStream()} has been called before and commit is * true */ long readFrom(InputStream in, long length, boolean commit) throws StreamCopyException; /** * Read data from the given input stream and write it to the blob. *

* This method is similar to {@link #readFrom(InputStream, long, boolean)}, except that the state * of the blob after the invocation (i.e. the commit argument) is determined * automatically: *

*

* * * * * * * * * *
State transitions
Precondition (state)Postcondition (state)
NEWCOMMITTED
UNCOMMITTEDUNCOMMITTED
COMMITTEDillegal
*

* There are thus two usage patterns for this method: *

    *
  1. The method is used to fill the blob with the data from an input stream, but no other * data is written to the blob. *
  2. The method is used in parallel with the output stream returned by * {@link #getOutputStream()}: some data is written using the output stream and some * data is written using this method (for efficiency reasons). *
* * @param in An input stream to read data from. This method will not * close the stream. * @param length the number of bytes to transfer, or -1 if the method should * transfer data until the end of the input stream is reached * @return the number of bytes transferred * @throws StreamCopyException * @throws IllegalStateException if the blob is in state COMMITTED */ long readFrom(InputStream in, long length) throws StreamCopyException; /** * Release all resources held by this blob. */ void release(); }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy