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 }