/*
* NotOperation.java
* @Author Oleg Gorobets
* Created: 24.07.2007
* CVS-ID: $Id:
*************************************************************************/
package org.swfparser.operation;
import java.util.Stack;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.log4j.Logger;
import org.swfparser.BooleanOperation;
import org.swfparser.Operation;
import org.swfparser.Priority;
public class NotOperation extends UnaryOperation implements BooleanOperation {
private static Logger logger = Logger.getLogger(NotOperation.class);
public NotOperation(Operation op) {
super(op);
}
// public static Operation createNotOperation(Operation op) {
// if (op instanceof NotOperation) {
// return ((NotOperation)op).getOp();
// } else {
// return new NotOperation(op);
// }
// }
public NotOperation(Stack<Operation> stack) {
super(stack);
logger.debug("#Not "+op);
}
// public static Operation createNotOperation(Stack<Operation> stack) {
// Operation op = stack.pop();
// if (op instanceof NotOperation) {
// return ((NotOperation)op).getOp();
// } else {
// return new NotOperation(op);
// }
// }
public int getArgsNumber() {
return 1;
}
public String getStringValue(int level) {
if (op instanceof BooleanOperation) {
// Don't make `!b && !c)` out of `!(b || c)`.
// Don't use And/OrOperation for getInvertedOperation().
if (op instanceof AndOperation || op instanceof OrOperation) {
return getString(level);
} else {
return ((BooleanOperation)op).getInvertedOperation().getStringValue(level);
}
} else {
return getString(level);
}
// return (op instanceof NotOperation) ?
// ((NotOperation)op).getInvertedStringValue(level):
// "!"+op.getStringValue(level);
}
private String getString(int level) {
if (op.getPriority() > getPriority()) {
return "!("+op.getStringValue(level)+")";
} else {
return "!"+op.getStringValue(level);
}
}
// public String getInvertedStringValue(int level) {
//
// if (op instanceof BooleanOperation) {
// return ((BooleanOperation)op).getStringValue(level);
// } else {
// return op.getStringValue(level);
// }
//
// }
public Operation getInvertedOperation() {
return op;
}
@Override
public String toString() {
return "NotOperation("+op+")";
}
@Override
public int getPriority() {
return isDoubleNot()
// return priority of underlying op
? getRealOperation().getPriority()
: Priority.UNARY;
}
@Override
public boolean equals(Object obj) {
logger.debug("Testing EQ: Not "+op+" vs. "+obj);
if (obj == this) {
return true;
}
if ((obj instanceof NotOperation)) {
NotOperation otherOp = (NotOperation) obj;
// logger.debug("Eq "+this.op+" and "+op.op);
return new EqualsBuilder()
.append(this.op, otherOp.op)
.isEquals();
} else {
Operation myOp = op;
int count = 1;
while (myOp instanceof NotOperation) {
myOp = ((NotOperation)myOp).getOp();
count++;
}
logger.debug("Real operation behind Not(): "+myOp+". Not count = "+count);
return (obj.equals(myOp) && (count%2==0));
}
}
protected boolean isDoubleNot() {
Operation myOp = op;
int count = 1;
while (myOp instanceof NotOperation) {
myOp = ((NotOperation)myOp).getOp();
count++;
}
return count%2==0;
}
protected Operation getRealOperation() {
Operation myOp = op;
int count = 1;
while (myOp instanceof NotOperation) {
myOp = ((NotOperation)myOp).getOp();
count++;
}
return myOp;
}
// protected boolean eq {
// Operation myOp = op;
// int count = 1;
// while (myOp instanceof NotOperation) {
// myOp = ((NotOperation)myOp).getOp();
// count++;
// }
// if (count%2 == 0) {
//
// } else {
//
// }
// }
}