com.sun.msv.verifier.regexp
Class CombinedChildContentExpCreator

java.lang.Object
  |
  +--com.sun.msv.verifier.regexp.CombinedChildContentExpCreator
All Implemented Interfaces:
ExpressionVisitorVoid

public class CombinedChildContentExpCreator
extends Object
implements ExpressionVisitorVoid

creates "combined child content expression" and gathers "elements of concern" and its "attribute-pruned" content model. Intuitively, "combined child content expression" is a set of content models of "elements of concern", which is appropriately combined to express dependency between elements. "Elements of concern" are ElementExps that are possibly applicable to the next element. These gathered element declarations are then tested against next XML element. "Attribute-pruned" content model is a content model after consuming AttributeTokens and removing unused AttributeExp nodes.

For example, when the current expression is

    <!-- javadoc escape -->
   <choice>
     <concur>
       <element> ..(A).. </element>
       <group>
         <element> ..(B).. </element>
         ...
       </group>
     </concur>
     <group>
       <element> ..(C).. </element>
       ....
     </group>
   </choice>
 
then the combined child expression is

   <choice>
     <concur>
       ..(A').. 
       ..(B').. 
     </concur>
     ..(C').. 
   </choice>
 
and elements of concern and its attribute-pruned content models are <element> ..(A).. </element> -> ..(A').. <element> ..(B).. </element> -> ..(B').. <element> ..(C).. </element> -> ..(C').. (A'),(B'), and (C') are attribute-pruned content models of (A),(B), and (C) respectively. Note that combined child pattern contains only <choice> and <concur> as its grue (of course, except ..(A').. , ..(B').. , and ..(C').. ). This function object also calculates "continuation", which is the residual expression after eating elements of concern. For example, say the expression is "(A|(B,C))?,D". When EoC is B, then the continuation will be C,D. When EoC is A, then the continuation will be D. When EoC is D, then the continuation will be epsilon. When there are multiple EoC, (say A and B), then the continuation will be meaningless (because it depends on which EoC will be accepted), and thus won't be used. However, the implementator must be aware that it is possible for a binary operator to have EoC on both branch and EoC is still unique. The following expression is an example. (A|B)*,C?,(A|B)* when A is EoC, SequenceExp of (A|B)* and C?,(A|B)* has EoC on both branch.

Author:
Kohsuke KAWAGUCHI

Inner Class Summary
static class CombinedChildContentExpCreator.ExpressionPair
           
 
Method Summary
 CombinedChildContentExpCreator.ExpressionPair continueGet(Expression combinedPattern, StartTagInfo info, boolean checkTagName)
           
 CombinedChildContentExpCreator.ExpressionPair get(Expression combinedPattern, StartTagInfo info)
          computes a combined child content pattern and (,if possible,) its continuation.
 CombinedChildContentExpCreator.ExpressionPair get(Expression combinedPattern, StartTagInfo info, boolean checkTagName)
          computes a combined child content pattern and its continuation, with error recovery.
 ElementExp[] getMatchedElements()
          obtains matched elements.
 boolean isComplex()
          checks if the result of 'get' method is not the union of all elements of concern.
 int numMatchedElements()
          gets the number of matched elements.
 void onAnyString()
           
 void onAttribute(AttributeExp exp)
           
 void onChoice(ChoiceExp exp)
           
 void onConcur(ConcurExp exp)
           
 void onElement(ElementExp exp)
           
 void onEpsilon()
           
 void onInterleave(InterleaveExp exp)
           
 void onKey(KeyExp exp)
           
 void onList(ListExp exp)
           
 void onMixed(MixedExp exp)
           
 void onNullSet()
           
 void onOneOrMore(OneOrMoreExp exp)
           
 void onOther(OtherExp exp)
           
 void onRef(ReferenceExp exp)
           
 void onSequence(SequenceExp exp)
           
 void onTypedString(TypedStringExp exp)
           
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Method Detail

get

public CombinedChildContentExpCreator.ExpressionPair get(Expression combinedPattern,
                                                         StartTagInfo info,
                                                         boolean checkTagName)
computes a combined child content pattern and its continuation, with error recovery. After calling this method, caller can call getElementsOfConcern to obtain each EoC. If both feedAttributes and checkTagName are false, then StartTagInfo is also unnecessary.
Parameters:
feedAttributes - if this flag is false, Attribute feeding & pruning are skipped and AttributeExps are fully remained in the resulting expression.
checkTagName - if this flag is false, tag name check is skipped.

continueGet

public final CombinedChildContentExpCreator.ExpressionPair continueGet(Expression combinedPattern,
                                                                       StartTagInfo info,
                                                                       boolean checkTagName)

get

public CombinedChildContentExpCreator.ExpressionPair get(Expression combinedPattern,
                                                         StartTagInfo info)
computes a combined child content pattern and (,if possible,) its continuation.

getMatchedElements

public final ElementExp[] getMatchedElements()
obtains matched elements. This method should be called after calling the get method. The result is in effect until the next invocation of get method.

The extra care should be taken not to hold reference to the result longer than necessary. The contents of the result is valid only until the next invocation. Because OwnerAndContent objects are reused.

Apparently this is a bad design, but this design gives us better performance.


numMatchedElements

public final int numMatchedElements()
gets the number of matched elements. This method should be called after calling get method. The result is in effect until next invocation of get method. Apparently this is a bad design, but this design gives us better performance.

onConcur

public void onConcur(ConcurExp exp)
Specified by:
onConcur in interface ExpressionVisitorVoid

onInterleave

public void onInterleave(InterleaveExp exp)
Specified by:
onInterleave in interface ExpressionVisitorVoid

isComplex

public final boolean isComplex()
checks if the result of 'get' method is not the union of all elements of concern. Within this class, combined child content expression is always the union of all elements of concern. However, some derived class does not guarantee this property.
Returns:
true if the combined child content expression is not the union of all elements of concern. false if otherwise.

onElement

public void onElement(ElementExp exp)
Specified by:
onElement in interface ExpressionVisitorVoid

onOneOrMore

public void onOneOrMore(OneOrMoreExp exp)
Specified by:
onOneOrMore in interface ExpressionVisitorVoid

onMixed

public void onMixed(MixedExp exp)
Specified by:
onMixed in interface ExpressionVisitorVoid

onAttribute

public void onAttribute(AttributeExp exp)
Specified by:
onAttribute in interface ExpressionVisitorVoid

onEpsilon

public void onEpsilon()
Specified by:
onEpsilon in interface ExpressionVisitorVoid

onNullSet

public void onNullSet()
Specified by:
onNullSet in interface ExpressionVisitorVoid

onAnyString

public void onAnyString()
Specified by:
onAnyString in interface ExpressionVisitorVoid

onTypedString

public void onTypedString(TypedStringExp exp)
Specified by:
onTypedString in interface ExpressionVisitorVoid

onList

public void onList(ListExp exp)
Specified by:
onList in interface ExpressionVisitorVoid

onKey

public void onKey(KeyExp exp)
Specified by:
onKey in interface ExpressionVisitorVoid

onRef

public void onRef(ReferenceExp exp)
Specified by:
onRef in interface ExpressionVisitorVoid

onOther

public void onOther(OtherExp exp)
Specified by:
onOther in interface ExpressionVisitorVoid

onChoice

public void onChoice(ChoiceExp exp)
Specified by:
onChoice in interface ExpressionVisitorVoid

onSequence

public void onSequence(SequenceExp exp)
Specified by:
onSequence in interface ExpressionVisitorVoid