001    package com.thaiopensource.relaxng.impl;
002    
003    import com.thaiopensource.xml.util.Name;
004    
005    class OverlapDetector implements NameClassVisitor {
006      private final NameClass nc1;
007      private final NameClass nc2;
008      private boolean overlaps = false;
009    
010      private static final String IMPOSSIBLE = "\u0000";
011    
012      private OverlapDetector(NameClass nc1, NameClass nc2) {
013        this.nc1 = nc1;
014        this.nc2 = nc2;
015        nc1.accept(this);
016        nc2.accept(this);      
017      }
018    
019      private void probe(Name name) {
020        if (nc1.contains(name) && nc2.contains(name))
021          overlaps = true;
022      }
023    
024      public void visitChoice(NameClass nc1, NameClass nc2) {
025        nc1.accept(this);
026        nc2.accept(this);
027      }
028    
029      public void visitNsName(String ns) {
030        probe(new Name(ns, IMPOSSIBLE));
031      }
032    
033      public void visitNsNameExcept(String ns, NameClass ex) {
034        probe(new Name(ns, IMPOSSIBLE));
035        ex.accept(this);
036      }
037    
038      public void visitAnyName() {
039        probe(new Name(IMPOSSIBLE, IMPOSSIBLE));
040      }
041    
042      public void visitAnyNameExcept(NameClass ex) {
043        probe(new Name(IMPOSSIBLE, IMPOSSIBLE));
044        ex.accept(this);
045      }
046    
047      public void visitName(Name name) {
048        probe(name);
049      }
050    
051      public void visitNull() {
052      }
053    
054      public void visitError() {
055      }
056    
057      static boolean overlap(NameClass nc1, NameClass nc2) {
058        if (nc2 instanceof SimpleNameClass) {
059          SimpleNameClass snc = (SimpleNameClass)nc2;
060          return nc1.contains(snc.getName());
061        }
062        if (nc1 instanceof SimpleNameClass) {
063          SimpleNameClass snc = (SimpleNameClass)nc1;
064          return nc2.contains(snc.getName());
065        }
066        return new OverlapDetector(nc1, nc2).overlaps;
067      }
068    }