Hi Tim, your Lexus patch just made it in so I'm finally able to apply this patch. Unfortunately, somewhere in the mail chain the file was wrapped and corrupted. I tried to reconcile it but with no success. Can you make this available from the web or just send it again gzipped? I'd really like to get this in before we finally release 1.0rc1.

On Thursday, January 3, 2002, at 02:18 PM, Timothy M. Dean wrote:

Index: XUpdateQueryServiceImpl.java
===================================================================
RCS file:
/home/cvspublic/xml-xindice/java/src/org/apache/xindice/client/xmldb/ser
vices/XUpdateQueryServiceImpl.java,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 XUpdateQueryServiceImpl.java
--- XUpdateQueryServiceImpl.java        6 Dec 2001 19:33:54 -0000
1.1.1.1
+++ XUpdateQueryServiceImpl.java        3 Jan 2002 20:07:58 -0000
@@ -74,11 +74,13 @@
 import org.xmldb.api.base.*;
 import org.xmldb.api.modules.*;

+import java.util.*;
+
 public class XUpdateQueryServiceImpl extends CommonConfigurable
    implements org.xmldb.api.modules.XUpdateQueryService
 {
-   private static final NamedVal[] EmptyNamedVals = new NamedVal[0];
    protected org.xmldb.api.base.Collection collection = null;
+   private NamespaceMap nsMap = new NamespaceMap();

    public XUpdateQueryServiceImpl() {
    }
@@ -96,12 +98,71 @@
       this.collection = col;
    }

+
+    public void setDefaultNamespace(String uri) throws XMLDBException {
+       if ( uri != null )
+          nsMap.setDefaultNamespace(uri);
+       else
+          nsMap.removeDefaultNamespace();
+    }
+
+    public void removeDefaultNamespace() {
+       nsMap.removeDefaultNamespace();
+    }
+
+    public void setNamespace(String prefix, String uri) throws
XMLDBException {
+       if ( ( prefix == null ) || prefix.equals("") ) {
+          setDefaultNamespace(uri);
+       }
+       else {
+          if ( uri != null ) {
+             nsMap.setNamespace(prefix, uri);
+          }
+       }
+    }
+
+    public void removeNamespace(String prefix) {
+       if ( ( prefix == null ) || prefix.equals("") ) {
+          removeDefaultNamespace();
+       }
+
+       nsMap.removeNamespace(prefix);
+    }
+
+    public String getDefaultNamespace() {
+       return nsMap.getDefaultNamespaceURI();
+    }
+
+    public String getNamespace(String prefix) {
+       if ( ( prefix == null ) || prefix.equals("") ) {
+          return nsMap.getDefaultNamespaceURI();
+       }
+
+       return nsMap.getNamespaceURI(prefix);
+    }
+
+    public void clearNamespaces() {
+       nsMap.clear();
+    }
+
+    private NamedVal[] getNamespaces() {
+       NamedVal[] nv = new NamedVal[nsMap.size()];
+       Iterator iter = nsMap.keySet().iterator();
+       int i = 0;
+       while ( iter.hasNext() ) {
+          String prefix = (String)iter.next();
+          String uri = nsMap.getNamespaceURI(prefix);
+          nv[i++] = new NamedVal(prefix, uri);
+       }
+       return nv;
+    }
+
    public XMLResource updateResult(String commands) throws
XMLDBException {
       // Get the Xindice collection object from the XML:DB collection
wrapper.
       Collection col = ((CollectionImpl) collection).getServerObject();

       try {
-         EncodedBuffer buffer = col.queryCollection("XUpdate",
commands, EmptyNamedVals, -1);
+         EncodedBuffer buffer = col.queryCollection("XUpdate",
+ commands, getNamespaces(), -1);
          return new XMLResourceImpl("", collection, new
String(buffer.buf));
       }
       catch (Exception e) {
@@ -129,7 +190,7 @@
       Collection col = ((CollectionImpl) collection).getServerObject();

       try {
-         EncodedBuffer buffer = col.queryDocument("XUpdate", commands,
EmptyNamedVals, id, -1);
+         EncodedBuffer buffer = col.queryDocument("XUpdate", commands,
+ getNamespaces(), id, -1);
          return new XMLResourceImpl("", collection, new
String(buffer.buf));
       }
       catch (Exception e) {
Index: NamespaceMap.java
===================================================================
RCS file:
/home/cvspublic/xml-xindice/java/src/org/apache/xindice/xml/NamespaceMap
.java,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 NamespaceMap.java
--- NamespaceMap.java   6 Dec 2001 19:33:58 -0000       1.1.1.1
+++ NamespaceMap.java   3 Jan 2002 20:09:19 -0000
@@ -72,7 +72,7 @@

 public final class NamespaceMap extends HashMap {
    private Element elem = null;
-
+
    public Node getContextNode() {
       if ( elem == null ) {
          Document d = new DocumentImpl();
@@ -92,8 +92,9 @@

    public void clearNamespaces() {
       clear();
+      elem = null;
    }
-
+
    public String getDefaultNamespaceURI() {
       return (String)get("");
    }
@@ -104,17 +105,32 @@

    public void setDefaultNamespace(String uri) {
       put("", uri);
+      elem = null;
    }

    public void setNamespace(String prefix, String uri) {
       put(prefix, uri);
+      elem = null;
    }

    public void removeDefaultNamespace() {
       remove("");
+      elem = null;
    }

    public void removeNamespace(String prefix) {
       remove(prefix);
+      elem = null;
+   }
+
+   public void includeNamespaces(Map nsMap, boolean override) {
+      Iterator newEntries = nsMap.entrySet().iterator();
+      while (newEntries.hasNext()) {
+         Map.Entry entry = (Map.Entry) newEntries.next();
+         if (!override && super.containsKey(entry.getKey()))
+           continue;
+         super.put(entry.getKey(), entry.getValue());
+      }
+      elem = null;
    }
 }
Index: XUpdateImpl.java
===================================================================
RCS file:
/home/cvspublic/xml-xindice/java/src/org/apache/xindice/core/xupdate/XUp
dateImpl.java,v
retrieving revision 1.1
diff -u -r1.1 XUpdateImpl.java
--- XUpdateImpl.java    6 Dec 2001 21:00:15 -0000       1.1
+++ XUpdateImpl.java    3 Jan 2002 20:12:17 -0000
@@ -64,12 +64,15 @@
 import org.apache.xindice.xml.dom.*;
 import org.apache.xindice.xml.*;

-import org.infozone.lexus.commands.*;
-import org.infozone.lexus.*;
+import org.xmldb.xupdate.lexus.commands.*;
+import org.xmldb.xupdate.lexus.*;
+import org.infozone.tools.xml.queries.*;

 import java.util.*;

 import org.w3c.dom.*;
+import org.xmldb.xupdate.lexus.*;
+import org.xml.sax.*;

 /**
  * Provides Collection and document based XUpdate capabilities. @@
-79,8 +82,43 @@
  */
 public class XUpdateImpl extends XUpdateQueryImpl {
    protected int nodesModified = 0;
-
-   /**
+   protected NamespaceMap nsMap;
+
+    /**
+     * If set to true, then namespaces set explicitly via an API call
will take precendence.
+     * If set to false, then namespaces set implicitly within query
string will take precedence.
+     */
+    private static final boolean API_NS_PRECEDENCE = true;
+
+    /**
+     * Set the namespace map to be used when resolving queries
+     */
+    public void setNamespaceMap(NamespaceMap nsMap) {
+       if (nsMap == null)
+          return;
+
+       if (this.nsMap == null) {
+          this.nsMap = nsMap;
+       }
+       else {
+          this.nsMap.includeNamespaces(nsMap, API_NS_PRECEDENCE);
+       }
+    }
+
+
+    /**
+     * Sets the query string to be used when executing update
+     */
+    public void setQString(String query) throws SAXException {
+       super.setQString(query);
+       if (nsMap == null) {
+          nsMap = new NamespaceMap();
+       }
+       nsMap.includeNamespaces(_namespaces, !API_NS_PRECEDENCE);
+    }
+
+
+    /**
     * Execute the XUpdate commands against a document.
     */
    public void execute(Node contextNode) throws Exception {
@@ -89,6 +127,7 @@
       Enumeration attributes = _query[1].elements();
       Enumeration characters = _query[2].elements();
       Node origNode = contextNode;
+      CommandObject.getXPath().setNamespace(nsMap.getContextNode());

       while (commands.hasMoreElements()) {
          int id = ((Integer) commands.nextElement()).intValue();
@@ -143,7 +182,7 @@

             // If we found an XPath selector we need to execute the
commands.
             if (selector != null) {
-               NodeSet ns = col.queryCollection("XPath", selector,
null);
+               NodeSet ns = col.queryCollection("XPath", selector,
+ nsMap);
                Document lastDoc = null;
                while (ns != null && ns.hasMoreNodes()) {
                   DBNode node = (DBNode)ns.getNextNode();
Index: XUpdateQueryResolver.java
===================================================================
RCS file:
/home/cvspublic/xml-xindice/java/src/org/apache/xindice/core/xupdate/XUp
dateQueryResolver.java,v
retrieving revision 1.1
diff -u -r1.1 XUpdateQueryResolver.java
--- XUpdateQueryResolver.java   6 Dec 2001 21:00:15 -0000       1.1
+++ XUpdateQueryResolver.java   3 Jan 2002 20:14:07 -0000
@@ -127,6 +127,7 @@
          try {
             xu = new XUpdateImpl();
             xu.setQString(query);
+            xu.setNamespaceMap(nsMap);
          }
          catch ( Exception e ) {
             throw new CompilationException("Error Compiling XUpdate
Query");



Kimbro Staken
XML Database Software, Consulting and Writing
http://www.xmldatabases.org/



Reply via email to