Index: src/main/java/org/apache/jackrabbit/core/query/QueryTreeBuilderRegistry.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/query/QueryTreeBuilderRegistry.java (revision 427141) +++ src/main/java/org/apache/jackrabbit/core/query/QueryTreeBuilderRegistry.java (working copy) @@ -22,8 +22,12 @@ import javax.imageio.spi.ServiceRegistry; import javax.jcr.query.InvalidQueryException; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Iterator; +import java.util.Set; /** * Implements a central access to QueryTreeBuilder instances. @@ -39,17 +43,26 @@ * List of QueryTreeBuilder instances known to the classloader. */ private static final List BUILDERS = new ArrayList(); + + /** + * Set of languages known to the registered builders. + */ + private static final Set LANGUAGES; static { + Set languages = new HashSet(); try { Iterator it = ServiceRegistry.lookupProviders(QueryTreeBuilder.class, QueryTreeBuilderRegistry.class.getClassLoader()); while (it.hasNext()) { - BUILDERS.add(it.next()); + QueryTreeBuilder qtb = (QueryTreeBuilder)it.next(); + BUILDERS.add(qtb); + languages.addAll(Arrays.asList(qtb.getSupportedLanguages())); } } catch (Error e) { log.warn("Unable to load providers for QueryTreeBuilder: " + e); } + LANGUAGES = Collections.unmodifiableSet(languages); } /** @@ -70,4 +83,16 @@ } throw new InvalidQueryException("Unsupported language: " + language); } -} + + /** + * Returns the set of query languages supported by all registered + * {@link QueryTreeBuilder} implementations. + * + * @return String array containing the names of the supported languages. + */ + public static String[] getSupportedLanguages() { + return (String[])LANGUAGES.toArray(EMPTY); + } + + private static final String[] EMPTY = new String[0]; +} \ No newline at end of file Index: src/main/java/org/apache/jackrabbit/core/query/QueryTreeBuilder.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/query/QueryTreeBuilder.java (revision 427141) +++ src/main/java/org/apache/jackrabbit/core/query/QueryTreeBuilder.java (working copy) @@ -46,6 +46,13 @@ * false otherwise. */ boolean canHandle(String language); + + /** + * Returns the set of query languages supported by this builder. + * + * @return String array containing the names of the supported languages. + */ + String[] getSupportedLanguages(); /** * Creates a String representation of the query node tree in the syntax this Index: src/main/java/org/apache/jackrabbit/core/query/xpath/QueryBuilder.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/query/xpath/QueryBuilder.java (revision 427141) +++ src/main/java/org/apache/jackrabbit/core/query/xpath/QueryBuilder.java (working copy) @@ -47,8 +47,20 @@ /** * @inheritDoc */ + public String[] getSupportedLanguages() { + return LANGUAGES; + } + + /** + * @inheritDoc + */ public String toString(QueryRootNode root, NamespaceResolver resolver) throws InvalidQueryException { return XPathQueryBuilder.toString(root, resolver); } + + /** + * This builder supports {@link Query#XPATH} + */ + private String[] LANGUAGES = new String[] { Query.XPATH }; } Index: src/main/java/org/apache/jackrabbit/core/query/sql/QueryBuilder.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/query/sql/QueryBuilder.java (revision 427141) +++ src/main/java/org/apache/jackrabbit/core/query/sql/QueryBuilder.java (working copy) @@ -47,8 +47,20 @@ /** * @inheritDoc */ + public String[] getSupportedLanguages() { + return LANGUAGES; + } + + /** + * @inheritDoc + */ public String toString(QueryRootNode root, NamespaceResolver resolver) throws InvalidQueryException { return JCRSQLQueryBuilder.toString(root, resolver); } + + /** + * This builder supports {@link Query#SQL} + */ + private String[] LANGUAGES = new String[] { Query.SQL }; } Index: src/main/java/org/apache/jackrabbit/core/query/QueryManagerImpl.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/query/QueryManagerImpl.java (revision 427141) +++ src/main/java/org/apache/jackrabbit/core/query/QueryManagerImpl.java (working copy) @@ -37,9 +37,7 @@ /** * Defines all supported query languages */ - private static final String[] SUPPORTED_QUERIES = new String[]{ - Query.SQL, Query.XPATH - }; + private static final String[] SUPPORTED_QUERIES = QueryTreeBuilderRegistry.getSupportedLanguages(); /** * List of all supported query languages