/*
* JBoss, Home of Professional Open Source
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
* (C) 2008,
* @author JBoss Inc.
*/
package org.jboss.test.jbossts.recovery;
import java.io.Serializable;
/**
* Specification of when to inject a failure.
*/
public class ASFailureType implements Serializable
{
private static final int _NONE = 1;
private static final int _PRE_PREPARE = 2;
private static final int _XARES_START = 3;
private static final int _XARES_END = 4;
private static final int _XARES_PREPARE = 5;
private static final int _XARES_ROLLBACK = 6;
private static final int _XARES_COMMIT = 7;
private static final int _XARES_RECOVER = 8;
private static final int _XARES_FORGET = 9;
private static final int _SYNCH_BEFORE = 10;
private static final int _SYNCH_AFTER = 11;
private static final String _NONE_NAME = "NONE";
private static final String _PRE_PREPARE_NAME = "PRE_PREPARE";
private static final String _XARES_START_NAME = "XARES_START";
private static final String _XARES_END_NAME = "XARES_END";
private static final String _XARES_PREPARE_NAME = "XARES_PREPARE";
private static final String _XARES_ROLLBACK_NAME = "XARES_ROLLBACK";
private static final String _XARES_COMMIT_NAME = "XARES_COMMIT";
private static final String _XARES_RECOVER_NAME = "XARES_RECOVER";
private static final String _XARES_FORGET_NAME = "XARES_FORGET";
private static final String _SYNCH_BEFORE_NAME = "SYNCH_BEFORE";
private static final String _SYNCH_AFTER_NAME = "SYNCH_AFTER";
public static final ASFailureType NONE = new ASFailureType(_NONE);
public static final ASFailureType PRE_PREPARE = new ASFailureType(_PRE_PREPARE);
public static final ASFailureType XARES_START = new ASFailureType(_XARES_START);
public static final ASFailureType XARES_END = new ASFailureType(_XARES_END);
public static final ASFailureType XARES_PREPARE = new ASFailureType(_XARES_PREPARE);
public static final ASFailureType XARES_ROLLBACK = new ASFailureType(_XARES_ROLLBACK);
public static final ASFailureType XARES_COMMIT = new ASFailureType(_XARES_COMMIT);
public static final ASFailureType XARES_RECOVER = new ASFailureType(_XARES_RECOVER);
public static final ASFailureType XARES_FORGET = new ASFailureType(_XARES_FORGET);
public static final ASFailureType SYNCH_BEFORE = new ASFailureType(_SYNCH_BEFORE);
public static final ASFailureType SYNCH_AFTER = new ASFailureType(_SYNCH_AFTER);
private int type;
public ASFailureType(int type)
{
this.type = type;
}
public boolean isXA()
{
return name().startsWith("XARES");
}
public boolean isSynchronization()
{
return name().startsWith("SYNCH");
}
public boolean isPreCommit()
{
return equals(PRE_PREPARE);
}
/* enum like methods */
public String name()
{
switch (type)
{
case _NONE:
return _NONE_NAME;
case _PRE_PREPARE:
return _PRE_PREPARE_NAME;
case _XARES_START:
return _XARES_START_NAME;
case _XARES_END:
return _XARES_END_NAME;
case _XARES_PREPARE:
return _XARES_PREPARE_NAME;
case _XARES_ROLLBACK:
return _XARES_ROLLBACK_NAME;
case _XARES_COMMIT:
return _XARES_COMMIT_NAME;
case _XARES_RECOVER:
return _XARES_RECOVER_NAME;
case _XARES_FORGET:
return _XARES_FORGET_NAME;
case _SYNCH_BEFORE:
return _SYNCH_BEFORE_NAME;
case _SYNCH_AFTER:
return _SYNCH_AFTER_NAME;
default:
return "uninstantiated";
}
}
public int ordinal()
{
return type;
}
public static ASFailureType valueOf(String mode)
{
if (_NONE_NAME.equalsIgnoreCase(mode))
return NONE;
else if (_PRE_PREPARE_NAME.equalsIgnoreCase(mode))
return PRE_PREPARE;
else if (_XARES_START_NAME.equalsIgnoreCase(mode))
return XARES_START;
else if (_XARES_END_NAME.equalsIgnoreCase(mode))
return XARES_END;
else if (_XARES_PREPARE_NAME.equalsIgnoreCase(mode))
return XARES_PREPARE;
else if (_XARES_ROLLBACK_NAME.equalsIgnoreCase(mode))
return XARES_ROLLBACK;
else if (_XARES_COMMIT_NAME.equalsIgnoreCase(mode))
return XARES_COMMIT;
else if (_XARES_RECOVER_NAME.equalsIgnoreCase(mode))
return XARES_RECOVER;
else if (_XARES_FORGET_NAME.equalsIgnoreCase(mode))
return XARES_FORGET;
else if (_SYNCH_BEFORE_NAME.equalsIgnoreCase(mode))
return SYNCH_BEFORE;
else if (_SYNCH_AFTER_NAME.equalsIgnoreCase(mode))
return SYNCH_AFTER;
else
throw new IllegalArgumentException("There is no such value of ASFailureType like " + mode);
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + type;
return result;
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ASFailureType other = (ASFailureType) obj;
if (type != other.type)
return false;
return true;
}
@Override
public String toString()
{
return name();
}
/*
NONE
,PRE_PREPARE // do something before prepare is called
,XARES_START // failures specific to the XA protocol
,XARES_END
,XARES_PREPARE
,XARES_ROLLBACK
,XARES_COMMIT
,XARES_RECOVER
,XARES_FORGET
,SYNCH_BEFORE // do something before completion
,SYNCH_AFTER
;
public static ASFailureType toEnum(String type)
{
return ASFailureType.valueOf(type.toUpperCase());
}
public boolean isXA()
{
return name().startsWith("XARES");
}
public boolean isSynchronization()
{
return name().startsWith("SYNCH");
}
public boolean isPreCommit()
{
return equals(PRE_PREPARE);
}
*/
}