package org.kohsuke.bali.automaton.builder;
import java.util.HashSet;
import java.util.Set;
import com.sun.msv.grammar.AnyNameClass;
import com.sun.msv.grammar.ChoiceNameClass;
import com.sun.msv.grammar.DifferenceNameClass;
import com.sun.msv.grammar.NameClassVisitor;
import com.sun.msv.grammar.NamespaceNameClass;
import com.sun.msv.grammar.NotNameClass;
import com.sun.msv.grammar.SimpleNameClass;
import com.sun.msv.util.StringPair;
/**
* Accumulates probe points from name classes.
*
* <p>
* A probe point is a pair of (namespaceUri,localName) that is
* recognized by the grammar.
*
* <p>
* To collect probe points from a name class <code>nc</code>,
* do <code>nc.visit(aProbePointCollectorObject)</code>.
*
* @author Kohsuke Kawaguchi (kk@kohsuke.org)
*/
public class ProbePointsCollector implements NameClassVisitor {
/** all collected probe points. */
public final Set probePoints = new HashSet();
public Object onChoice(ChoiceNameClass nc) {
nc.nc1.visit(this);
nc.nc2.visit(this);
return null;
}
public Object onAnyName(AnyNameClass nc) {
probePoints.add( new StringPair( NameClassEncoder.IMPOSSIBLE, NameClassEncoder.IMPOSSIBLE ) );
return null;
}
public Object onSimple(SimpleNameClass nc) {
probePoints.add( new StringPair( nc.namespaceURI, nc.localName ) );
return null;
}
public Object onNsName(NamespaceNameClass nc) {
probePoints.add( new StringPair( nc.namespaceURI, NameClassEncoder.IMPOSSIBLE ) );
return null;
}
public Object onNot(NotNameClass nc) {
probePoints.add( new StringPair( NameClassEncoder.IMPOSSIBLE, NameClassEncoder.IMPOSSIBLE ) );
return nc.child.visit(this);
}
public Object onDifference(DifferenceNameClass nc) {
nc.nc1.visit(this);
nc.nc2.visit(this);
return null;
}
}