diff --git a/nifi-api/src/main/java/org/apache/nifi/processor/ProcessSession.java b/nifi-api/src/main/java/org/apache/nifi/processor/ProcessSession.java index 9263eb8ac6..ecbb9a4019 100644 --- a/nifi-api/src/main/java/org/apache/nifi/processor/ProcessSession.java +++ b/nifi-api/src/main/java/org/apache/nifi/processor/ProcessSession.java @@ -38,123 +38,70 @@ import org.apache.nifi.processor.io.InputStreamCallback; import org.apache.nifi.processor.io.OutputStreamCallback; import org.apache.nifi.processor.io.StreamCallback; import org.apache.nifi.provenance.ProvenanceReporter; +import org.apache.nifi.provenance.ProvenanceEventType; /** - *

* A process session encompasses all the behaviors a processor can perform to - * obtain, clone, read, modify remove FlowFiles in an atomic unit. A process - * session is always tied to a single processor at any one time and ensures no - * FlowFile can ever be accessed by any more than one processor at a given time. - * The session also ensures that all FlowFiles are always accounted for. The - * creator of a ProcessSession is always required to manage the session. - *

- * + * obtain, clone, read, modify remove {@link FlowFile}s in an atomic unit. + * A process session is always tied to a single {@link Processor} at any one time + * and ensures no FlowFile can ever be accessed by any more than one processor at a given time. + * The session also ensures that all FlowFiles are always accounted for. + * The creator of a process session is always required to manage the session. *

- * A session is not considered thread safe. The session supports a unit of work - * that is either committed or rolled back - *

- * + * A session is not considered thread safe. The session supports a unit of work that is either committed or rolled back. *

- * As noted on specific methods and for specific exceptions automated rollback - * will occur to ensure consistency of the repository. However, several - * situations can result in exceptions yet not cause automated rollback. In - * these cases the consistency of the repository will be retained but callers - * will be able to indicate whether it should result in rollback or continue on - * toward a commit. - *

- * + * As noted on specific methods and for specific exceptions + * automated rollback will occur to ensure consistency of the repository. + * However, several situations can result in exceptions yet not cause automated rollback. + * In these cases the consistency of the repository will be retained + * but callers will be able to indicate whether it should result in rollback or continue on toward a commit. *

- * A process session has two 'terminal' methods that will result in the process session - * being in a 'fresh', containing no knowledge or any FlowFile, as if the session were newly - * created. After one of these methods is called, the instance may be used again. The terminal - * methods for a Process Session are the {@link #commit()} and {@link #rollback()}. Additionally, - * the {@link #migrate(ProcessSession, Collection)} method results in {@code this} containing - * no knowledge of any of the FlowFiles that are provided, as if the FlowFiles never existed in - * this ProcessSession. After each commit or rollback, the session can be used again. Note, however, - * that even if all FlowFiles are migrated via the {@link #migrate(ProcessSession, Collection)} method, - * this Process Session is not entirely cleared, as it still has knowledge of Counters that were adjusted - * via the {@link #adjustCounter(String, long, boolean)} method. A commit or rollback will clear these - * counters, as well. - *

+ * A process session has two types of 'terminal' methods that will result in the session being in a 'fresh' state, + * containing no knowledge or any FlowFile, as if the session were newly created. + * After one of these methods is called, the instance may be used again. + * The terminal methods for a process session are {@link #commitAsync()} and {@link #rollback()} (and their overloads). + *

+ * Additionally, the {@link #migrate(ProcessSession, Collection)} method transfers all knowledge of the provided FlowFiles + * to the other process session, as if the FlowFiles never existed in this process session. + * Note, however, that even if all FlowFiles are migrated via the {@link #migrate(ProcessSession, Collection)} method, + * the session is not necessarily entirely cleared, as it still may have knowledge of counter adjustments or state changes, + * e.g. see methods {@link #adjustCounter(String, long, boolean)} or {@link #setState(Map, Scope)}. + * A commit or rollback will clear these changes as well. */ public interface ProcessSession { /** + * Commits the current session ensuring all operations against {@link FlowFile}s within this session are atomically persisted. + * All FlowFiles operated on within this session must be accounted for by transfer or removal or the commit will fail. *

- * Commits the current session ensuring all operations against FlowFiles - * within this session are atomically persisted. All FlowFiles operated on - * within this session must be accounted for by transfer or removal or the - * commit will fail.

+ * As soon as the commit completes the session is again ready to be used. * - *

- * As soon as the commit completes the session is again ready to be used

- * - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session. - * @throws FlowFileHandlingException if not all FlowFiles acted upon within - * this session are accounted for by user code such that they have a - * transfer identified or where marked for removal. Automated rollback - * occurs. - * @throws ProcessException if some general fault occurs while persisting - * the session. Initiates automatic rollback. The root cause can be obtained - * via Exception.getCause() + * @deprecated As of NiFi 1.14.0, replaced by {@link #commitAsync()}, {@link #commitAsync(Runnable)}, and {@link #commitAsync(Runnable, Consumer)}. + * The synchronous API is less suited for execution in different runtimes, e.g. MiNiFi or Stateless NiFi, + * and may cause the dataflow in such runtimes to get stuck. + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}). + * @throws FlowFileHandlingException if not all {@link FlowFile}s acted upon within this session are accounted for + * such that they have a transfer identified or where marked for removal. Automated rollback occurs. + * @throws ProcessException if some general fault occurs while persisting the session. + * Initiates automatic rollback. The root cause can be obtained via {@link Exception#getCause}. */ void commit(); /** + * Commits the current session ensuring all operations against {@link FlowFile}s within this session are atomically persisted. + * All FlowFiles operated on within this session must be accounted for by transfer or removal or the commit will fail. *

- * Commits the current session ensuring all operations against FlowFiles - * within this session are atomically persisted. All FlowFiles operated on - * within this session must be accounted for by transfer or removal or the - * commit will fail. - *

- * - *

- * Unlike the {@link #commit()} method, the persistence of data to the repositories is not - * guaranteed to have occurred by the time that this method returns. Therefore, if any follow-on actions - * are necessary after the data has been persisted to the repository (for example, acknowledging receipt from - * a source system, removing a source file, etc.) that logic should be performed only by invoking - * {@link #commitAsync(Runnable)} or {@link #commitAsync(Runnable, Consumer)} + * Unlike the {@link #commit()} method, the persistence of data to the repositories + * is not guaranteed to have occurred by the time that this method returns. + * Therefore, if any follow-on actions are necessary after the data has been persisted to the repository + * (for example, acknowledging receipt from a source system, removing a source file, etc.) that logic + * should be performed only by invoking {@link #commitAsync(Runnable)} or {@link #commitAsync(Runnable, Consumer)} * and implementing that action in the provided callback. - *

- * *

- * If the session cannot be committed, an error will be logged and the session will be rolled back instead. - *

- * - * @throws IllegalStateException if called from within a read or write callback (See {@link #write(FlowFile, StreamCallback)}, {@link #write(FlowFile, OutputStreamCallback)}, - * {@link #read(FlowFile, InputStreamCallback)}). - * - * @throws FlowFileHandlingException if any FlowFile is not appropriately accounted for by transferring it to a Relationship (see {@link #transfer(FlowFile, Relationship)}) - * or removed (see {@link #remove(FlowFile)}. - */ - void commitAsync(); - - /** - *

- * Commits the current session ensuring all operations against FlowFiles - * within this session are atomically persisted. All FlowFiles operated on - * within this session must be accounted for by transfer or removal or the - * commit will fail. - *

- * - *

- * If the session is successfully committed, the given onSuccess {@link Runnable} will be called. - * At the point that the session commit is completed, the session will have already been committed, so any calls - * to {@link #rollback()} / {@link #rollback(boolean)} will not undo that session commit but instead roll back any changes - * that may have occurred since. - *

- * - *

- * If, for any reason, the session could not be committed, an error-level log message will be generated, but the caller will not - * have a chance to perform any cleanup logic. If such logic is necessary, use {@link #commitAsync(Runnable, Consumer)} instead. - *

- * - *

- * Unlike the {@link #commit()} method, the persistence of data to the repositories is not - * guaranteed to have occurred by the time that this method returns. As a result, the following - * very common idiom: - *

+ * As a result, the following very common idiom: *

      * getDataFromSource();
      * session.commit();
@@ -173,846 +120,779 @@ public interface ProcessSession {
      * getDataFromSource();
      * session.commitAsync( () -> acknowledgeReceiptOfData() );
      * 
+ *

+ * If the session cannot be committed, an error will be logged and the session will be rolled back instead. * - * @throws IllegalStateException if called from within a callback (See {@link #write(FlowFile, StreamCallback)}, {@link #write(FlowFile, OutputStreamCallback)}, - * {@link #read(FlowFile, InputStreamCallback)}). + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}). + * @throws FlowFileHandlingException if not all {@link FlowFile}s acted upon within this session are accounted for + * such that they have a transfer identified or where marked for removal. Automated rollback occurs. + */ + void commitAsync(); + + /** + * Commits the current session ensuring all operations against {@link FlowFile}s within this session are atomically persisted. + * All FlowFiles operated on within this session must be accounted for by transfer or removal or the commit will fail. + *

+ * If the session is successfully committed, the given {@code onSuccess} {@link Runnable} will be called. + * At the point that the session commit is completed, any calls to {@link #rollback()} / {@link #rollback(boolean)} + * will not undo that session commit but instead roll back any changes that may have occurred since. + *

+ * If, for any reason, the session could not be committed, an error-level log message will be generated, + * but the caller will not have a chance to perform any cleanup logic. + * If such logic is necessary, use {@link #commitAsync(Runnable, Consumer)} instead. + *

+ * Unlike the {@link #commit()} method, the persistence of data to the repositories + * is not guaranteed to have occurred by the time that this method returns. * - * @throws FlowFileHandlingException if any FlowFile is not appropriately accounted for by transferring it to a Relationship (see {@link #transfer(FlowFile, Relationship)}) - * or removed (see {@link #remove(FlowFile)}. + * @param onSuccess {@link Runnable} that will be called if and when the session is successfully committed; may be null + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}). + * @throws FlowFileHandlingException if not all {@link FlowFile}s acted upon within this session are accounted for + * such that they have a transfer identified or where marked for removal. Automated rollback occurs. */ default void commitAsync(Runnable onSuccess) { commitAsync(onSuccess, null); } /** + * Commits the current session ensuring all operations against FlowFiles within this session are atomically persisted. + * All FlowFiles operated on within this session must be accounted for by transfer or removal or the commit will fail. *

- * Commits the current session ensuring all operations against FlowFiles - * within this session are atomically persisted. All FlowFiles operated on - * within this session must be accounted for by transfer or removal or the - * commit will fail. - *

- * + * If the session is successfully committed, the given {@code onSuccess} {@link Runnable} will be called. + * At the point that the session commit is completed, any calls to {@link #rollback()} / {@link #rollback(boolean)} + * will not undo that session commit but instead roll back any changes that may have occurred since. *

- * If the session is successfully committed, the given onSuccess {@link Runnable} will be called. - * At the point that the session commit is completed, the session will have already been committed, so any calls - * to {@link #rollback()} / {@link #rollback(boolean)} will not undo that session commit but instead roll back any chances - * that may have occurred since. - *

- * + * If, for any reason, the session could not be committed, the given {@code onFailure} {@link Consumer} will be called + * instead of the {@code onSuccess} {@link Runnable}. + * The Consumer will be provided the Throwable that prevented the session commit from completing. *

- * If, for any reason, the session could not be committed, the given onFailure {@link Consumer} will be called - * instead of the onSuccess {@link Runnable}. The Consumer will be provided the Throwable that prevented the session - * commit from completing. - *

+ * Unlike the {@link #commit()} method, the persistence of data to the repositories + * is not guaranteed to have occurred by the time that this method returns. * - *

- * Unlike the {@link #commit()} method, the persistence of data to the repositories is not - * guaranteed to have occurred by the time that this method returns. - *

- * - * @throws IllegalStateException if called from within a callback (See {@link #write(FlowFile, StreamCallback)}, {@link #write(FlowFile, OutputStreamCallback)}, - * {@link #read(FlowFile, InputStreamCallback)}). - * - * @throws FlowFileHandlingException if any FlowFile is not appropriately accounted for by transferring it to a Relationship (see {@link #transfer(FlowFile, Relationship)}) - * or removed (see {@link #remove(FlowFile)}. + * @param onSuccess {@link Runnable} that will be called if and when the session is successfully committed; may be null + * @param onFailure {@link Consumer} that will be called if, for any reason, the session could not be committed; may be null + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}). + * @throws FlowFileHandlingException if not all {@link FlowFile}s acted upon within this session are accounted for + * such that they have a transfer identified or where marked for removal. Automated rollback occurs. */ void commitAsync(Runnable onSuccess, Consumer onFailure); /** - * Reverts any changes made during this session. All FlowFiles are restored - * back to their initial session state and back to their original queues. If - * this session is already committed or rolled back then no changes will - * occur. This method can be called any number of times. Calling this method - * is identical to calling {@link #rollback(boolean)} passing - * false as the parameter. + * Reverts any changes made during this session. + * All {@link FlowFile}s are restored back to their initial session state and back to their original queues. + * If no changes were made since this session was last committed or rolled back, then this method has no effect. + * This method can be called any number of times. + * Calling this method is identical to calling {@link #rollback(boolean)} passing {@code false} as the parameter. */ void rollback(); /** - * Reverts any changes made during this session. All FlowFiles are restored - * back to their initial session state and back to their original queues, - * after optionally being penalized. If this session is already committed or - * rolled back then no changes will occur. This method can be called any - * number of times. + * Reverts any changes made during this session. + * All {@link FlowFile}s are restored back to their initial session state and back to their original queues, + * after optionally being penalized. + * If no changes were made since this session was last committed or rolled back, then this method has no effect. + * This method can be called any number of times. * - * @param penalize whether or not the FlowFiles that are being restored back - * to their queues should be penalized + * @param penalize whether the {@link FlowFile}s that are being restored back to their queues should be penalized */ void rollback(boolean penalize); /** + * Migrates ownership of the given {@code flowFiles} {@link FlowFile}s from {@code this} session to the given {@code newOwner} {@link ProcessSession}. *

- * Migrates ownership of the given FlowFiles from {@code this} to the given {@code newOwner}. - *

- * + * Note, that for any provided FlowFile, if the FlowFile has any child (e.g., by calling {@link #create(FlowFile)} + * and passing the FlowFile as the argument), then all children that were created must also be in the Collection of provided FlowFiles. *

- * When calling this method, all of the following pre-conditions must be met: - *

+ * Also note, that if any FlowFile given is not the most up-to-date version of that FlowFile, + * then the most up-to-date version of the FlowFile will be migrated to the new owner. + * For example, if a call to {@link #putAttribute(FlowFile, String, String)} is made, + * passing {@code flowFile1} as the FlowFile, and then {@code flowFile1} is passed to this method, + * then the newest version (including the newly added attribute) will be migrated, + * not the outdated version of the FlowFile that {@code flowFile1} points to. * - * - * - *

- * Also note, that if any FlowFile given is not the most up-to-date version of that FlowFile, then the most up-to-date - * version of the FlowFile will be migrated to the new owner. For example, if a call to {@link #putAttribute(FlowFile, String, String)} is made, - * passing flowFile1 as the FlowFile, and then flowFile1 is passed to this method, then the newest version (including the - * newly added attribute) will be migrated, not the outdated version of the FlowFile that flowFile1 points to. - *

- * - * @param newOwner the ProcessSession that is to become the new owner of the given FlowFiles - * @param flowFiles the FlowFiles to migrate + * @param newOwner the {@link ProcessSession} that is to become the new owner of the given {@link FlowFile}s + * @param flowFiles the {@link FlowFile}s to migrate + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for any of the affected {@link FlowFile}s */ void migrate(ProcessSession newOwner, Collection flowFiles); /** - * Migrates all FlowFiles to the given new owner as described in {@link #migrate(ProcessSession, Collection)} - * @param newOwner the ProcessSession that is to become the new owner of all FlowFiles + * Migrates ownership of all {@link FlowFile}s from {@code this} session to the given {@code newOwner} {@link ProcessSession}. + * Calling this method is identical to calling {@link #migrate(ProcessSession, Collection)} + * passing all FlowFiles owned by this session as the parameter, + * this encompasses both FlowFiles retrieved from the work queue and newly created or cloned ones. + * + * @param newOwner the {@link ProcessSession} that is to become the new owner of all {@link FlowFile}s + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for any of the affected {@link FlowFile}s */ void migrate(ProcessSession newOwner); /** - * Adjusts counter data for the given counter name and takes care of - * registering the counter if not already present. The adjustment occurs - * only if and when the ProcessSession is committed. + * Adjusts counter data for the given counter name and takes care of registering the counter if not already present. + * The adjustment occurs only if and when the process session is committed. * * @param name the name of the counter * @param delta the delta by which to modify the counter (+ or -) - * @param immediate if true, the counter will be updated immediately, - * without regard to whether the ProcessSession is commit or rolled back; - * otherwise, the counter will be incremented only if and when the - * ProcessSession is committed. + * @param immediate if true, the counter will be updated immediately, without regard to whether the session is committed or rolled back; + * otherwise, the counter will be incremented only if and when the session is committed. */ void adjustCounter(String name, long delta, boolean immediate); /** - * @return FlowFile that is next highest priority FlowFile to process. - * Otherwise returns null. + * Returns the {@link FlowFile} from the work queue that is next highest priority to process. + * If no FlowFiles are available, returns {@code null}. + * + * @return the {@link FlowFile} from the work queue that is next highest priority to process or {@code null}, if none available */ FlowFile get(); /** - * Returns up to maxResults FlowFiles from the work queue. If - * no FlowFiles are available, returns an empty list. Will not return null. - * If multiple incoming queues are present, the behavior is unspecified in - * terms of whether all queues or only a single queue will be polled in a - * single call. + * Returns the next up to {@code maxResults} {@link FlowFile}s from the work queue that are the highest priority to process. + * If no FlowFiles are available, returns an empty list. Will not return {@code null}. + *

+ * If multiple incoming queues are present, the behavior is unspecified in terms of + * whether all queues or only a single queue will be polled in a single call. * - * @param maxResults the maximum number of FlowFiles to return - * @return up to maxResults FlowFiles from the work queue. If - * no FlowFiles are available, returns an empty list. Will not return null. - * @throws IllegalArgumentException if maxResults is less than - * 0 + * @param maxResults the maximum number of {@link FlowFile}s to return + * @return up to {@code maxResults} {@link FlowFile}s from the work queue + * @throws IllegalArgumentException if {@code maxResults} is less than 0 */ List get(int maxResults); /** + * Returns all {@link FlowFile}s from all the incoming queues which the given {@link FlowFileFilter} accepts. *

- * Returns all FlowFiles from all of the incoming queues for which the given - * {@link FlowFileFilter} indicates should be accepted. Calls to this method - * provide exclusive access to the underlying queues. I.e., no other thread - * will be permitted to pull FlowFiles from this Processor's queues or add - * FlowFiles to this Processor's incoming queues until this method call has - * returned. - *

+ * Calls to this method provide exclusive access to the underlying queues. + * That is, no other thread will be permitted to pull FlowFiles from or add FlowFiles + * to this {@link Processor}'s incoming queues until this method call has returned. * - * @param filter to limit which flow files are returned - * @return all FlowFiles from all of the incoming queues for which the given - * {@link FlowFileFilter} indicates should be accepted. + * @param filter a {@link FlowFileFilter} to limit which {@link FlowFile}s are returned + * @return all {@link FlowFile}s from all the incoming queues which the given {@link FlowFileFilter} {@code filter} accepts. */ List get(FlowFileFilter filter); /** - * @return the QueueSize that represents the number of FlowFiles and their - * combined data size for all FlowFiles waiting to be processed by the - * Processor that owns this ProcessSession, regardless of which Connection - * the FlowFiles live on + * Returns the {@link QueueSize} that represents the number of {@link FlowFile}s and their combined data size + * for all FlowFiles waiting to be processed by the {@link Processor} that owns {@code this} {@link ProcessSession}, + * regardless of which connection the FlowFiles live on. + * + * @return the number of {@link FlowFile}s and their combined data size in the work queue */ QueueSize getQueueSize(); /** - * Creates a new FlowFile in the repository with no content and without any - * linkage to a parent FlowFile. This method is appropriate only when data - * is received or created from an external system. Otherwise, this method - * should be avoided and should instead use {@link #create(FlowFile)} or - * {@see #create(Collection)}. - * - * When this method is used, a Provenance CREATE or RECEIVE Event should be - * generated. See the {@link #getProvenanceReporter()} method and - * {@link ProvenanceReporter} class for more information + * Creates a new {@link FlowFile} in the repository with no content and without any linkage to a parent FlowFile. + *

+ * This method is appropriate only when data is received or created from an external system. + * Otherwise, this method should be avoided and instead {@link #create(FlowFile)} or {@link #create(Collection)} be used. + *

+ * When this method is used, a {@link ProvenanceEventType#CREATE} or {@link ProvenanceEventType#RECEIVE} event should be generated. + * See the {@link #getProvenanceReporter()} method and {@link ProvenanceReporter} class for more information. * * @return newly created FlowFile */ FlowFile create(); /** - * Creates a new FlowFile in the repository with no content but with a - * parent linkage to parent. The newly created FlowFile will - * inherit all of the parent's attributes except for the UUID. This method - * will automatically generate a Provenance FORK event or a Provenance JOIN - * event, depending on whether or not other FlowFiles are generated from the - * same parent before the ProcessSession is committed. + * Creates a new {@link FlowFile} in the repository with no content but with a parent linkage to the {@code parent}. + * The newly created FlowFile will inherit all the parent's attributes, except for the UUID. + *

+ * This method will automatically generate a {@link ProvenanceEventType#FORK} or a {@link ProvenanceEventType#JOIN} event, + * depending on whether other FlowFiles are generated from the same parent before the session is committed. * - * @param parent to base the new flowfile on - * @return newly created flowfile + * @param parent to base the new {@link FlowFile} on, inheriting attributes from + * @return newly created {@link FlowFile} */ FlowFile create(FlowFile parent); /** - * Creates a new FlowFile in the repository with no content but with a - * parent linkage to the FlowFiles specified by the parents Collection. The - * newly created FlowFile will inherit all of the attributes that are in - * common to all parents (except for the UUID, which will be in common if - * only a single parent exists). This method will automatically generate a - * Provenance JOIN event. + * Creates a new {@link FlowFile} in the repository with no content but with a parent linkage to all {@code parents}. + * The newly created FlowFile will inherit all the attributes that are in common to all parents, except for the UUID. + *

+ * This method will automatically generate a {@link ProvenanceEventType#JOIN} event. * - * @param parents which the new flowfile should inherit shared attributes from - * @return new flowfile + * @param parents to base the new {@link FlowFile} on, inheriting shared attributes from + * @return newly created {@link FlowFile} */ FlowFile create(Collection parents); /** - * Creates a new FlowFile that is a clone of the given FlowFile as of the - * time this is called, both in content and attributes. This method - * automatically emits a Provenance CLONE Event. + * Creates a new {@link FlowFile} with a parent linkage to the {@code example} FlowFile. + * It is a clone of the given FlowFile as of the time this is called, both in attributes and content. + *

+ * This method will automatically generate a {@link ProvenanceEventType#CLONE} event. * - * @param example FlowFile to be the source of cloning - given FlowFile must - * be a part of the given session - * @return FlowFile that is a clone of the given example - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s) - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws MissingFlowFileException if the given FlowFile content cannot be - * found. The FlowFile should no longer be reference, will be internally - * destroyed, and the session is automatically rolled back and what is left - * of the FlowFile is destroyed. - * @throws FlowFileAccessException if some IO problem occurs accessing - * FlowFile content - * @throws NullPointerException if the argument null + * @param example {@link FlowFile} to be the source of cloning - given FlowFile must be a part of the given session + * @return {@link FlowFile} that is a clone of the given {@code example} FlowFile + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the {@code example} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. + * @throws MissingFlowFileException if the given {@link FlowFile} content cannot be found. + * The FlowFile should no longer be referenced, will be internally destroyed. The session is automatically rolled back. + * @throws FlowFileAccessException if some IO problem occurs accessing {@link FlowFile} content */ FlowFile clone(FlowFile example); /** - * Creates a new FlowFile whose parent is the given FlowFile. The content of - * the new FlowFile will be a subset of the byte sequence of the given - * FlowFile starting at the specified offset and with the length specified. - * The new FlowFile will contain all of the attributes of the original. This - * method automatically emits a Provenance FORK Event (or a Provenance CLONE - * Event, if the offset is 0 and the size is exactly equal to the size of - * the example FlowFile). + * Creates a new {@link FlowFile} with a parent linkage to the {@code parent} FlowFile. + * It is a clone of the given FlowFile as of the time this is called, both in attributes and a subset of the content. + * The content of the new FlowFile will be a subset of the byte sequence of the given FlowFile, + * starting at the specified offset and with the length specified. + *

+ * This method will automatically generate a {@link ProvenanceEventType#FORK} or a {@link ProvenanceEventType#CLONE} event, + * if the offset is 0 and the size is exactly equal to the size of the example FlowFile. * - * @param parent to base the new flowfile attributes on - * @param offset of the parent flowfile to base the child flowfile content on - * @param size of the new flowfile from the offset - * @return a FlowFile with the specified size whose parent is first argument - * to this function - * - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session, or if the - * specified offset + size exceeds that of the size of the parent FlowFile. - * Automatic rollback will occur. - * @throws MissingFlowFileException if the given FlowFile content cannot be - * found. The FlowFile should no longer be reference, will be internally - * destroyed, and the session is automatically rolled back and what is left - * of the FlowFile is destroyed. + * @param parent {@link FlowFile} to be the source of cloning - given FlowFile must be a part of the given session + * @param offset of the parent {@link FlowFile}'s content to base the cloned FlowFile's content on + * @param size in bytes of the parent {@link FlowFile}'s content to clone starting from the {@code offset} + * @return {@link FlowFile} that is a partial clone of the given {@code parent} FlowFile whose content has the specified {@code size} + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the {@code parent} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Or if the specified {@code offset} + {@code size} exceeds the size of the {@code parent} FlowFile's content. + * Automatic rollback will occur. + * @throws MissingFlowFileException if the given {@link FlowFile} content cannot be found. + * The FlowFile should no longer be referenced, will be internally destroyed. The session is automatically rolled back. + * @throws FlowFileAccessException if some IO problem occurs accessing {@link FlowFile} content */ FlowFile clone(FlowFile parent, long offset, long size); /** - * Sets a penalty for the given FlowFile which will make it unavailable to - * be operated on any further during the penalty period. + * Sets a penalty for the given {@link FlowFile}, + * which will make it unavailable to be operated on any further during the penalty period. * * @param flowFile to penalize - * @return FlowFile the new FlowFile reference to use - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s) - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws NullPointerException if the argument null + * @return the penalized {@link FlowFile} + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the {@code flowFile} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. */ FlowFile penalize(FlowFile flowFile); /** - * Updates the given FlowFiles attributes with the given key/value pair. If - * the key is named {@code uuid}, this attribute will be ignored. + * Updates the given {@link FlowFile}'s attributes with the given {@code key} / {@code value} pair. + *

+ * If the {@code key} is named {@code uuid}, this attribute will be ignored. * * @param flowFile to update - * @param key of attribute - * @param value of attribute - * @return FlowFile the updated FlowFile - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws NullPointerException if an argument is null + * @param key of attribute to add or modify + * @param value of attribute to add or modify + * @return the updated {@link FlowFile} with the attribute added or modified + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the {@code flowFile} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. */ FlowFile putAttribute(FlowFile flowFile, String key, String value); /** - * Updates the given FlowFiles attributes with the given key/value pairs. If - * the map contains a key named {@code uuid}, this attribute will be - * ignored. + * Updates the given {@link FlowFile}'s attributes with the given {@code key} / {@code value} pairs. + *

+ * If the map contains a key named {@code uuid}, this attribute will be ignored. * * @param flowFile to update - * @param attributes the attributes to add to the given FlowFile - * @return FlowFile the updated FlowFile - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s) - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws NullPointerException if an argument is null + * @param attributes the attributes to add or modify + * @return the updated {@link FlowFile} with the attributes added or modified + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the {@code flowFile} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. */ FlowFile putAllAttributes(FlowFile flowFile, Map attributes); /** - * Removes the given FlowFile attribute with the given key. If the key is - * named {@code uuid}, this method will return the same FlowFile without - * removing any attribute. + * Removes the attribute with the given {@code key} from the given {@link FlowFile}. + *

+ * If the {@code key} is named {@code uuid}, this method will return the same FlowFile without removing any attribute. * * @param flowFile to update - * @param key of attribute - * @return FlowFile the updated FlowFile - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s) - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws NullPointerException if the argument null + * @param key of attribute to remove + * @return the updated {@link FlowFile} with the matching attribute removed + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the {@code flowFile} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. */ FlowFile removeAttribute(FlowFile flowFile, String key); /** - * Removes the attributes with the given keys from the given FlowFile. If - * the set of keys contains the value {@code uuid}, this key will be ignored + * Removes the attributes with the given {@code keys} from the given {@link FlowFile}. + *

+ * If the set of keys contains the value {@code uuid}, this key will be ignored. * * @param flowFile to update - * @param keys of attribute - * @return FlowFile the updated FlowFile - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s) - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws NullPointerException if the argument null + * @param keys of attributes to remove + * @return the updated {@link FlowFile} with the matching attributes removed + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the {@code flowFile} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. */ FlowFile removeAllAttributes(FlowFile flowFile, Set keys); /** - * Remove all attributes from the given FlowFile that have keys which match - * the given pattern. If the pattern matches the key {@code uuid}, this key - * will not be removed. + * Removes all attributes from the given {@link FlowFile} whose key matches the given pattern. + *

+ * If the pattern matches the key {@code uuid}, this key will not be removed. * * @param flowFile to update - * @param keyPattern may be null; if supplied is matched against each of the - * FlowFile attribute keys - * @return FlowFile containing only attributes which did not meet the key - * pattern + * @param keyPattern pattern to match each {@link FlowFile} attribute against; may be null, in which case no attribute is removed + * @return the updated {@link FlowFile} with the matching attributes removed + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the {@code flowFile} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. */ FlowFile removeAllAttributes(FlowFile flowFile, Pattern keyPattern); /** - * Transfers the given FlowFile to the appropriate destination processor - * work queue(s) based on the given relationship. If the relationship leads - * to more than one destination the state of the FlowFile is replicated such - * that each destination receives an exact copy of the FlowFile though each - * will have its own unique identity. The destination processors will not be - * able to operate on the given FlowFile until this session is committed or - * until the ownership of the session is migrated to another processor. If - * ownership of the session is passed to a destination processor then that - * destination processor will have immediate visibility of the transferred - * FlowFiles within the session. + * Transfers the given {@link FlowFile} back to the work queue from which it was pulled. + *

+ * The processor will not be able to operate on the given FlowFile until this session is committed. + * Any modifications that have been made to the FlowFile will be maintained. + * FlowFiles that are created by the processor cannot be transferred back to themselves via this method. * * @param flowFile to transfer - * @param relationship to transfer to - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s) - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws NullPointerException if the argument null - * @throws IllegalArgumentException if given relationship is not a known or - * registered relationship - */ - void transfer(FlowFile flowFile, Relationship relationship); - - /** - * Transfers the given FlowFile back to the work queue from which it was - * pulled. The processor will not be able to operate on the given FlowFile - * until this session is committed. Any modifications that have been made to - * the FlowFile will be maintained. FlowFiles that are created by the - * processor cannot be transferred back to themselves via this method. - * - * @param flowFile to transfer - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s) - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws IllegalArgumentException if the FlowFile was created by this - * processor - * @throws NullPointerException if the argument null + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the {@code flowFile} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. + * @throws IllegalArgumentException if the given {@link FlowFile} was created by this processor */ void transfer(FlowFile flowFile); /** - * Transfers the given FlowFiles back to the work queues from which the - * FlowFiles were pulled. The processor will not be able to operate on the - * given FlowFile until this session is committed. Any modifications that - * have been made to the FlowFile will be maintained. FlowFiles that are - * created by the processor cannot be transferred back to themselves via - * this method. + * Transfers the given {@link FlowFile}s back to the work queues from which the FlowFiles were pulled. + *

+ * The processor will not be able to operate on the given FlowFiles until this session is committed. + * Any modifications that have been made to the FlowFiles will be maintained. + * FlowFiles that are created by the processor cannot be transferred back to themselves via this method. * * @param flowFiles to transfer - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s) - * @throws FlowFileHandlingException if the given FlowFiles are already - * transferred or removed or don't belong to this session. Automatic - * rollback will occur. - * @throws IllegalArgumentException if the FlowFile was created by this - * processor - * @throws NullPointerException if the argument null + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the {@code flowFile} {@link FlowFile} + * @throws FlowFileHandlingException if any of the given {@link FlowFile}s is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. + * @throws IllegalArgumentException if any of the given {@link FlowFile}s was created by this processor */ void transfer(Collection flowFiles); /** - * Transfers the given FlowFile to the appropriate destination processor - * work queue(s) based on the given relationship. If the relationship leads - * to more than one destination the state of the FlowFile is replicated such - * that each destination receives an exact copy of the FlowFile though each - * will have its own unique identity. The destination processors will not be - * able to operate on the given FlowFile until this session is committed or - * until the ownership of the session is migrated to another processor. If - * ownership of the session is passed to a destination processor then that - * destination processor will have immediate visibility of the transferred - * FlowFiles within the session. + * Transfers the given {@link FlowFile} to the appropriate destination processor work queue(s) based on the given {@code relationship}. + *

+ * If the relationship leads to more than one destination the state of the FlowFile is replicated + * such that each destination receives an exact copy of the FlowFile though each will have its own unique identity. + * The destination processors will not be able to operate on the given FlowFile until this session is committed or + * until the ownership of the session is migrated to another processor. + * If ownership of the session is passed to a destination processor then that destination processor will have immediate visibility + * of the transferred FlowFiles within the session. + * + * @param flowFile to transfer + * @param relationship to transfer to + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the {@code flowFile} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. + * @throws IllegalArgumentException if given relationship is not a known or registered relationship + */ + void transfer(FlowFile flowFile, Relationship relationship); + + /** + * Transfers the given {@link FlowFile}s to the appropriate destination processor work queue(s) based on the given {@code relationship}. + *

+ * If the relationship leads to more than one destination the state of each FlowFile is replicated + * such that each destination receives an exact copy of the FlowFile though each will have its own unique identity. + * The destination processors will not be able to operate on the given FlowFiles until this session is committed or + * until the ownership of the session is migrated to another processor. + * If ownership of the session is passed to a destination processor then that destination processor will have immediate visibility + * of the transferred FlowFiles within the session. * * @param flowFiles to transfer * @param relationship to transfer to - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s) - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws NullPointerException if the argument null - * @throws IllegalArgumentException if given relationship is not a known or - * registered relationship + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for any of the {@code flowFiles} {@link FlowFile}s + * @throws FlowFileHandlingException if any of the given {@link FlowFile}s is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. + * @throws IllegalArgumentException if given relationship is not a known or registered relationship */ void transfer(Collection flowFiles, Relationship relationship); /** - * Ends the managed persistence for the given FlowFile. The persistent - * attributes for the FlowFile are deleted and so is the content assuming - * nothing else references it and this FlowFile will no longer be available - * for further operation. + * Ends the managed persistence for the given {@link FlowFile}. + *

+ * The persistent attributes for the FlowFile are deleted and so is the content assuming nothing else references it. + * This FlowFile will no longer be available for further operation. * * @param flowFile to remove - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s) - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the given {@code flowFile} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. */ void remove(FlowFile flowFile); /** - * Ends the managed persistence for the given FlowFiles. The persistent - * attributes for the FlowFile are deleted and so is the content assuming - * nothing else references it and this FlowFile will no longer be available - * for further operation. + * Ends the managed persistence for the given {@link FlowFile}s. + *

+ * The persistent attributes for the FlowFiles are deleted and so is the content assuming nothing else references it. + * The FlowFiles will no longer be available for further operation. * * @param flowFiles to remove - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s) - * @throws FlowFileHandlingException if any of the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for any of the given {@code flowFiles} {@link FlowFile}s + * @throws FlowFileHandlingException if any of the given {@link FlowFile}s is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. */ void remove(Collection flowFiles); /** - * Executes the given callback against the contents corresponding to the - * given FlowFile. + * Executes the given {code reader} {@link InputStreamCallback} against the content of the given {@link FlowFile}. * - * @param source flowfile to retrieve content of - * @param reader that will be called to read the flowfile content - * @throws IllegalStateException if detected that this method is being - * called from within a write callback of another method (i.e., from within the callback - * that is passed to {@link #write(FlowFile, OutputStreamCallback)} or {@link #write(FlowFile, StreamCallback)}) - * or has an OutputStream open (via a call to {@link #write(FlowFile)}) in this session and for - * the given FlowFile(s). Said another way, it is not permissible to call this method while writing to - * the same FlowFile. - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws MissingFlowFileException if the given FlowFile content cannot be - * found. The FlowFile should no longer be referenced, will be internally - * destroyed, and the session is automatically rolled back and what is left - * of the FlowFile is destroyed. - * @throws FlowFileAccessException if some IO problem occurs accessing - * FlowFile content; if an attempt is made to access the InputStream - * provided to the given InputStreamCallback after this method completed its - * execution + * @param source the {@link FlowFile} to retrieve the content from + * @param reader {@link InputStreamCallback} that will be called to read the {@link FlowFile} content + * @throws IllegalStateException if detected that this method is being called from within a write callback + * (see {@link #write(FlowFile, StreamCallback)}, {@link #write(FlowFile, OutputStreamCallback)}) + * or while a write stream is open (see {@link #write(FlowFile)}) for the given {@code source} {@link FlowFile}. + * Said another way, it is not permissible to call this method while writing to the same FlowFile. + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. + * @throws MissingFlowFileException if the given {@link FlowFile} content cannot be found. + * The FlowFile should no longer be referenced, will be internally destroyed. The session is automatically rolled back. + * @throws FlowFileAccessException if some IO problem occurs accessing {@link FlowFile} content; + * if an attempt is made to access the {@link InputStream} provided to the given {@link InputStreamCallback} + * after this method completed its execution */ void read(FlowFile source, InputStreamCallback reader) throws FlowFileAccessException; /** - * Provides an InputStream that can be used to read the contents of the given FlowFile. - * This method differs from those that make use of callbacks in that this method returns - * an InputStream and expects the caller to properly handle the lifecycle of the InputStream - * (i.e., the caller is responsible for ensuring that the InputStream is closed appropriately). - * The Process Session may or may not handle closing the stream when {@link #commit()} or {@link #rollback()} - * is called, but the responsibility of doing so belongs to the caller. The InputStream will throw - * an IOException if an attempt is made to read from the stream after the session is committed or - * rolled back. + * Provides an {@link InputStream} that can be used to read the content of the given {@link FlowFile}. + *

+ * This method differs from those that make use of callbacks in that this method returns an InputStream and expects the caller + * to properly handle the lifecycle of the InputStream (i.e., the caller is responsible for ensuring that the InputStream is closed appropriately). + * The session may or may not handle closing the stream when the session is commited or rolled back, + * but the responsibility of doing so belongs to the caller. * - * @param flowFile the FlowFile to read - * @return an InputStream that can be used to read the contents of the FlowFile - * @throws IllegalStateException if detected that this method is being - * called from within a write callback of another method (i.e., from within the callback - * that is passed to {@link #write(FlowFile, OutputStreamCallback)} or {@link #write(FlowFile, StreamCallback)}) - * or has an OutputStream open (via a call to {@link #write(FlowFile)}) in this session and for - * the given FlowFile(s). Said another way, it is not permissible to call this method while writing to - * the same FlowFile. - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws MissingFlowFileException if the given FlowFile content cannot be - * found. The FlowFile should no longer be referenced, will be internally - * destroyed, and the session is automatically rolled back and what is left - * of the FlowFile is destroyed. + * @param flowFile the {@link FlowFile} to retrieve the content from + * @return an {@link InputStream} that can be used to read the content of the {@link FlowFile} + * @throws IllegalStateException if detected that this method is being called from within a write callback + * (see {@link #write(FlowFile, StreamCallback)}, {@link #write(FlowFile, OutputStreamCallback)}) + * or while a write stream is open (see {@link #write(FlowFile)}) for the given {@code flowFile} {@link FlowFile}. + * Said another way, it is not permissible to call this method while writing to the same FlowFile. + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. + * @throws MissingFlowFileException if the given {@link FlowFile} content cannot be found. + * The FlowFile should no longer be referenced, will be internally destroyed. The session is automatically rolled back. + * @throws FlowFileAccessException if some IO problem occurs accessing {@link FlowFile} content; + * if an attempt is made to read from the stream after the session is committed or rolled back. */ InputStream read(FlowFile flowFile); - /** - * Combines the content of all given source FlowFiles into a single given - * destination FlowFile. + * Combines the content of all given {@code sources} {@link FlowFile}s into a single given destination FlowFile. * - * @param sources the flowfiles to merge - * @param destination the flowfile to use as the merged result - * @return updated destination FlowFile (new size, etc...) - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s) - * @throws IllegalArgumentException if the given destination is contained - * within the sources - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws MissingFlowFileException if the given FlowFile content cannot be - * found. The FlowFile should no longer be reference, will be internally - * destroyed, and the session is automatically rolled back and what is left - * of the FlowFile is destroyed. - * @throws FlowFileAccessException if some IO problem occurs accessing - * FlowFile content. The state of the destination will be as it was prior to - * this call. + * @param sources the {@link FlowFile}s whose content to merge + * @param destination the {@link FlowFile} to use as the merged result + * @return the updated {@code destination} destination {@link FlowFile} with changed content + * @throws IllegalArgumentException if the given destination is contained within the sources + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for any of the given {@code sources} and {@code destination} {@link FlowFile}s + * @throws FlowFileHandlingException if any of the given {@link FlowFile}s is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. + * @throws MissingFlowFileException if any of the given {@link FlowFile}'s content cannot be found. + * The FlowFile should no longer be referenced, will be internally destroyed. The session is automatically rolled back. + * @throws FlowFileAccessException if some IO problem occurs accessing {@link FlowFile} content; + * the state of the {@code destination} {@link FlowFile} will be as it was prior to this call. */ FlowFile merge(Collection sources, FlowFile destination); /** - * Combines the content of all given source FlowFiles into a single given - * destination FlowFile. + * Combines the content of all given {@code sources} {@link FlowFile}s into a single given destination FlowFile. * - * @param sources to merge together - * @param destination to merge to - * @param header bytes that will be added to the beginning of the merged - * output. May be null or empty. - * @param footer bytes that will be added to the end of the merged output. - * May be null or empty. - * @param demarcator bytes that will be placed in between each object merged - * together. May be null or empty. - * @return updated destination FlowFile (new size, etc...) - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s) - * @throws IllegalArgumentException if the given destination is contained - * within the sources - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws MissingFlowFileException if the given FlowFile content cannot be - * found. The FlowFile should no longer be reference, will be internally - * destroyed, and the session is automatically rolled back and what is left - * of the FlowFile is destroyed. - * @throws FlowFileAccessException if some IO problem occurs accessing - * FlowFile content. The state of the destination will be as it was prior to - * this call. + * @param sources the {@link FlowFile}s whose content to merge + * @param destination the {@link FlowFile} to use as the merged result + * @param header bytes that will be added to the beginning of the merged output; may be null or empty + * @param footer bytes that will be added to the end of the merged output; may be null or empty + * @param demarcator bytes that will be placed in between each object merged together; may be null or empty + * @return the updated {@code destination} {@link FlowFile} with changed content + * @throws IllegalArgumentException if the given destination is contained within the sources + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for any of the given {@code sources} and {@code destination} {@link FlowFile}s + * @throws FlowFileHandlingException if any of the given {@link FlowFile}s is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. + * @throws MissingFlowFileException if any of the given {@link FlowFile}'s content cannot be found. + * The FlowFile should no longer be referenced, will be internally destroyed. The session is automatically rolled back. + * @throws FlowFileAccessException if some IO problem occurs accessing {@link FlowFile} content; + * the state of the {@code destination} {@link FlowFile} will be as it was prior to this call. */ FlowFile merge(Collection sources, FlowFile destination, byte[] header, byte[] footer, byte[] demarcator); /** - * Executes the given callback against the content corresponding to the - * given FlowFile. + * Executes the given {code writer} {@link OutputStreamCallback} against the content of the given {@link FlowFile}. * - * Note: The OutputStream provided to the given OutputStreamCallback - * will not be accessible once this method has completed its execution. - * - * @param source to write to - * @param writer used to write new content - * @return updated FlowFile - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s), or if there is an open InputStream or OutputStream for the FlowFile's content - * (see {@link #read(FlowFile)} and {@link #write(FlowFile)}). - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws MissingFlowFileException if the given FlowFile content cannot be - * found. The FlowFile should no longer be referenced, will be internally - * destroyed, and the session is automatically rolled back and what is left - * of the FlowFile is destroyed. - * @throws FlowFileAccessException if some IO problem occurs accessing - * FlowFile content; if an attempt is made to access the OutputStream - * provided to the given OutputStreamCallaback after this method completed - * its execution + * @param source the {@link FlowFile} to write the content of + * @param writer {@link InputStreamCallback} that will be called to write the {@link FlowFile} content + * @return the updated {@code source} {@link FlowFile} with changed content + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the given {@code source} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. + * @throws MissingFlowFileException if the given {@link FlowFile} content cannot be found. + * The FlowFile should no longer be referenced, will be internally destroyed. The session is automatically rolled back. + * @throws FlowFileAccessException if some IO problem occurs accessing {@link FlowFile} content; + * if an attempt is made to access the {@link OutputStream} provided to the given {@link OutputStreamCallback} + * after this method completed its execution */ FlowFile write(FlowFile source, OutputStreamCallback writer) throws FlowFileAccessException; /** - * Provides an OutputStream that can be used to write to the contents of the - * given FlowFile. + * Provides an {@link OutputStream} that can be used to write the content of the given {@link FlowFile}. + *

+ * This method differs from those that make use of callbacks in that this method returns an OutputStream and expects the caller + * to properly handle the lifecycle of the OutputStream (i.e., the caller is responsible for ensuring that the OutputStream is closed appropriately). + * The session may or may not handle closing the stream when the session is commited or rolled back, + * but the responsibility of doing so belongs to the caller. * - * @param source to write to - * - * @return an OutputStream that can be used to write to the contents of the FlowFile - * - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s), or if there is an open InputStream or OutputStream for the FlowFile's content - * (see {@link #read(FlowFile)}). - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws MissingFlowFileException if the given FlowFile content cannot be - * found. The FlowFile should no longer be referenced, will be internally - * destroyed, and the session is automatically rolled back and what is left - * of the FlowFile is destroyed. - * @throws FlowFileAccessException if some IO problem occurs accessing - * FlowFile content; if an attempt is made to access the OutputStream - * provided to the given OutputStreamCallaback after this method completed - * its execution + * @param source the {@link FlowFile} to write the content of + * @return an {@link OutputStream} that can be used to write the content of the {@link FlowFile} + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the given {@code source} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. + * @throws MissingFlowFileException if the given {@link FlowFile} content cannot be found. + * The FlowFile should no longer be referenced, will be internally destroyed. The session is automatically rolled back. + * @throws FlowFileAccessException if some IO problem occurs accessing {@link FlowFile} content; + * if an attempt is made to write to the stream after the session is committed or rolled back. */ OutputStream write(FlowFile source); /** - * Executes the given callback against the content corresponding to the - * given flow file. + * Executes the given {code writer} {@link StreamCallback} against the content of the given {@link FlowFile}. * - * Note: The InputStream & OutputStream provided to the given - * StreamCallback will not be accessible once this method has completed its - * execution. - * - * @param source to read from and write to - * @param writer used to read the old content and write new content - * @return updated FlowFile - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s), or if there is an open InputStream or OutputStream for the FlowFile's content - * (see {@link #read(FlowFile)} and {@link #write(FlowFile)}). - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws MissingFlowFileException if the given FlowFile content cannot be - * found. The FlowFile should no longer be reference, will be internally - * destroyed, and the session is automatically rolled back and what is left - * of the FlowFile is destroyed. - * @throws FlowFileAccessException if some IO problem occurs accessing - * FlowFile content; if an attempt is made to access the InputStream or - * OutputStream provided to the given StreamCallback after this method - * completed its execution + * @param source the {@link FlowFile} to read and write the content of + * @param writer {@link StreamCallback} that will be called to read and write the {@link FlowFile} content + * @return the updated {@code source} {@link FlowFile} with changed content + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the given {@code source} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. + * @throws MissingFlowFileException if the given {@link FlowFile} content cannot be found. + * The FlowFile should no longer be referenced, will be internally destroyed. The session is automatically rolled back. + * @throws FlowFileAccessException if some IO problem occurs accessing {@link FlowFile} content; + * if an attempt is made to access the {@link InputStream} or {@link OutputStream} + * provided to the given {@link StreamCallback} after this method completed its execution */ FlowFile write(FlowFile source, StreamCallback writer) throws FlowFileAccessException; /** - * Executes the given callback against the content corresponding to the - * given FlowFile, such that any data written to the OutputStream of the - * content will be appended to the end of FlowFile. + * Executes the given {code writer} {@link OutputStreamCallback} against the content of the given {@link FlowFile}, + * such that any data written to the OutputStream will be appended to the end of FlowFile's content. * - * Note: The OutputStream provided to the given OutputStreamCallback - * will not be accessible once this method has completed its execution. - * - * @param source the flowfile for which content should be appended - * @param writer used to write new bytes to the flowfile content - * @return the updated flowfile reference for the new content - * @throws FlowFileAccessException if an attempt is made to access the - * OutputStream provided to the given OutputStreamCallaback after this - * method completed its execution - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s), or if there is an open InputStream or OutputStream for the FlowFile's content - * (see {@link #read(FlowFile)} and {@link #write(FlowFile)}). + * @param source the {@link FlowFile} to extend the content of + * @param writer {@link OutputStreamCallback} that will be called to append the {@link FlowFile}'s content + * @return the updated {@code source} {@link FlowFile} with changed content + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the given {@code source} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. + * @throws MissingFlowFileException if the given {@link FlowFile} content cannot be found. + * The FlowFile should no longer be referenced, will be internally destroyed. The session is automatically rolled back. + * @throws FlowFileAccessException if some IO problem occurs accessing {@link FlowFile} content; + * if an attempt is made to access the {@link OutputStream} provided to the given {@link OutputStreamCallback} + * after this method completed its execution */ FlowFile append(FlowFile source, OutputStreamCallback writer) throws FlowFileAccessException; /** - * Writes to the given FlowFile all content from the given content path. + * Writes to contents of the file a the {@code source} {@link Path} to the given {@link FlowFile}'s content. * - * @param source the file from which content will be obtained - * @param keepSourceFile if true the content is simply copied; if false the - * original content might be used in a destructive way for efficiency such - * that the repository will have the data but the original data will be - * gone. If false the source object will be removed or gone once imported. - * It will not be restored if the session is rolled back so this must be - * used with caution. In some cases it can result in tremendous efficiency - * gains but is also dangerous. - * @param destination the FlowFile whose content will be updated - * @return the updated destination FlowFile (new size) - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s) - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws MissingFlowFileException if the given FlowFile content cannot be - * found. The FlowFile should no longer be reference, will be internally - * destroyed, and the session is automatically rolled back and what is left - * of the FlowFile is destroyed. - * @throws FlowFileAccessException if some IO problem occurs accessing - * FlowFile content + * @param source the {@link Path} to the file from which content will be obtained + * @param keepSourceFile if true the content is simply copied; + * if false the original content might be used in a destructive way for efficiency, + * such that the repository will have the data but the original data will be gone. + * If false the source object will be removed or gone once imported. + * It will not be restored if the session is rolled back so this must be used with caution. + * In some cases it can result in tremendous efficiency gains but is also dangerous. + * @param destination the {@link FlowFile} whose content will be updated + * @return the updated {@code destination} {@link FlowFile} with changed content + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the given {@code source} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. + * @throws MissingFlowFileException if the given {@link FlowFile} content cannot be found. + * The FlowFile should no longer be referenced, will be internally destroyed. The session is automatically rolled back. + * @throws FlowFileAccessException if some IO problem occurs accessing {@link FlowFile} content */ FlowFile importFrom(Path source, boolean keepSourceFile, FlowFile destination); /** - * Writes to the given FlowFile all content from the given content path. + * Writes to contents of the {@code source} {@link InputStream} to the given {@link FlowFile}'s content. * - * @param source the file from which content will be obtained - * @param destination the FlowFile whose content will be updated - * @return the updated destination FlowFile (new size) - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s) - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws MissingFlowFileException if the given FlowFile content cannot be - * found. The FlowFile should no longer be reference, will be internally - * destroyed, and the session is automatically rolled back and what is left - * of the FlowFile is destroyed. - * @throws FlowFileAccessException if some IO problem occurs accessing - * FlowFile content + * @param source the {@link InputStream} from which content will be obtained + * @param destination the {@link FlowFile} whose content will be updated + * @return the updated {@code destination} {@link FlowFile} with changed content + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the given {@code source} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. + * @throws MissingFlowFileException if the given {@link FlowFile} content cannot be found. + * The FlowFile should no longer be referenced, will be internally destroyed. The session is automatically rolled back. + * @throws FlowFileAccessException if some IO problem occurs accessing {@link FlowFile} content */ FlowFile importFrom(InputStream source, FlowFile destination); /** - * Writes the content of the given FlowFile to the given destination path. + * Writes the content of the given {@link FlowFile} to the file at the given {@code destination} {@link Path}. * - * @param flowFile to export the content of - * @param destination to export the content to - * @param append if true will append to the current content at the given - * path; if false will replace any current content - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s) - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws MissingFlowFileException if the given FlowFile content cannot be - * found. The FlowFile should no longer be reference, will be internally - * destroyed, and the session is automatically rolled back and what is left - * of the FlowFile is destroyed. - * @throws FlowFileAccessException if some IO problem occurs accessing - * FlowFile content + * @param flowFile the {@link FlowFile} to export the content of + * @param destination the {@link Path} to a file to export the {@link FlowFile}'s content to + * @param append if true will append to the current content of the file at the given path; + * if false will replace any current content + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the given {@code flowFile} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. + * @throws MissingFlowFileException if the given {@link FlowFile} content cannot be found. + * The FlowFile should no longer be referenced, will be internally destroyed. The session is automatically rolled back. + * @throws FlowFileAccessException if some IO problem occurs accessing {@link FlowFile} content */ void exportTo(FlowFile flowFile, Path destination, boolean append); /** - * Writes the content of the given FlowFile to the given destination stream + * Writes the content of the given {@link FlowFile} to given {@code destination} {@link OutputStream}. * - * @param flowFile to export the content of - * @param destination to export the content to - * @throws IllegalStateException if detected that this method is being - * called from within a callback of another method in this session and for - * the given FlowFile(s) - * @throws FlowFileHandlingException if the given FlowFile is already - * transferred or removed or doesn't belong to this session. Automatic - * rollback will occur. - * @throws MissingFlowFileException if the given FlowFile content cannot be - * found. The FlowFile should no longer be reference, will be internally - * destroyed, and the session is automatically rolled back and what is left - * of the FlowFile is destroyed. - * @throws FlowFileAccessException if some IO problem occurs accessing - * FlowFile content + * @param flowFile the {@link FlowFile} to export the content of + * @param destination the {@link OutputStream} to export the {@link FlowFile}'s content to + * @throws IllegalStateException if detected that this method is being called from within a read or write callback + * (see {@link #read(FlowFile, InputStreamCallback)}, {@link #write(FlowFile, StreamCallback)}, + * {@link #write(FlowFile, OutputStreamCallback)}) or while a read or write stream is open + * (see {@link #read(FlowFile)}, {@link #write(FlowFile)}) for the given {@code flowFile} {@link FlowFile} + * @throws FlowFileHandlingException if the given {@link FlowFile} is already transferred or removed or doesn't belong to this session. + * Automatic rollback will occur. + * @throws MissingFlowFileException if the given {@link FlowFile} content cannot be found. + * The FlowFile should no longer be referenced, will be internally destroyed. The session is automatically rolled back. + * @throws FlowFileAccessException if some IO problem occurs accessing {@link FlowFile} content */ void exportTo(FlowFile flowFile, OutputStream destination); /** - * Returns a ProvenanceReporter that is tied to this ProcessSession. + * Returns the {@link ProvenanceReporter} that is tied to {@code this} {@link ProcessSession}. * - * @return the provenance reporter + * @return the {@link ProvenanceReporter} that is tied to {@code this} {@link ProcessSession} */ ProvenanceReporter getProvenanceReporter(); - /** - * Updates the value of the component's state, setting it to given value. This method does not push the new value to the - * remote State Provider but rather caches the value until {@link #commit()} is called. At that point, it will publish the - * state to the remote State Provider, if the state is the latest according to the remote State Provider. + * Updates the value of the component's state, setting it to given value. + *

+ * This method does update the remote State Provider immediately but rather caches the value until the session is committed. + * At that point, it will publish the state to the remote State Provider, if the state is the latest according to the remote State Provider. * * @param state the value to change the state to - * @param scope the scope to use when storing the state + * @param scope the {@link Scope} to use when storing the state * @throws IOException if unable to communicate with the underlying storage mechanism */ void setState(Map state, Scope scope) throws IOException; /** - * Returns the current state for the component. This return value will never be null. + * Returns the current state for the component. + *

+ * This return value will never be {@code null}. * If the state has not yet been set, the StateMap's version will be -1, and the map of values will be empty. * - * @param scope the scope to use when fetching the state + * @param scope the {@link Scope} to use when fetching the state * @return the current state for the component * @throws IOException if unable to communicate with the underlying storage mechanism */ StateMap getState(Scope scope) throws IOException; /** - * Updates the value of the component's state to the new value if and only if the value currently - * is the same as the given oldValue. The oldValue will be compared against the value of the state as it is - * known to the Process Session. If the Process Session does not currently know the state, it will be fetched - * from the StateProvider. - * - * The value will not be provided to any remote state provider until {@link #commit()} is called. At that point, - * if the value that has been set by this method is the most up-to-date value, according to the state provider, - * then the remote state provider will be updated to match the given newValue. - * - * @param oldValue the old value to compare against - * @param newValue the new value to use if and only if the state's value is the same as the given oldValue - * @param scope the scope to use for storing the new state - * @return true if the state was updated to the new value, false if the state's value was not - * equal to oldValue + * Updates the value of the component's state, setting it to given {@code newValue}, + * if and only if the current value is the same as the given {@code oldValue}. + *

+ * The oldValue will be compared against the value of the state as it is known to {@code this} {@link ProcessSession}. + * If the Process Session does not currently know the state, it will be fetched from the StateProvider. + *

+ * This method does update the remote State Provider immediately but rather caches the value until the session is committed. + * At that point, it will publish the state to the remote State Provider, if the state is the latest according to the remote State Provider. * + * @param oldValue the value to compare the state's current value against + * @param newValue the new value to use if and only if the state's current value is the same as the given {@code oldValue} + * @param scope the {@link Scope} to use for fetching the current and storing the new state + * @return {@code true} if the state was updated to the {@code newValue}, + * {@code false} if the state's current value was not equal to {@code oldValue} * @throws IOException if unable to communicate with the underlying storage mechanism */ boolean replaceState(StateMap oldValue, Map newValue, Scope scope) throws IOException; /** - * Clears all keys and values from the component's state when the session is committed - * - * @param scope the scope whose values should be cleared + * Clears all keys and values from the component's state. + *

+ * This method does update the remote State Provider immediately but rather caches the value until the session is committed. + * At that point, it will publish the state to the remote State Provider, if the state is the latest according to the remote State Provider. * + * @param scope the {@link Scope} to use for clearing the state * @throws IOException if unable to communicate with the underlying storage mechanism. */ void clearState(Scope scope) throws IOException;