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 }