001 package com.thaiopensource.relaxng.impl; 002 003 import java.util.Vector; 004 005 class DuplicateAttributeDetector { 006 private final Vector nameClasses = new Vector(); 007 private Alternative alternatives = null; 008 009 private static class Alternative { 010 private final int startIndex; 011 private int endIndex; 012 private final Alternative parent; 013 014 private Alternative(int startIndex, Alternative parent) { 015 this.startIndex = startIndex; 016 this.endIndex = startIndex; 017 this.parent = parent; 018 } 019 } 020 021 boolean addAttribute(NameClass nc) { 022 int lim = nameClasses.size(); 023 for (Alternative a = alternatives; a != null; a = a.parent) { 024 for (int i = a.endIndex; i < lim; i++) 025 if (OverlapDetector.overlap(nc, (NameClass)nameClasses.elementAt(i))) 026 return false; 027 lim = a.startIndex; 028 } 029 for (int i = 0; i < lim; i++) 030 if (OverlapDetector.overlap(nc, (NameClass)nameClasses.elementAt(i))) 031 return false; 032 nameClasses.addElement(nc); 033 return true; 034 } 035 036 void startChoice() { 037 alternatives = new Alternative(nameClasses.size(), alternatives); 038 } 039 040 void alternative() { 041 alternatives.endIndex = nameClasses.size(); 042 } 043 044 void endChoice() { 045 alternatives = alternatives.parent; 046 } 047 048 }