kevinoneill    2003/08/08 20:38:55

  Modified:    java/src/org/apache/xindice/xml/dom ElementImpl.java
  Log:
  PR: 22122
  expandSource() will now check to see if the src prefix has been used. If it 
has it will try src + timestamp until it finds one that isn't used.
  
  Revision  Changes    Path
  1.13      +41 -12    
xml-xindice/java/src/org/apache/xindice/xml/dom/ElementImpl.java
  
  Index: ElementImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/xml/dom/ElementImpl.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- ElementImpl.java  7 Aug 2003 20:13:25 -0000       1.12
  +++ ElementImpl.java  9 Aug 2003 03:38:55 -0000       1.13
  @@ -74,6 +74,8 @@
   import org.w3c.dom.Node;
   
   import java.io.IOException;
  +import java.util.HashSet;
  +import java.util.Random;
   
   /**
    * ElementImpl
  @@ -84,16 +86,14 @@
   
       private static final Log log = LogFactory.getLog(ElementImpl.class);
   
  -    private static final String SRC_NS = XMLNS_PREFIX + ":src";
  -    private static final String SRC_COL = "src:" + NodeSource.SOURCE_COL;
  -    private static final String SRC_KEY = "src:" + NodeSource.SOURCE_KEY;
  +    // private static final String SRC_NS = XMLNS_PREFIX + ":src";
  +    // private static final String SRC_COL = "src:" + NodeSource.SOURCE_COL;
  +    // private static final String SRC_KEY = "src:" + NodeSource.SOURCE_KEY;
   
       private NamedNodeMapImpl attributes = new NamedNodeMapImpl(this);
       private short symbolID = -1;
   
  -
  -    public ElementImpl() {
  -    }
  +    public ElementImpl() {}
   
       public ElementImpl(NodeImpl parentNode, byte[] data, int pos, int len) {
           super(parentNode, data, pos, len);
  @@ -115,7 +115,11 @@
       }
   
       protected boolean isNodeTypeValid(short type) {
  -        return type == Node.ELEMENT_NODE || type == Node.COMMENT_NODE || 
type == Node.TEXT_NODE || type == Node.CDATA_SECTION_NODE || type == 
Node.ENTITY_REFERENCE_NODE;
  +        return type == Node.ELEMENT_NODE
  +            || type == Node.COMMENT_NODE
  +            || type == Node.TEXT_NODE
  +            || type == Node.CDATA_SECTION_NODE
  +            || type == Node.ENTITY_REFERENCE_NODE;
       }
   
       protected void checkLoaded() {
  @@ -154,12 +158,37 @@
       public void expandSource() {
           NodeSource src = getSource();
           if (src != null) {
  -            setAttribute(SRC_NS, NodeSource.SOURCE_NS);
  -            setAttribute(SRC_COL, src.getCollection().getCanonicalName());
  +            final String prefix = sourcePrefix("src");
  +
  +            setAttribute(XMLNS_PREFIX + ":" + prefix, NodeSource.SOURCE_NS);
  +            setAttribute(prefix + ":" + NodeSource.SOURCE_COL, 
src.getCollection().getCanonicalName());
               Key k = src.getKey();
               if (k != null)
  -                setAttribute(SRC_KEY, k.toString());
  +                setAttribute(prefix + ":" + NodeSource.SOURCE_KEY, 
k.toString());
  +        }
  +    }
  +
  +    private String sourcePrefix(final String candidatePrefix) {
  +        Element element = this;
  +        HashSet prefixes = new HashSet();
  +        while (element != null) {
  +            NamedNodeMap nm = element.getAttributes();
  +            for (int i = 0; i < nm.getLength(); i++) {
  +                final Attr a = (Attr) nm.item(i);
  +                final String name = a.getNodeName();
  +                if (name.startsWith("xmlns:")) {
  +                    prefixes.add(name.substring(6));
  +                }
  +            }
  +            element = element.getParentNode().getNodeType() == ELEMENT_NODE 
? (Element) element.getParentNode() : null;
           }
  +
  +        String result = candidatePrefix;
  +        while (prefixes.contains(result)) {
  +            result = candidatePrefix + System.currentTimeMillis();
  +        }
  +
  +        return result;
       }
   
       protected void loadAttributes(SymbolTable st) throws IOException {
  
  
  

Reply via email to