1 package org.objectweb.celtix.helpers; 2 3 import java.util.ArrayList ; 4 import java.util.List ; 5 import java.util.ListIterator ; 6 7 public class NSStack { 8 9 private static final String NS_PREFIX_PREFIX = "ns"; 10 11 private final List <List <NSDecl>> stack = new ArrayList <List <NSDecl>>(); 12 private List <NSDecl> top; 13 private int size; 14 private int nsPrefixCount = 1; 15 16 public synchronized void push() { 17 top = new ArrayList <NSDecl>(); 18 stack.add(top); 19 size++; 20 } 21 22 27 public synchronized void pop() { 28 stack.remove(--size); 29 top = null; 30 if (size != 0) { 31 top = stack.get(size - 1); 32 } 33 } 34 35 42 public synchronized void add(String prefix, String uri) { 43 top.add(new NSDecl(prefix, uri)); 44 } 45 46 57 public synchronized String add(String uri) { 58 String uniquePrefix = getPrefix(uri); 59 60 if (uniquePrefix == null) { 61 do { 62 uniquePrefix = NS_PREFIX_PREFIX + nsPrefixCount++; 63 } while (getURI(uniquePrefix) != null); 64 add(uniquePrefix, uri); 65 } 66 return uniquePrefix; 67 } 68 69 76 public String getPrefix(String uri) { 77 for (int i = size - 1; i >= 0; i--) { 78 List <NSDecl> scope = stack.get(i); 79 ListIterator <NSDecl> lsIterator = scope.listIterator(); 80 81 while (lsIterator.hasNext()) { 82 NSDecl nsd = lsIterator.next(); 83 84 if (nsd.getUri().equals(uri)) { 85 return nsd.getPrefix(); 86 } 87 } 88 } 89 return null; 90 } 91 92 99 public String getURI(String prefix) { 100 for (int i = size - 1; i >= 0; i--) { 101 List <NSDecl> scope = stack.get(i); 102 ListIterator <NSDecl> lsIterator = scope.listIterator(); 103 104 while (lsIterator.hasNext()) { 105 NSDecl nsd = lsIterator.next(); 106 107 if (nsd.getPrefix().equals(prefix)) { 108 return nsd.getUri(); 109 } 110 } 111 } 112 return null; 113 } 114 115 } 116 117 | Popular Tags |