package org.marketcetera.quickfix.cficode;
public class OptionCFICode extends CFICode {
private static final int TYPE_POSITION = 1;
private static final int EXERCISE_POSITION = 2;
private static final int UNDERLYING_POSITION = 3;
private static final int DELIVERY_POSITION = 4;
private static final int STANDARD_POSITION = 5;
public static final char EXERCISE_AMERICAN = 'A';
public static final char EXERCISE_EUROPEAN = 'E';
public static final char TYPE_PUT = 'P';
public static final char TYPE_CALL = 'C';
public static final char UNDERLYING_STOCK = 'S';
public static final char UNDERLYING_INDEX = 'I';
public static final char UNDERLYING_DEBT = 'D';
public static final char UNDERLYING_CURRENCY = 'C';
public static final char UNDERLYING_OPTION = 'O';
public static final char UNDERLYING_FUTURE = 'F';
public static final char UNDERLYING_COMMODITY = 'T';
public static final char UNDERLYING_SWAP = 'W';
public static final char UNDERLYING_BASKET = 'B';
public static final char UNDERLYING_OTHER = 'M';
public static final char DELIVERY_CASH = 'C';
public static final char DELIVERY_PHYSICAL = 'P';
public static final char STANDARD_STANDARD= 'S';
public static final char STANDARD_NON_STANDARD= 'N';
/**
*
* @param sequence
* @throws IllegalArgumentException if sequence does not begin with O (capital o)
*/
public OptionCFICode(CharSequence sequence){
super(sequence);
if (CATEGORY_OPTION != sequence.charAt(0)){
throw new IllegalArgumentException("Char 0"); //$NON-NLS-1$
}
setType(sequence.charAt(TYPE_POSITION));
setExercise(sequence.charAt(EXERCISE_POSITION));
setUnderlying(sequence.charAt(UNDERLYING_POSITION));
setDelivery(sequence.charAt(DELIVERY_POSITION));
setStandard(sequence.charAt(STANDARD_POSITION));
}
public char getExercise() {
return charAt(EXERCISE_POSITION);
}
public void setExercise(char exercise) {
if (isValidExercise(exercise)){
setChar(EXERCISE_POSITION, exercise);
} else {
throw new IllegalArgumentException();
}
}
public boolean isValidExercise(char exercise){
switch(exercise){
case EXERCISE_AMERICAN:
case EXERCISE_EUROPEAN:
case UNKNOWN_UNUSED:
return true;
default:
return false;
}
}
public char getType() {
return charAt(TYPE_POSITION);
}
public void setType(char type) {
if (isValidType(type)){
setChar(TYPE_POSITION, type);
} else {
throw new IllegalArgumentException();
}
}
public boolean isValidType(char type) {
switch(type){
case TYPE_CALL:
case TYPE_PUT:
case UNKNOWN_UNUSED:
return true;
default:
return false;
}
}
public char getUnderlying() {
return charAt(UNDERLYING_POSITION);
}
public void setUnderlying(char underlying) {
if (isValidUnderlying(underlying)){
setChar(UNDERLYING_POSITION, underlying);
} else {
throw new IllegalArgumentException();
}
}
public boolean isValidUnderlying(char underlying) {
switch(underlying){
case UNDERLYING_STOCK:
case UNDERLYING_INDEX:
case UNDERLYING_DEBT:
case UNDERLYING_CURRENCY:
case UNDERLYING_OPTION:
case UNDERLYING_FUTURE:
case UNDERLYING_COMMODITY:
case UNDERLYING_SWAP:
case UNDERLYING_BASKET:
case UNDERLYING_OTHER:
case UNKNOWN_UNUSED:
return true;
default:
return false;
}
}
public char getDelivery() {
return charAt(DELIVERY_POSITION);
}
public void setDelivery(char delivery) {
if (isValidDelivery(delivery)){
setChar(DELIVERY_POSITION, delivery);
} else {
throw new IllegalArgumentException();
}
}
public boolean isValidDelivery(char delivery) {
switch(delivery){
case DELIVERY_CASH:
case DELIVERY_PHYSICAL:
case UNKNOWN_UNUSED:
return true;
default:
return false;
}
}
public char getStandard() {
return charAt(STANDARD_POSITION);
}
public void setStandard(char standard) {
if (isValidStandard(standard)){
setChar(STANDARD_POSITION, standard);
} else {
throw new IllegalArgumentException();
}
}
public boolean isValidStandard(char standard) {
switch(standard){
case STANDARD_STANDARD:
case STANDARD_NON_STANDARD:
case UNKNOWN_UNUSED:
return true;
default:
return false;
}
}
@Override
public String toString(){
return ""+CATEGORY_OPTION+getType()+getExercise()+getUnderlying()+getDelivery()+getStandard(); //$NON-NLS-1$
}
@Override
public boolean isValid() {
// in this particular case, it is never possible to get this
// object into an inconsistent state,
// so we just return true
return true;
}
public static boolean isOptionCFICode(CharSequence seq){
return ((seq.length()==6)&& seq.charAt(0)==CFICode.CATEGORY_OPTION);
}
}