blob: bef8b5636979ae60ac54d950bc707841ab7025cf [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.qpid.protonj2.engine;
import org.apache.qpid.protonj2.types.Binary;
import org.apache.qpid.protonj2.types.transactions.Declare;
import org.apache.qpid.protonj2.types.transport.ErrorCondition;
/**
* A Transaction object that hold information and context for a single {@link Transaction}.
*
* @param <E> The parent of this Transaction either a {@link TransactionController} or {@link TransactionManager}
*/
public interface Transaction<E extends Endpoint<?>> {
/**
* Provides state for this {@link Transaction}.
*/
public enum DischargeState {
/**
* The transaction is live and has not yet been committed or rolled back.
*/
NONE,
/**
* The transaction has been committed and cannot be rolled back.
*/
COMMIT,
/**
* The transaction has been rolled back and cannot be committed.
*/
ROLLBACK
}
/**
* @return the current {@link Transaction} state.
*/
TransactionState getState();
/**
* For a {@link Transaction} that has either been requested to discharge or has successfully
* discharged the {@link DischargeState} reflects whether the transaction was to be committed or
* rolled back. Prior to a discharge being attempted there is no state value and this method
* returns a {@link DischargeState} of none.
*
* @return the current {@link DischargeState} of the transaction.
*/
DischargeState getDischargeState();
/**
* @return true if the {@link Transaction} has been marked declared by the {@link TransactionManager}.
*/
boolean isDeclared();
/**
* @return true if the {@link Transaction} has been marked discharged by the {@link TransactionManager}.
*/
boolean isDischarged();
/**
* The parent resource will mark the {@link Transaction} as failed is any of the operations performed on
* it cannot be successfully completed such as a {@link Declare} operation failing to write due to an IO
* error.
*
* @return true if the {@link Transaction} has been marked failed by the parent resource.
*/
boolean isFailed();
/**
* If the declare or discharge of the transaction caused its state to become {@link TransactionState} FAILED
* this method returns the {@link ErrorCondition} that the remote used to describe the reason for the failure.
*
* @return the {@link ErrorCondition} that the {@link TransactionManager} used to fail the {@link Transaction}.
*/
ErrorCondition getCondition();
/**
* Returns a reference to the parent of this {@link Transaction} which will be either a
* {@link TransactionController} or a {@link TransactionManager} manager depending on the
* end of the {@link Link} that is operating on the {@link Transaction}.
*
* @return a reference to the parent of this {@link Transaction}.
*/
E parent();
/**
* Returns the transaction Id that is associated with the declared transaction. Prior to a
* {@link TransactionManager} completing a transaction declaration this method will return
* null to indicate that the transaction has not been declared yet.
*
* @return the transaction Id associated with the transaction once successfully declared.
*/
Binary getTxnId();
/**
* @return the {@link Attachments} instance that is associated with this {@link Transaction}
*/
Attachments getAttachments();
/**
* Links a given resource to this {@link Transaction}.
*
* @param resource
* The resource to link to this {@link Transaction}.
*/
void setLinkedResource(Object resource);
/**
* @return the user set linked resource for this {@link Transaction} instance.
*/
Object getLinkedResource();
/**
* Gets the linked resource (if set) and returns it using the type information
* provided to cast the returned value.
*
* @param <T> The type to cast the linked resource to if one is set.
* @param typeClass the type's Class which is used for casting the returned value.
*
* @return the user set linked resource for this Context instance.
*
* @throws ClassCastException if the linked resource cannot be cast to the type requested.
*/
<T> T getLinkedResource(Class<T> typeClass);
}