javax.transaction.Status contains a list of int constants representing transaction status. It suffers many drawbacks like lack of type-check and unreadable output. Here is my attempt to create a wrapper enum type:
Below is a testcase that prints the 2-way association:
package javahowto;All 10 transaction status code are mirrored in the enum type. You can get the enum instance based on javax.transaction.Status code. The toString method of the enum is also overridden to print out both the string literal and the status code. This is a sample test program to illustrate these usage. Comments are welcome. Another implementation without using static mapping is described in this post (Enum wrapper for javax.transaction.Status (2))
import java.util.HashMap;
import java.util.Map;
import javax.transaction.Status;
public enum TransactionStatusEnum {
STATUS_ACTIVE (Status.STATUS_ACTIVE),
STATUS_COMMITTED (Status.STATUS_COMMITTED),
STATUS_COMMITTING (Status.STATUS_COMMITTING),
STATUS_MARKED_ROLLBACK (Status.STATUS_MARKED_ROLLBACK),
STATUS_NO_TRANSACTION (Status.STATUS_NO_TRANSACTION),
STATUS_PREPARED (Status.STATUS_PREPARED),
STATUS_PREPARING (Status.STATUS_PREPARING),
STATUS_ROLLEDBACK (Status.STATUS_ROLLEDBACK),
STATUS_ROLLING_BACK (Status.STATUS_ROLLING_BACK),
STATUS_UNKNOWN (Status.STATUS_UNKNOWN);
private static Map<Integer, TransactionStatusEnum> codeToEnums
= new HashMap<Integer, TransactionStatusEnum>();
static {
codeToEnums.put(Status.STATUS_ACTIVE, STATUS_ACTIVE);
codeToEnums.put(Status.STATUS_COMMITTED, STATUS_COMMITTED);
codeToEnums.put(Status.STATUS_COMMITTING, STATUS_COMMITTING);
codeToEnums.put(Status.STATUS_MARKED_ROLLBACK, STATUS_MARKED_ROLLBACK);
codeToEnums.put(Status.STATUS_NO_TRANSACTION, STATUS_NO_TRANSACTION);
codeToEnums.put(Status.STATUS_PREPARED, STATUS_PREPARED);
codeToEnums.put(Status.STATUS_PREPARING, STATUS_PREPARING);
codeToEnums.put(Status.STATUS_ROLLEDBACK, STATUS_ROLLEDBACK);
codeToEnums.put(Status.STATUS_ROLLING_BACK, STATUS_ROLLING_BACK);
codeToEnums.put(Status.STATUS_UNKNOWN, STATUS_UNKNOWN);
}
private Integer statusCode;
public Integer getStatusCode() {
return statusCode;
}
public static TransactionStatusEnum getEnumFor(Integer i) {
return codeToEnums.get(i);
}
@Override public String toString() {
return super.toString() + "(" + statusCode + ")";
}
private TransactionStatusEnum(int statusCode) {
this.statusCode = statusCode;
}
}
Below is a testcase that prints the 2-way association:
package javahowto;In the above test, I use 2 ways to get all elements of an enum type:
import java.util.EnumSet;
public class TestTransactionStatusEnum {
public static void main(String[] args) {
System.out.println("status code -> enum:");
for(int i = 0; i < TransactionStatusEnum.values().length; i++) {
System.out.println(TransactionStatusEnum.getEnumFor(i));
}
System.out.println("enum -> status code:");
for(TransactionStatusEnum e : EnumSet.allOf(TransactionStatusEnum.class)) {
System.out.println(e.toString() + "\t" + e.getStatusCode());
}
}
}
values()
is a built-inpublic static
method in all enum type, and returns an array of this type of enum.allOf(Class<E> elementType)
is apublic static
method injava.util.EnumSet
, which returns aset
of this type of enum.