Index: shared/ldap/trunk/apache-provider/src/java/org/apache/ldap/common/berlib/asn1/decoder/search/AndRule.java =================================================================== --- shared/ldap/trunk/apache-provider/src/java/org/apache/ldap/common/berlib/asn1/decoder/search/AndRule.java (revision 158952) +++ shared/ldap/trunk/apache-provider/src/java/org/apache/ldap/common/berlib/asn1/decoder/search/AndRule.java (working copy) @@ -24,6 +24,7 @@ import org.apache.ldap.common.filter.ExprNode; import java.nio.ByteBuffer; +import java.util.Stack; /** @@ -88,6 +89,8 @@ return ; } + getDigester().push( new BranchNode( BranchNode.AND ) ); + super.tag( id, isPrimitive, typeClass ); } @@ -125,15 +128,29 @@ { super.finish(); - BranchNode node; - node = new BranchNode( BranchNode.AND ); - - while( getDigester().peek() instanceof ExprNode ) + Stack stack = new Stack(); + + Object peek; + while ((peek = getDigester().peek()) instanceof ExprNode) { - node.addNode( ( ExprNode ) getDigester().pop() ); + ExprNode node = (ExprNode) peek; + + if (node instanceof BranchNode) + { + BranchNode branch = (BranchNode) node; + if (branch.getChildren().isEmpty()) + { + while (!stack.isEmpty()) + { + branch.addNode((ExprNode) stack.pop()); + } + break; + } + } + + stack.push(getDigester().pop()); } - getDigester().push( node ); } this.isEnabled = true; Index: shared/ldap/trunk/apache-provider/src/java/org/apache/ldap/common/berlib/asn1/decoder/search/OrRule.java =================================================================== --- shared/ldap/trunk/apache-provider/src/java/org/apache/ldap/common/berlib/asn1/decoder/search/OrRule.java (revision 158952) +++ shared/ldap/trunk/apache-provider/src/java/org/apache/ldap/common/berlib/asn1/decoder/search/OrRule.java (working copy) @@ -24,6 +24,7 @@ import org.apache.ldap.common.filter.ExprNode; import java.nio.ByteBuffer; +import java.util.Stack; /** @@ -90,6 +91,8 @@ return ; } + getDigester().push( new BranchNode( BranchNode.OR ) ); + super.tag( id, isPrimitive, typeClass ); } @@ -127,15 +130,28 @@ { super.finish(); - BranchNode node; - node = new BranchNode( BranchNode.OR ); - - while( getDigester().peek() instanceof ExprNode ) + Stack stack = new Stack(); + + Object peek; + while ((peek = getDigester().peek()) instanceof ExprNode) { - node.addNode( ( ExprNode ) getDigester().pop() ); + ExprNode node = (ExprNode) peek; + + if (node instanceof BranchNode) + { + BranchNode branch = (BranchNode) node; + if (branch.getChildren().isEmpty()) + { + while (!stack.isEmpty()) + { + branch.addNode((ExprNode) stack.pop()); + } + break; + } + } + + stack.push(getDigester().pop()); } - - getDigester().push( node ); } this.isEnabled = true;