| /* |
| * 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.qpid.protonj2.client; |
| |
| import java.io.OutputStream; |
| |
| import org.apache.qpid.protonj2.types.messaging.Footer; |
| |
| /** |
| * Options class that controls various aspects of a {@link OutputStream} instance created to write |
| * the contents of a section of a {@link StreamSenderMessage}. |
| */ |
| public class OutputStreamOptions { |
| |
| /** |
| * Defines the default value for the complete parent {@link StreamSenderMessage} on close option |
| */ |
| public static final boolean DEFAULT_COMPLETE_SEND_ON_CLOSE = true; |
| |
| private int streamSize; |
| private boolean completeSendOnClose = DEFAULT_COMPLETE_SEND_ON_CLOSE; |
| |
| /** |
| * Creates a {@link OutputStreamOptions} instance with default values for all options |
| */ |
| public OutputStreamOptions() { |
| } |
| |
| /** |
| * Create a {@link OutputStreamOptions} instance that copies all configuration from the given |
| * {@link OutputStreamOptions} instance. |
| * |
| * @param options |
| * The options instance to copy all configuration values from. |
| */ |
| public OutputStreamOptions(OutputStreamOptions options) { |
| if (options != null) { |
| options.copyInto(this); |
| } |
| } |
| |
| @Override |
| public OutputStreamOptions clone() { |
| return copyInto(new OutputStreamOptions()); |
| } |
| |
| /** |
| * Copy all options from this {@link OutputStreamOptions} instance into the instance |
| * provided. |
| * |
| * @param other |
| * the target of this copy operation. |
| * |
| * @return this {@link OutputStreamOptions} class for chaining. |
| */ |
| protected OutputStreamOptions copyInto(OutputStreamOptions other) { |
| other.bodyLength(streamSize); |
| other.completeSendOnClose(completeSendOnClose); |
| |
| return this; |
| } |
| |
| /** |
| * @return the configured stream size limit for associated {@link OutputStream} |
| */ |
| public int bodyLength() { |
| return streamSize; |
| } |
| |
| /** |
| * Sets the overall stream size for this associated {@link OutputStream} that the |
| * options are applied to. |
| * <p> |
| * When set this option indicates the number of bytes that can be written to the stream before an error |
| * would be thrown indicating that this value was exceeded. Conversely if the stream is closed before |
| * the number of bytes indicated is written the send will be aborted and an error will be thrown to the |
| * caller. |
| * |
| * @param streamSize |
| * The fixed number of bytes that must be written in order for the stream to be complete. |
| * |
| * @return this {@link OutputStreamOptions} instance. |
| */ |
| public OutputStreamOptions bodyLength(int streamSize) { |
| if (streamSize < 0) { |
| throw new IllegalArgumentException("Cannot set a stream body size that is negative"); |
| } |
| |
| this.streamSize = streamSize; |
| return this; |
| } |
| |
| /** |
| * @return the whether the close of the {@link OutputStream} should complete the parent {@link StreamSenderMessage} |
| */ |
| public boolean completeSendOnClose() { |
| return completeSendOnClose; |
| } |
| |
| /** |
| * Configures if the close of the {@link OutputStream} should result in a completion of the parent |
| * {@link StreamSenderMessage} (default is true). If there is a configured stream size and the {@link OutputStream} |
| * is closed the parent {@link StreamSenderMessage} will always be aborted as the send would be incomplete, but the |
| * close of an {@link OutputStream} may not always be the desired outcome. In the case the user wishes to |
| * add a {@link Footer} to the message transmitted by the {@link StreamSenderMessage} this option should be set to |
| * false and the user should complete the stream manually. |
| * |
| * @param completeContextOnClose |
| * Should the {@link OutputStream#close()} method complete the parent {@link StreamSenderMessage} |
| * |
| * @return this {@link OutputStreamOptions} instance. |
| */ |
| public OutputStreamOptions completeSendOnClose(boolean completeContextOnClose) { |
| this.completeSendOnClose = completeContextOnClose; |
| return this; |
| } |
| } |