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 2005/09/30 10:22:58 UTC

svn commit: r292675 - in /incubator/jackrabbit/trunk/src/java: META-INF/services/ org/apache/jackrabbit/core/query/ org/apache/jackrabbit/core/query/lucene/ org/apache/jackrabbit/core/query/sql/ org/apache/jackrabbit/core/query/xpath/

Author: mreutegg
Date: Fri Sep 30 01:22:45 2005
New Revision: 292675

URL: http://svn.apache.org/viewcvs?rev=292675&view=rev
Log:
JCR-229: Decouple packages in core.query
- TextPlainTextFilter moved to sub package o.a.j.c.query.lucene
- Introduced interface QueryTreeBuilder that allows to implement arbitrary syntax that can be represented with a QueryNode tree specified in package o.a.j.c.query. XPath and SQL syntax are now implemented via this interface.

Added:
    incubator/jackrabbit/trunk/src/java/META-INF/services/org.apache.jackrabbit.core.query.QueryTreeBuilder
    incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/QueryTreeBuilder.java   (with props)
    incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/QueryTreeBuilderRegistry.java   (with props)
    incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/lucene/TextPlainTextFilter.java   (with props)
    incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/sql/QueryBuilder.java   (with props)
    incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/xpath/QueryBuilder.java   (with props)
Removed:
    incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/TextPlainTextFilter.java
Modified:
    incubator/jackrabbit/trunk/src/java/META-INF/services/org.apache.jackrabbit.core.query.TextFilterService
    incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/QueryParser.java
    incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/TextFilterService.java

Added: incubator/jackrabbit/trunk/src/java/META-INF/services/org.apache.jackrabbit.core.query.QueryTreeBuilder
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/META-INF/services/org.apache.jackrabbit.core.query.QueryTreeBuilder?rev=292675&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/src/java/META-INF/services/org.apache.jackrabbit.core.query.QueryTreeBuilder (added)
+++ incubator/jackrabbit/trunk/src/java/META-INF/services/org.apache.jackrabbit.core.query.QueryTreeBuilder Fri Sep 30 01:22:45 2005
@@ -0,0 +1,22 @@
+# Copyright 2004-2005 The Apache Software Foundation or its licensors,
+#                     as applicable.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# This file lists all available query language implementations that are shipped
+# with Jackrabbit.
+#
+
+org.apache.jackrabbit.core.query.xpath.QueryBuilder
+org.apache.jackrabbit.core.query.sql.QueryBuilder

Modified: incubator/jackrabbit/trunk/src/java/META-INF/services/org.apache.jackrabbit.core.query.TextFilterService
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/META-INF/services/org.apache.jackrabbit.core.query.TextFilterService?rev=292675&r1=292674&r2=292675&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/src/java/META-INF/services/org.apache.jackrabbit.core.query.TextFilterService (original)
+++ incubator/jackrabbit/trunk/src/java/META-INF/services/org.apache.jackrabbit.core.query.TextFilterService Fri Sep 30 01:22:45 2005
@@ -18,4 +18,4 @@
 # with Jackrabbit.
 #
 
-org.apache.jackrabbit.core.query.TextPlainTextFilter
+org.apache.jackrabbit.core.query.lucene.TextPlainTextFilter

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/QueryParser.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/QueryParser.java?rev=292675&r1=292674&r2=292675&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/QueryParser.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/QueryParser.java Fri Sep 30 01:22:45 2005
@@ -16,12 +16,9 @@
  */
 package org.apache.jackrabbit.core.query;
 
-import org.apache.jackrabbit.core.query.sql.JCRSQLQueryBuilder;
-import org.apache.jackrabbit.core.query.xpath.XPathQueryBuilder;
 import org.apache.jackrabbit.name.NamespaceResolver;
 
 import javax.jcr.query.InvalidQueryException;
-import javax.jcr.query.Query;
 
 /**
  * This class acts as the central entry point for parsing query statements from
@@ -53,13 +50,8 @@
                                       NamespaceResolver resolver)
             throws InvalidQueryException {
 
-        if (Query.XPATH.equals(language)) {
-            return XPathQueryBuilder.createQuery(statement, resolver);
-        } else if (Query.SQL.equals(language)) {
-            return JCRSQLQueryBuilder.createQuery(statement, resolver);
-        } else {
-            throw new InvalidQueryException("Unsupported language: " + language);
-        }
+        QueryTreeBuilder builder = QueryTreeBuilderRegistry.getQueryTreeBuilder(language);
+        return builder.createQueryTree(statement, resolver);
     }
 
     /**
@@ -86,13 +78,8 @@
                                   NamespaceResolver resolver)
             throws InvalidQueryException {
 
-        if (Query.XPATH.equals(language)) {
-            return XPathQueryBuilder.toString(root, resolver);
-        } else if (Query.SQL.equals(language)) {
-            return JCRSQLQueryBuilder.toString(root, resolver);
-        } else {
-            throw new InvalidQueryException("Unsupported language: " + language);
-        }
+        QueryTreeBuilder builder = QueryTreeBuilderRegistry.getQueryTreeBuilder(language);
+        return builder.toString(root, resolver);
     }
 
 }

Added: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/QueryTreeBuilder.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/QueryTreeBuilder.java?rev=292675&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/QueryTreeBuilder.java (added)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/QueryTreeBuilder.java Fri Sep 30 01:22:45 2005
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.query;
+
+import org.apache.jackrabbit.name.NamespaceResolver;
+
+import javax.jcr.query.InvalidQueryException;
+
+/**
+ * Specifies an interface for a query tree builder.
+ */
+public interface QueryTreeBuilder {
+
+    /**
+     * Creates a <code>QueryNode</code> tree from a statement.
+     *
+     * @param statement the statement.
+     * @param resolver  the namespace resolver to use.
+     * @return the <code>QueryNode</code> tree for the statement.
+     * @throws javax.jcr.query.InvalidQueryException
+     *          if the statement is malformed.
+     */
+    public QueryRootNode createQueryTree(String statement, NamespaceResolver resolver)
+            throws InvalidQueryException;
+
+    /**
+     * Returns <code>true</code> if this query tree builder can handle a
+     * statement in <code>language</code>.
+     *
+     * @param language the language of a query statement to build a query tree.
+     * @return <code>true</code> if this builder can handle <code>language</code>;
+     *         <code>false</code> otherwise.
+     */
+    public boolean canHandle(String language);
+
+    /**
+     * Creates a String representation of the query node tree in the syntax this
+     * <code>QueryTreeBuilder</code> can handle.
+     *
+     * @param root     the root of the query node tree.
+     * @param resolver to resolve QNames.
+     * @return a String representation of the query node tree.
+     * @throws InvalidQueryException if the query node tree cannot be converted
+     *                               into a String representation due to
+     *                               restrictions in this syntax.
+     */
+    public String toString(QueryRootNode root, NamespaceResolver resolver)
+            throws InvalidQueryException;
+}

Propchange: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/QueryTreeBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/QueryTreeBuilderRegistry.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/QueryTreeBuilderRegistry.java?rev=292675&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/QueryTreeBuilderRegistry.java (added)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/QueryTreeBuilderRegistry.java Fri Sep 30 01:22:45 2005
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.query;
+
+import org.apache.log4j.Logger;
+
+import javax.imageio.spi.ServiceRegistry;
+import javax.jcr.query.InvalidQueryException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Iterator;
+
+/**
+ * Implements a central access to QueryTreeBuilder instances.
+ */
+public class QueryTreeBuilderRegistry {
+
+    /**
+     * Logger instance for this class.
+     */
+    private static final Logger log = Logger.getLogger(QueryTreeBuilderRegistry.class);
+
+    /**
+     * List of <code>QueryTreeBuilder</code> instances known to the classloader.
+     */
+    private static final List BUILDERS = new ArrayList();
+
+    static {
+        try {
+            Iterator it = ServiceRegistry.lookupProviders(QueryTreeBuilder.class);
+            while (it.hasNext()) {
+                BUILDERS.add(it.next());
+            }
+        } catch (Error e) {
+            log.warn("Unable to load providers for QueryTreeBuilder: " + e);
+        }
+    }
+
+    /**
+     * Returns the <code>QueryTreeBuilder</code> for <code>language</code>.
+     *
+     * @param language the language of the query statement.
+     * @return the <code>QueryTreeBuilder</code> for <code>language</code>.
+     * @throws InvalidQueryException if there is no query tree builder for
+     *                               <code>language</code>.
+     */
+    public static QueryTreeBuilder getQueryTreeBuilder(String language)
+            throws InvalidQueryException {
+        for (int i = 0; i < BUILDERS.size(); i++) {
+            QueryTreeBuilder builder = (QueryTreeBuilder) BUILDERS.get(i);
+            if (builder.canHandle(language)) {
+                return builder;
+            }
+        }
+        throw new InvalidQueryException("Unsupported language: " + language);
+    }
+}

Propchange: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/QueryTreeBuilderRegistry.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/TextFilterService.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/TextFilterService.java?rev=292675&r1=292674&r2=292675&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/TextFilterService.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/TextFilterService.java Fri Sep 30 01:22:45 2005
@@ -32,7 +32,7 @@
  * are registered in a jar file as providers for
  * <code>META-INF/services/org.apache.jackrabbit.core.query.TextFilterService</code>
  * E.g. the jackrabbit jar file contains entries for some {@link TextFilter}
- * implementations such as {@link TextPlainTextFilter}. Custom
+ * implementations such as {@link org.apache.jackrabbit.core.query.lucene.TextPlainTextFilter}. Custom
  * {@link TextFilter} implementations may be added to Jackrabbit by packaging
  * them into a jar file together with a
  * <code>META-INF/services/org.apache.jackrabbit.core.query.TextFilterService</code>

Added: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/lucene/TextPlainTextFilter.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/lucene/TextPlainTextFilter.java?rev=292675&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/lucene/TextPlainTextFilter.java (added)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/lucene/TextPlainTextFilter.java Fri Sep 30 01:22:45 2005
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.query.lucene;
+
+import org.apache.jackrabbit.core.query.TextFilter;
+import org.apache.jackrabbit.core.state.PropertyState;
+import org.apache.jackrabbit.core.value.BLOBFileValue;
+import org.apache.jackrabbit.core.value.InternalValue;
+
+import javax.jcr.RepositoryException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Implements a {@link org.apache.jackrabbit.core.query.TextFilter} that handles binary properties of mime-type
+ * text/plain.
+ */
+public class TextPlainTextFilter implements TextFilter {
+
+    /**
+     * Returns <code>true</code> for <code>text/plain</code>; <code>false</code>
+     * in all other cases.
+     * @param mimeType the mime-type.
+     * @return <code>true</code> for <code>text/plain</code>; <code>false</code>
+     * in all other cases.
+     */
+    public boolean canFilter(String mimeType) {
+        return "text/plain".equalsIgnoreCase(mimeType);
+    }
+
+    /**
+     * Returns a map with a single entry for field {@link FieldNames#FULLTEXT}.
+     * @param data the data property.
+     * @param encoding the encoding
+     * @return a map with a single Reader value for field
+     *  {@link FieldNames#FULLTEXT}.
+     * @throws RepositoryException if encoding is not supported or data is a
+     *  multi-value property.
+     */
+    public Map doFilter(PropertyState data, String encoding) throws RepositoryException {
+        InternalValue[] values = data.getValues();
+        if (values.length == 1) {
+            BLOBFileValue blob = (BLOBFileValue) values[0].internalValue();
+            try {
+                Reader reader;
+                if (encoding == null) {
+                    // use platform default
+                    reader = new InputStreamReader(blob.getStream());
+                } else {
+                    reader = new InputStreamReader(blob.getStream(), encoding);
+                }
+                Map result = new HashMap();
+                result.put(FieldNames.FULLTEXT, reader);
+                return result;
+            } catch (UnsupportedEncodingException e) {
+                throw new RepositoryException(e);
+            }
+        } else {
+            // multi value not supported
+            throw new RepositoryException("Multi-valued binary properties not supported.");
+        }
+    }
+}

Propchange: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/lucene/TextPlainTextFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/sql/QueryBuilder.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/sql/QueryBuilder.java?rev=292675&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/sql/QueryBuilder.java (added)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/sql/QueryBuilder.java Fri Sep 30 01:22:45 2005
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.query.sql;
+
+import org.apache.jackrabbit.core.query.QueryTreeBuilder;
+import org.apache.jackrabbit.core.query.QueryRootNode;
+import org.apache.jackrabbit.name.NamespaceResolver;
+
+import javax.jcr.query.InvalidQueryException;
+import javax.jcr.query.Query;
+
+/**
+ * Implements the JCR SQL query tree builder.
+ */
+public class QueryBuilder implements QueryTreeBuilder {
+
+    /**
+     * @inheritDoc
+     */
+    public QueryRootNode createQueryTree(String statement,
+                                         NamespaceResolver resolver)
+            throws InvalidQueryException {
+        return JCRSQLQueryBuilder.createQuery(statement, resolver);
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public boolean canHandle(String language) {
+        return Query.SQL.equals(language);
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public String toString(QueryRootNode root, NamespaceResolver resolver)
+            throws InvalidQueryException {
+        return JCRSQLQueryBuilder.toString(root, resolver);
+    }
+}

Propchange: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/sql/QueryBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/xpath/QueryBuilder.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/xpath/QueryBuilder.java?rev=292675&view=auto
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/xpath/QueryBuilder.java (added)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/xpath/QueryBuilder.java Fri Sep 30 01:22:45 2005
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation or its licensors,
+ *                     as applicable.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.query.xpath;
+
+import org.apache.jackrabbit.core.query.QueryTreeBuilder;
+import org.apache.jackrabbit.core.query.QueryRootNode;
+import org.apache.jackrabbit.name.NamespaceResolver;
+
+import javax.jcr.query.InvalidQueryException;
+import javax.jcr.query.Query;
+
+/**
+ * Implements the XPath query tree builder.
+ */
+public class QueryBuilder implements QueryTreeBuilder {
+
+    /**
+     * @inheritDoc
+     */
+    public QueryRootNode createQueryTree(String statement,
+                                         NamespaceResolver resolver)
+            throws InvalidQueryException {
+        return XPathQueryBuilder.createQuery(statement, resolver);
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public boolean canHandle(String language) {
+        return Query.XPATH.equals(language);
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public String toString(QueryRootNode root, NamespaceResolver resolver)
+            throws InvalidQueryException {
+        return XPathQueryBuilder.toString(root, resolver);
+    }
+}

Propchange: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/query/xpath/QueryBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native