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    }