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 }