Changeset 6848 for SRUServer


Ignore:
Timestamp:
11/25/15 14:18:20 (8 years ago)
Author:
Oliver Schonefeld
Message:
  • use a Builder pattern for SRuQueryParserRegistry
Location:
SRUServer/trunk/src/main/java/eu/clarin/sru/server
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • SRUServer/trunk/src/main/java/eu/clarin/sru/server/SRUQueryParserRegistry.java

    r6842 r6848  
    1717package eu.clarin.sru.server;
    1818
     19import java.util.ArrayList;
    1920import java.util.Collections;
    2021import java.util.List;
    21 import java.util.concurrent.CopyOnWriteArrayList;
    2222
    2323
    2424/**
    25  * Class for registering query parsers. The query parser for CQL will be
    26  * automatically registered.
     25 * A registry to keep track of registered {@link SRUQueryParser} to be used by
     26 * the {@link SRUServer}.
    2727 *
    2828 * @see SRUQueryParser
    2929 */
    3030public class SRUQueryParserRegistry {
    31     private CopyOnWriteArrayList<SRUQueryParser<?>> queryParsers =
    32             new CopyOnWriteArrayList<SRUQueryParser<?>>();
     31    private final List<SRUQueryParser<?>> parsers;
    3332
    3433
     
    3635     * Constructor.
    3736     */
    38     public SRUQueryParserRegistry() {
    39         queryParsers.add(new CQLQueryParser());
    40         queryParsers.add(new SearchTermsQueryParser());
    41     }
    42 
    43 
    44     /**
    45      * Register a new query parser
    46      *
    47      * @param parser
    48      *            the query parser instance to be registered
    49      * @throws SRUConfigException
    50      *             if a query parser for the same query type was already
    51      *             registered
    52      */
    53     public void registerQueryParser(SRUQueryParser<?> parser)
    54             throws SRUConfigException {
    55         if (parser == null) {
    56             throw new NullPointerException("parser == null");
     37    private SRUQueryParserRegistry(List<SRUQueryParser<?>> parsers) {
     38        if (parsers == null) {
     39            throw new NullPointerException("parsers == null");
    5740        }
    58         if (parser.getQueryType() == null) {
    59             throw new NullPointerException("parser.getQueryType() == null");
     41        if (parsers.isEmpty()) {
     42            throw new IllegalArgumentException("parsers is empty!");
    6043        }
    61         synchronized (this) {
    62             final String queryType = parser.getQueryType();
    63             for (SRUQueryParser<?> queryParser : queryParsers) {
    64                 if (queryType.equals(queryParser.getQueryType())) {
    65                     throw new SRUConfigException(
    66                             "query parser for queryType '" + queryType +
    67                                     "' is already registered");
    68                 }
    69             } // for
    70             queryParsers.add(parser);
    71         } // synchronized (this)
     44        this.parsers = Collections.unmodifiableList(parsers);
    7245    }
    7346
     
    8558            throw new NullPointerException("queryType == null");
    8659        }
    87         for (SRUQueryParser<?> queryParser : queryParsers) {
    88             if (queryType.equals(queryParser.getQueryType())) {
    89                 return queryParser;
     60        return findParser(parsers, queryType);
     61    }
     62
     63
     64    /**
     65     * Get a list of all registered query parsers.
     66     *
     67     * @return a list of registered query parsers
     68     */
     69    public List<SRUQueryParser<?>> getQueryParsers() {
     70        return parsers;
     71    }
     72
     73
     74    /**
     75     * Builder for creating {@link SRUQueryParserRegistry} instances.
     76     */
     77    public static class Builder {
     78        private final List<SRUQueryParser<?>> parsers =
     79                new ArrayList<SRUQueryParser<?>>();
     80
     81
     82        /**
     83         * Constructor.
     84         *
     85         * @param registerDefaults
     86         *            if <code>true</code>, register SRU/CQL standard query
     87         *            parsers (queryType <em>cql</em> and <em>searchTerms</em>),
     88         *            otherwise do nothing
     89         */
     90        public Builder(boolean registerDefaults) {
     91            if (registerDefaults) {
     92                registerDefaults();
    9093            }
    91         } // for
     94        }
     95
     96
     97        /**
     98         * Constructor. Automaticaly registers registers SRU/CQL standard query
     99         * parsers (queryType <em>cql</em> and <em>searchTerms</em>).
     100         */
     101        public Builder() {
     102            this(true);
     103        }
     104
     105
     106        public Builder registerDefaults() {
     107            if (findParser(parsers, SRUConstants.SRU_QUERY_TYPE_CQL) == null) {
     108                try {
     109                    register(new CQLQueryParser());
     110                } catch (SRUConfigException e) {
     111                    /* IGNORE */
     112                }
     113            }
     114            if (findParser(parsers, SRUConstants.SRU_QUERY_TYPE_SEARCH_TERMS) == null) {
     115                try {
     116                    register(new SearchTermsQueryParser());
     117                } catch (SRUConfigException e) {
     118                    /* IGNORE */
     119                }
     120            }
     121            return this;
     122        }
     123
     124
     125        /**
     126         * Register a new query parser
     127         *
     128         * @param parser
     129         *            the query parser instance to be registered
     130         * @throws SRUConfigException
     131         *             if a query parser for the same query type was already
     132         *             registered
     133         */
     134        public Builder register(SRUQueryParser<?> parser) throws SRUConfigException {
     135            if (parser == null) {
     136                throw new NullPointerException("parser == null");
     137            }
     138            if (parser.getQueryType() == null) {
     139                throw new NullPointerException("parser.getQueryType() == null");
     140            }
     141
     142            // duplicate-save add ...
     143            if (findParser(parsers, parser.getQueryType()) == null) {
     144                parsers.add(parser);
     145            } else {
     146                throw new SRUConfigException("query parser for queryType '" +
     147                        parser.getQueryType() + "' is already registered");
     148            }
     149
     150            return this;
     151        }
     152
     153
     154        /**
     155         * Create a configured {@link SRUQueryParserRegistry} instance from this
     156         * builder.
     157         *
     158         * @return a {@link SRUQueryParserRegistry} instance
     159         */
     160        public SRUQueryParserRegistry build() {
     161            return new SRUQueryParserRegistry(parsers);
     162        }
     163    }
     164
     165
     166    private static final SRUQueryParser<?> findParser(
     167            List<SRUQueryParser<?>> parsers, String queryType) {
     168        for (SRUQueryParser<?> parser : parsers) {
     169            if (queryType.equals(parser.getQueryType())) {
     170                return parser;
     171            }
     172        }
    92173        return null;
    93174    }
    94175
    95 
    96     public List<SRUQueryParser<?>> getQueryParsers() {
    97         return Collections.unmodifiableList(queryParsers);
    98     }
    99 
    100176} // class SRUQueryParserRegistry
  • SRUServer/trunk/src/main/java/eu/clarin/sru/server/utils/SRUSearchEngineBase.java

    r6825 r6848  
    3030import eu.clarin.sru.server.SRUSearchEngine;
    3131import eu.clarin.sru.server.SRUSearchResultSet;
     32import eu.clarin.sru.server.SRUServer;
    3233import eu.clarin.sru.server.SRUServerConfig;
    3334
     
    8990     * @param config
    9091     *            the {@link SRUServerConfig} object for this search engine
    91      * @param queryParsers
    92      *            the {@link SRUQueryParserRegistry} object for this search
    93      *            engine. Register additional query parsers with this object.
     92     * @param parsersRegistryBuilder
     93     *            the {@link SRUQueryParserRegistry.Builder} object to be used
     94     *            for this search engine. Use to register additional query
     95     *            parsers with the {@link SRUServer}.
    9496     * @param params
    9597     *            additional parameters gathered from the Servlet configuration
     
    100102    public void init(ServletContext context,
    101103            SRUServerConfig config,
    102             SRUQueryParserRegistry queryParsers,
     104            SRUQueryParserRegistry.Builder parsersRegistryBuilder,
    103105            Map<String, String> params) throws SRUConfigException {
    104106    }
  • SRUServer/trunk/src/main/java/eu/clarin/sru/server/utils/SRUServerServlet.java

    r6825 r6848  
    248248         */
    249249        try {
    250             final SRUQueryParserRegistry parsers = new SRUQueryParserRegistry();
    251             searchEngine.init(ctx, sruServerConfig, parsers, params);
     250            final SRUQueryParserRegistry.Builder builder =
     251                    new SRUQueryParserRegistry.Builder();
     252            searchEngine.init(ctx, sruServerConfig, builder, params);
     253            final SRUQueryParserRegistry parsers = builder.build();
    252254            sruServer = new SRUServer(sruServerConfig, parsers, searchEngine);
    253255        } catch (SRUConfigException e) {
Note: See TracChangeset for help on using the changeset viewer.