You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2006/12/07 09:17:12 UTC

svn commit: r483369 - in /jackrabbit/trunk: jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/search/ jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/search/ jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/xml/

Author: mreutegg
Date: Thu Dec  7 00:17:09 2006
New Revision: 483369

URL: http://svn.apache.org/viewvc?view=rev&rev=483369
Log:
Use namespace prefixes supplied with request to execute the query.

Modified:
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/search/SearchResourceImpl.java
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/search/SearchInfo.java
    jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/xml/DomUtil.java

Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/search/SearchResourceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/search/SearchResourceImpl.java?view=diff&rev=483369&r1=483368&r2=483369
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/search/SearchResourceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/search/SearchResourceImpl.java Thu Dec  7 00:17:09 2006
@@ -36,12 +36,15 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.Value;
+import javax.jcr.NamespaceRegistry;
 import javax.jcr.query.InvalidQueryException;
 import javax.jcr.query.Query;
 import javax.jcr.query.QueryManager;
 import javax.jcr.query.QueryResult;
 import javax.jcr.query.Row;
 import javax.jcr.query.RowIterator;
+import java.util.Map;
+import java.util.Iterator;
 
 /**
  * <code>SearchResourceImpl</code>...
@@ -115,7 +118,9 @@
     private Query getQuery(SearchInfo sInfo)
             throws InvalidQueryException, RepositoryException, DavException {
 
-        Node rootNode = getRepositorySession().getRootNode();
+        Session session = getRepositorySession();
+        NamespaceRegistry nsReg = session.getWorkspace().getNamespaceRegistry();
+        Node rootNode = session.getRootNode();
         QueryManager qMgr = getRepositorySession().getWorkspace().getQueryManager();
 
         // test if query is defined by requested repository node
@@ -132,7 +137,26 @@
 
         Query q;
         if (sInfo != null) {
-            q = qMgr.createQuery(sInfo.getQuery(), sInfo.getLanguageName());
+            // apply namespace mappings to session
+            Map namespaces = sInfo.getNamespaces();
+            try {
+                for (Iterator it = namespaces.keySet().iterator(); it.hasNext(); ) {
+                    String prefix = (String) it.next();
+                    String uri = (String) namespaces.get(prefix);
+                    session.setNamespacePrefix(prefix, uri);
+                }
+                q = qMgr.createQuery(sInfo.getQuery(), sInfo.getLanguageName());
+            } finally {
+                // reset namespace mappings
+                for (Iterator it = namespaces.values().iterator(); it.hasNext(); ) {
+                    String uri = (String) it.next();
+                    try {
+                        session.setNamespacePrefix(nsReg.getPrefix(uri), uri);
+                    } catch (RepositoryException e) {
+                        log.warn("Unable to reset mapping of namespace: " + uri);
+                    }
+                }
+            }
         } else {
             throw new DavException(DavServletResponse.SC_BAD_REQUEST, locator.getResourcePath() + " is not a nt:query node -> searchRequest body required.");
         }

Modified: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/search/SearchInfo.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/search/SearchInfo.java?view=diff&rev=483369&r1=483368&r2=483369
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/search/SearchInfo.java (original)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/search/SearchInfo.java Thu Dec  7 00:17:09 2006
@@ -18,6 +18,7 @@
 
 import org.apache.jackrabbit.webdav.DavException;
 import org.apache.jackrabbit.webdav.DavServletResponse;
+import org.apache.jackrabbit.webdav.DavConstants;
 import org.apache.jackrabbit.webdav.xml.DomUtil;
 import org.apache.jackrabbit.webdav.xml.Namespace;
 import org.apache.jackrabbit.webdav.xml.XmlSerializable;
@@ -25,6 +26,14 @@
 import org.slf4j.LoggerFactory;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
+import org.w3c.dom.Attr;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.HashSet;
 
 /**
  * <code>SearchInfo</code> parses the 'searchrequest' element of a SEARCH
@@ -53,9 +62,23 @@
 
     private static Logger log = LoggerFactory.getLogger(SearchInfo.class);
 
+    /**
+     * Set of namespace uri String which are ignored in the search request.
+     */
+    private static final Set IGNORED_NAMESPACES;
+
+    static {
+        Set s = new HashSet();
+        s.add(Namespace.XMLNS_NAMESPACE.getURI());
+        s.add(Namespace.XML_NAMESPACE.getURI());
+        s.add(DavConstants.NAMESPACE.getURI());
+        IGNORED_NAMESPACES = Collections.unmodifiableSet(s);
+    }
+
     private final String language;
     private final Namespace languageNamespace;
     private final String query;
+    private final Map namespaces;
 
     /**
      * Create a new <code>SearchInfo</code> instance.
@@ -63,11 +86,24 @@
      * @param language
      * @param languageNamespace
      * @param query
+     * @param namespaces the re-mapped namespaces. Key=prefix, value=uri.
      */
-    public SearchInfo(String language, Namespace languageNamespace, String query) {
+    public SearchInfo(String language, Namespace languageNamespace, String query, Map namespaces) {
         this.language = language;
         this.languageNamespace = languageNamespace;
         this.query = query;
+        this.namespaces = Collections.unmodifiableMap(new HashMap(namespaces));
+    }
+
+    /**
+     * Create a new <code>SearchInfo</code> instance.
+     *
+     * @param language
+     * @param languageNamespace
+     * @param query
+     */
+    public SearchInfo(String language, Namespace languageNamespace, String query) {
+        this(language,  languageNamespace, query, Collections.EMPTY_MAP);
     }
 
     /**
@@ -98,6 +134,15 @@
     }
 
     /**
+     * Returns the namespaces that have been re-mapped by the user.
+     *
+     * @return map of namespace to prefix mappings. Key=prefix, value=uri.
+     */
+    public Map getNamespaces() {
+        return namespaces;
+    }
+
+    /**
      * Return the xml representation of this <code>SearchInfo</code> instance.
      *
      * @return xml representation
@@ -105,6 +150,11 @@
      */
     public Element toXml(Document document) {
         Element sRequestElem = DomUtil.createElement(document, XML_SEARCHREQUEST, NAMESPACE);
+        for (Iterator it = namespaces.keySet().iterator(); it.hasNext(); ) {
+            String prefix = (String) it.next();
+            String uri = (String) namespaces.get(prefix);
+            DomUtil.setNamespaceAttribute(sRequestElem, prefix, uri);
+        }
         DomUtil.addChildElement(sRequestElem, language, languageNamespace, query);
         return sRequestElem;
     }
@@ -124,8 +174,16 @@
             throw new DavException(DavServletResponse.SC_BAD_REQUEST);
         }
         Element first = DomUtil.getFirstChildElement(searchRequest);
+        Attr[] nsAttributes = DomUtil.getNamespaceAttributes(searchRequest);
+        Map namespaces = new HashMap();
+        for (int i = 0; i < nsAttributes.length; i++) {
+            // filter out xmlns namespace and DAV namespace
+            if (!IGNORED_NAMESPACES.contains(nsAttributes[i].getValue())) {
+                namespaces.put(nsAttributes[i].getLocalName(), nsAttributes[i].getValue());
+            }
+        }
         if (first != null) {
-            return new SearchInfo(first.getLocalName(), DomUtil.getNamespace(first), DomUtil.getText(first));
+            return new SearchInfo(first.getLocalName(), DomUtil.getNamespace(first), DomUtil.getText(first), namespaces);
         } else {
             log.warn("A single child element is expected with the 'DAV:searchrequest'.");
             throw new DavException(DavServletResponse.SC_BAD_REQUEST);

Modified: jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/xml/DomUtil.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/xml/DomUtil.java?view=diff&rev=483369&r1=483368&r2=483369
==============================================================================
--- jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/xml/DomUtil.java (original)
+++ jackrabbit/trunk/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/xml/DomUtil.java Thu Dec  7 00:17:09 2006
@@ -26,6 +26,7 @@
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.w3c.dom.Text;
+import org.w3c.dom.NamedNodeMap;
 
 import javax.xml.parsers.DocumentBuilderFactory;
 import java.util.ArrayList;
@@ -77,6 +78,24 @@
     }
 
     /**
+     * Returns the namespace attributes of the given element.
+     *
+     * @param element
+     * @return the namespace attributes.
+     */
+    public static Attr[] getNamespaceAttributes(Element element) {
+        NamedNodeMap attributes = element.getAttributes();
+        List nsAttr = new ArrayList();
+        for (int i = 0; i < attributes.getLength(); i++) {
+            Attr attr = (Attr) attributes.item(i);
+            if (Namespace.XMLNS_NAMESPACE.getURI().equals(attr.getNamespaceURI())) {
+                nsAttr.add(attr);
+            }
+        }
+        return (Attr[]) nsAttr.toArray(new Attr[nsAttr.size()]);
+    }
+
+    /**
      * Concatenates the values of all child nodes of type 'Text' or 'CDATA'/
      *
      * @param element
@@ -493,6 +512,17 @@
             attr.setValue(attrValue);
             element.setAttributeNodeNS(attr);
         }
+    }
+
+    /**
+     * Adds a namespace attribute on the given element.
+     *
+     * @param element
+     * @param prefix
+     * @param uri
+     */
+    public static void setNamespaceAttribute(Element element, String prefix, String uri) {
+        setAttribute(element, prefix, Namespace.XMLNS_NAMESPACE, uri);
     }
 
     /**