/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.nifi.provenance;
import java.util.List;
import java.util.Map;
/**
* Describes an event that happened to a FlowFile.
*/
public interface ProvenanceEventRecord {
String REMOTE_INPUT_PORT_TYPE = "Remote Input Port";
String REMOTE_OUTPUT_PORT_TYPE = "Remote Output Port";
/**
* @return a unique ID for this Provenance Event. Depending on the
* implementation, the Event ID may be set to -1 until the event has been
* added to the {@link ProvenanceEventRepository}
*/
long getEventId();
/**
* @return the time at which this Provenance Event was created, as the
* number of milliseconds since epoch
*/
long getEventTime();
/**
* @return the EntryDate of the FlowFile to which this Event is associated
*/
long getFlowFileEntryDate();
/**
* @return the time at which the lineage began
*/
long getLineageStartDate();
/**
* @return the size of the FlowFile to which this Event is associated
*/
long getFileSize();
/**
* @return the previous size of the FlowFile to which this Event is
* associated, if the FlowFile previously had content and its size was
* known; otherwise, returns <code>null</code>
*/
Long getPreviousFileSize();
/**
* @return the amount of time in milliseconds that elapsed while performing
* this event. If not populated, the value -1 will be returned
*/
long getEventDuration();
/**
* @return the type of this Provenance Event
*/
ProvenanceEventType getEventType();
/**
* @return all FlowFile attributes that were associated with the FlowFile at
* the time that this ProvenanceEvent was created
*/
Map<String, String> getAttributes();
/**
* Returns the attribute with the given name
*
* @param attributeName the name of the attribute to get
* @return the attribute with the given name or <code>null</code> if no attribute exists with the given name
*/
default String getAttribute(String attributeName) {
return getAttributes().get(attributeName);
}
/**
* @return all FlowFile attributes that existed on the FlowFile before this
* event occurred
*/
Map<String, String> getPreviousAttributes();
/**
* @return all FlowFile attributes that were updated as a result of this
* event
*/
Map<String, String> getUpdatedAttributes();
/**
* @return the ID of the Processor/component that created this Provenance
* Event
*/
String getComponentId();
/**
* @return the fully-qualified Class Name of the Processor/component that
* created this Provenance Event
*/
String getComponentType();
/**
* @return whether this event originated from a remote group port
*/
default boolean isRemotePortType() {
final String componentType = getComponentType();
return REMOTE_INPUT_PORT_TYPE.equals(componentType) || REMOTE_OUTPUT_PORT_TYPE.equals(componentType);
}
/**
* @return a URI that provides information about the System and Protocol
* information over which the transfer occurred. The intent of this field is
* such that both the sender and the receiver can publish the events to an
* external Enterprise-wide system that is then able to correlate the SEND
* and RECEIVE events.
*/
String getTransitUri();
/**
* Since the receiving system will usually refer to the data using a
* different identifier than the source system, this information is used to
* correlate the receive system's FlowFile with the sending system's data
*
* @return the UUID that the Source System used to refer to this data; this
* is applicable only when the {@link ProvenanceEventType} is of type
* {@link ProvenanceEventType#RECEIVE RECEIVE}
*/
String getSourceSystemFlowFileIdentifier();
/**
* @return the UUID of the FlowFile with which this Event is associated
*/
String getFlowFileUuid();
/**
* @return the UUID's of all Parent FlowFiles. This is applicable only when
* the {@link ProvenanceEventType} is of type
* {@link ProvenanceEventType#SPAWN SPAWN}
*/
List<String> getParentUuids();
/**
* @return the UUID's of all Child FlowFiles. This is applicable only when
* the {@link ProvenanceEventType} is of type
* {@link ProvenanceEventType#SPAWN SPAWN}
*/
List<String> getChildUuids();
/**
* @return the Alternate Identifier associated with the FlowFile with which
* this Event is associated. This is applicable only when the
* {@link ProvenanceEventType} is of type
* {@link ProvenanceEventType#ADDINFO}
*/
String getAlternateIdentifierUri();
/**
* @return the details for this record, if any were supplied. Otherwise,
* returns <code>null</code>
*/
String getDetails();
/**
* @return the relationship to which this record was routed if the event
* type is {@link ProvenanceEventType#ROUTE}. The relationship is applicable
* only to this type
*/
String getRelationship();
/**
* @return the identifier of the queue from which the FlowFile was taken, if
* any. If the FlowFile is created as a result of this event (in this case,
* the Event Type is one of null null null null null null null null {@link ProvenanceEventType#CREATE}, {@link ProvenanceEventType#RECEIVE},
* {@link ProvenanceEventType#FORK}, {@link ProvenanceEventType#JOIN}, or
* {@link ProvenanceEventType#CLONE}), or if the queue identifier is
* unknown, then this method will return <code>null</code>
*/
String getSourceQueueIdentifier();
/**
* @return the Section for the Content Claim that this Event refers to, if
* any; otherwise, returns <code>null</code>
*/
String getContentClaimSection();
/**
* @return the Section for the Content Claim that the FlowFile previously
* referenced, if any; otherwise, returns <code>null</code>
*/
String getPreviousContentClaimSection();
/**
* @return the Container for the Content Claim that this Event refers to, if
* any; otherwise, returns <code>null</code>
*/
String getContentClaimContainer();
/**
* @return the Container for the Content Claim that the FlowFile previously
* referenced, if any; otherwise, returns <code>null</code>
*/
String getPreviousContentClaimContainer();
/**
* @return the Identifier for the Content Claim that this Event refers to,
* if any; otherwise, returns <code>null</code>
*/
String getContentClaimIdentifier();
/**
* @return the Identifier for the Content Claim that the FlowFile previously
* referenced, if any; otherwise, returns <code>null</code>
*/
String getPreviousContentClaimIdentifier();
/**
* @return the offset into the Content Claim at which the FlowFile's content
* begins, if any; otherwise, returns <code>null</code>
*/
Long getContentClaimOffset();
/**
* @return the offset into the Content Claim at which the FlowFile's
* previous content began, if any; otherwise, returns <code>null</code>
*/
Long getPreviousContentClaimOffset();
/**
* Returns the best event identifier for this event (eventId if available, descriptive identifier if not yet persisted to allow for traceability).
*
* @return a descriptive event ID to allow tracing
*/
String getBestEventIdentifier();
}