/*
* BranchOperation.java
* @Author Oleg Gorobets
* Created: Jul 28, 2007
* CVS-ID: $Id:
*************************************************************************/
package org.swfparser.operation;
import org.apache.log4j.Logger;
import org.swfparser.AndOrOptimizer;
import org.swfparser.BooleanOperation;
import org.swfparser.Operation;
import org.swfparser.Priority;
public class BranchOperation extends OrOperation {
private static Logger logger = Logger.getLogger(BranchOperation.class);
private Operation conditionOperation;
private Operation stackOperation;
public BranchOperation(Operation conditionOperation, Operation stackOperation) {
super(conditionOperation,stackOperation);
this.conditionOperation = conditionOperation;
this.stackOperation = stackOperation;
}
public static Operation createInstance(Operation op1, Operation op2) {
BranchOperation op = new BranchOperation(op1,op2);
logger.debug("Creating BRANCH-OR with "+op1+" and "+op2);
AndOrOptimizer optimizer = new AndOrOptimizer(op);
if (optimizer.getOptimizedOperation()!=null && !op.equals(optimizer.getOptimizedOperation())) {
logger.debug("Optimized operation = "+optimizer.getOptimizedOperation());
return optimizer.getOptimizedOperation() ;
} else {
return op;
}
}
public int getArgsNumber() {
return 2;
}
/* (non-Javadoc)
* INVERT *ONLY* stack value
*/
@Override
public Operation getInvertedOperation() {
return new AndOperation(conditionOperation,new NotOperation(stackOperation));
}
// public String getInvertedStringValue(int level) {
// String conditionValue = conditionOperation.getStringValue(level);
// if (conditionOperation.getPriority() > Priority.AND) {
// conditionValue = "("+conditionValue+")";
// }
//
// String stackValue = (stackOperation instanceof BooleanOperation)
// ?
// ((BooleanOperation)stackOperation).getInvertedOperation().getStringValue(level)
// :
// "!"+conditionOperation.getStringValue(level);
// if (stackOperation.getPriority() > Priority.AND) {
// stackValue = "("+stackValue+")";
// }
//
// return conditionValue + "&&" + stackValue;
// }
// public String getStringValue(int level) {
// String conditionValue = conditionOperation.getStringValue(level);
// if (conditionOperationPriority > Priority.OR) {
// conditionValue = "("+conditionValue+")";
// }
//
// String stackValue = stackOperation.getStringValue(level);
// if (stackOperationPriority > Priority.OR) {
// stackValue = "("+stackValue+")";
// }
//
// return conditionValue + " || " + stackValue;
// }
}