Example usage for org.apache.solr.request SolrRequestInfo clearRequestInfo

List of usage examples for org.apache.solr.request SolrRequestInfo clearRequestInfo

Introduction

In this page you can find the example usage for org.apache.solr.request SolrRequestInfo clearRequestInfo.

Prototype

public static void clearRequestInfo() 

Source Link

Usage

From source file:net.yacy.cora.federate.solr.connector.EmbeddedSolrConnector.java

License:Open Source License

/**
 * get the solr document list from a query response
 * This differs from getResponseByParams in such a way that it does only create the fields of the response but
 * never search snippets and there are also no facets generated.
 * @param params//from  w ww .  j  a va 2  s .c o m
 * @return
 * @throws IOException
 * @throws SolrException
 */
@Override
public SolrDocumentList getDocumentListByParams(ModifiableSolrParams params) throws IOException, SolrException {
    SolrQueryRequest req = this.request(params);
    SolrQueryResponse response = null;
    String q = params.get(CommonParams.Q);
    String fq = params.get(CommonParams.FQ);
    String sort = params.get(CommonParams.SORT);
    String threadname = Thread.currentThread().getName();
    try {
        if (q != null)
            Thread.currentThread().setName("solr query: q = " + q + (fq == null ? "" : ", fq = " + fq)
                    + (sort == null ? "" : ", sort = " + sort)); // for debugging in Threaddump
        response = this.query(req);
        if (q != null)
            Thread.currentThread().setName(threadname);
        if (response == null)
            throw new IOException("response == null");
        return SolrQueryResponse2SolrDocumentList(req, response);
    } finally {
        req.close();
        SolrRequestInfo.clearRequestInfo();
    }
}

From source file:net.yacy.http.servlets.GSAsearchServlet.java

License:Open Source License

/**
 * from here copy of htroot/gsa/gsasearchresult.java
 * with modification to use HttpServletRequest instead of (yacy) RequestHeader
 *//*from   w  ww  .  j  a  v a  2 s.  c  o  m*/

public static void respond(final HttpServletRequest header, final Switchboard sb, final OutputStream out) {

    // remember the peer contact for peer statistics
    String clientip = header.getHeader(HeaderFramework.CONNECTION_PROP_CLIENTIP);
    if (clientip == null)
        clientip = "<unknown>"; // read an artificial header addendum
    String userAgent = header.getHeader(HeaderFramework.USER_AGENT);
    if (userAgent == null)
        userAgent = "<unknown>";
    sb.peers.peerActions.setUserAgent(clientip, userAgent);

    // --- handled by Servlet securityHandler
    // check if user is allowed to search (can be switched in /ConfigPortal.html)
    boolean authenticated = header.isUserInRole(UserDB.AccessRight.ADMIN_RIGHT.toString()); //sb.adminAuthenticated(header) >= 2;
    // final boolean searchAllowed = authenticated || sb.getConfigBool(SwitchboardConstants.PUBLIC_SEARCHPAGE, true);
    // if (!searchAllowed) return null;

    // create post
    serverObjects post = new serverObjects();
    post.put(CommonParams.Q, "");
    post.put("num", "0");
    // convert servletrequest parameter to old style serverObjects map
    Map<String, String[]> map = header.getParameterMap();
    Iterator<Map.Entry<String, String[]>> it = map.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry<String, String[]> param = it.next();
        post.put(param.getKey(), param.getValue()); // hint: post.put uses String[] for String value anyways
    }

    ConcurrentLog.info("GSA Query", post.toString());
    sb.intermissionAllThreads(3000); // tell all threads to do nothing for a specific time

    // rename post fields according to result style
    //post.put(CommonParams.Q, post.remove("q")); // same as solr
    //post.put(CommonParams.START, post.remove("start")); // same as solr
    //post.put(, post.remove("client"));//required, example: myfrontend
    //post.put(, post.remove("output"));//required, example: xml,xml_no_dtd
    String originalQuery = post.get(CommonParams.Q, "");
    post.put("originalQuery", originalQuery);

    // get a solr query string
    QueryGoal qg = new QueryGoal(originalQuery);
    List<String> solrFQ = qg.collectionTextFilterQuery(false);
    StringBuilder solrQ = qg.collectionTextQuery();
    post.put("defType", "edismax");
    for (String fq : solrFQ)
        post.add(CommonParams.FQ, fq);
    post.put(CommonParams.Q, solrQ.toString());
    post.put(CommonParams.ROWS, post.remove("num"));
    post.put(CommonParams.ROWS,
            Math.min(post.getInt(CommonParams.ROWS, 10), (authenticated) ? 100000000 : 100));

    // set ranking
    final Ranking ranking = sb.index.fulltext().getDefaultConfiguration().getRanking(0);
    final String qf = ranking.getQueryFields();
    if (!qf.isEmpty())
        post.put(DisMaxParams.QF, qf);
    if (post.containsKey(CommonParams.SORT)) {
        // if a gsa-style sort attribute is given, use this to set the solr sort attribute
        GSAResponseWriter.Sort sort = new GSAResponseWriter.Sort(post.get(CommonParams.SORT, ""));
        String sorts = sort.toSolr();
        if (sorts == null) {
            post.remove(CommonParams.SORT);
        } else {
            post.put(CommonParams.SORT, sorts);
        }
    } else {
        // if no such sort attribute is given, use the ranking as configured for YaCy
        String fq = ranking.getFilterQuery();
        String bq = ranking.getBoostQuery();
        String bf = ranking.getBoostFunction();
        if (fq.length() > 0)
            post.put(CommonParams.FQ, fq);
        if (bq.length() > 0)
            post.put(DisMaxParams.BQ, bq);
        if (bf.length() > 0)
            post.put("boost", bf); // a boost function extension, see http://wiki.apache.org/solr/ExtendedDisMax#bf_.28Boost_Function.2C_additive.29
    }
    String daterange[] = post.remove("daterange");
    if (daterange != null) {
        String origfq = post.get(CommonParams.FQ);
        String datefq = "";
        for (String dr : daterange) {
            String from_to[] = dr.endsWith("..") ? new String[] { dr.substring(0, dr.length() - 2), "" }
                    : dr.startsWith("..") ? new String[] { "", dr.substring(2) } : dr.split("\\.\\.");
            if (from_to.length != 2)
                continue;
            Date from = HeaderFramework.parseGSAFS(from_to[0]);
            if (from == null)
                from = new Date(0);
            Date to = HeaderFramework.parseGSAFS(from_to[1]);
            if (to == null)
                to = new Date();
            to.setTime(to.getTime() + 24L * 60L * 60L * 1000L); // we add a day because the day is inclusive
            String z = CollectionSchema.last_modified.getSolrFieldName() + ":["
                    + ISO8601Formatter.FORMATTER.format(from) + " TO " + ISO8601Formatter.FORMATTER.format(to)
                    + "]";
            datefq = datefq.length() == 0 ? z : " OR " + z;
        }
        if (datefq.length() > 0)
            post.put(CommonParams.FQ,
                    origfq == null || origfq.length() == 0 ? datefq : "(" + origfq + ") AND (" + datefq + ")");
    }
    post.put(CommonParams.FL,
            CollectionSchema.content_type.getSolrFieldName() + ',' + CollectionSchema.id.getSolrFieldName()
                    + ',' + CollectionSchema.sku.getSolrFieldName() + ','
                    + CollectionSchema.title.getSolrFieldName() + ','
                    + CollectionSchema.description_txt.getSolrFieldName() + ','
                    + CollectionSchema.load_date_dt.getSolrFieldName() + ','
                    + CollectionSchema.last_modified.getSolrFieldName() + ','
                    + CollectionSchema.size_i.getSolrFieldName());
    post.put("hl", "true");
    post.put("hl.q", originalQuery);
    post.put("hl.fl", CollectionSchema.description_txt + "," + CollectionSchema.h4_txt.getSolrFieldName() + ","
            + CollectionSchema.h3_txt.getSolrFieldName() + "," + CollectionSchema.h2_txt.getSolrFieldName()
            + "," + CollectionSchema.h1_txt.getSolrFieldName() + ","
            + CollectionSchema.text_t.getSolrFieldName());
    post.put("hl.alternateField", CollectionSchema.description_txt.getSolrFieldName());
    post.put("hl.simple.pre", "<b>");
    post.put("hl.simple.post", "</b>");
    post.put("hl.fragsize", Integer.toString(SearchEvent.SNIPPET_MAX_LENGTH));

    //String[] access = post.remove("access");
    //String[] entqr = post.remove("entqr");

    // add sites operator
    String[] site = post.remove("site"); // example: col1|col2
    if (site != null && site[0].length() > 0) {
        String origfq = post.get(CommonParams.FQ);
        String sitefq = QueryModifier.parseCollectionExpression(site[0]);
        post.put(CommonParams.FQ,
                origfq == null || origfq.length() == 0 ? sitefq : "(" + origfq + ") AND (" + sitefq + ")");
    }

    // get the embedded connector
    EmbeddedSolrConnector connector = sb.index.fulltext().getDefaultEmbeddedConnector();
    if (connector == null)
        return;

    // do the solr request
    SolrQueryRequest req = connector.request(post.toSolrParams(null));
    SolrQueryResponse response = null;
    Exception e = null;
    try {
        response = connector.query(req);
    } catch (final SolrException ee) {
        e = ee;
    }
    if (response != null)
        e = response.getException();
    if (e != null) {
        ConcurrentLog.logException(e);
        if (req != null)
            req.close();
        SolrRequestInfo.clearRequestInfo();
        return;
    }

    // set some context for the writer
    /*
    Map<Object,Object> context = req.getContext();
    context.put("ip", header.get("CLIENTIP", ""));
    context.put("client", "vsm_frontent");
    context.put("sort", sort.sort);
    context.put("site", site == null ? "" : site);
    context.put("access", access == null ? "p" : access[0]);
    context.put("entqr", entqr == null ? "3" : entqr[0]);
    */

    // write the result directly to the output stream
    Writer ow = new FastWriter(new OutputStreamWriter(out, UTF8.charset));
    try {
        responseWriter.write(ow, req, response);
        ow.flush();
    } catch (final IOException e1) {
    } finally {
        req.close();
        SolrRequestInfo.clearRequestInfo();
        try {
            ow.close();
        } catch (final IOException e1) {
        }
    }

    // log result
    Object rv = response.getValues().get("response");
    int matches = 0;
    if (rv != null && rv instanceof ResultContext) {
        matches = ((ResultContext) rv).docs.matches();
    } else if (rv != null && rv instanceof SolrDocumentList) {
        matches = (int) ((SolrDocumentList) rv).getNumFound();
    }
    AccessTracker.addToDump(originalQuery, Integer.toString(matches));
    ConcurrentLog.info("GSA Query", "results: " + matches + ", for query:" + post.toString());
}

From source file:net.yacy.http.servlets.SolrSelectServlet.java

License:Open Source License

@Override
public void service(ServletRequest request, ServletResponse response) throws IOException, ServletException {

    HttpServletRequest hrequest = (HttpServletRequest) request;
    HttpServletResponse hresponse = (HttpServletResponse) response;
    SolrQueryRequest req = null;// www .j  av  a2s.com

    final Method reqMethod = Method.getMethod(hrequest.getMethod());

    Writer out = null;
    try {
        // prepare request to solr
        MultiMapSolrParams mmsp = SolrRequestParsers.parseQueryString(hrequest.getQueryString());

        Switchboard sb = Switchboard.getSwitchboard();
        boolean authenticated = true;

        // count remote searches if this was part of a p2p search
        if (mmsp.getMap().containsKey("partitions")) {
            final int partitions = mmsp.getInt("partitions", 30);
            sb.searchQueriesGlobal += 1.0f / partitions; // increase query counter
        }

        // get the ranking profile id
        int profileNr = mmsp.getInt("profileNr", 0);

        // rename post fields according to result style
        String querystring = "";
        if (!mmsp.getMap().containsKey(CommonParams.Q) && mmsp.getMap().containsKey(CommonParams.QUERY)) {
            querystring = mmsp.get(CommonParams.QUERY, "");
            mmsp.getMap().remove(CommonParams.QUERY);
            QueryModifier modifier = new QueryModifier(0);
            querystring = modifier.parse(querystring);
            modifier.apply(mmsp);
            QueryGoal qg = new QueryGoal(querystring);
            StringBuilder solrQ = qg.collectionTextQuery();
            mmsp.getMap().put(CommonParams.Q, new String[] { solrQ.toString() }); // sru patch
        }
        String q = mmsp.get(CommonParams.Q, "");
        if (querystring.length() == 0)
            querystring = q;
        if (!mmsp.getMap().containsKey(CommonParams.START)) {
            int startRecord = mmsp.getFieldInt("startRecord", null, 0);
            mmsp.getMap().remove("startRecord");
            mmsp.getMap().put(CommonParams.START, new String[] { Integer.toString(startRecord) }); // sru patch
        }
        if (!mmsp.getMap().containsKey(CommonParams.ROWS)) {
            int maximumRecords = mmsp.getFieldInt("maximumRecords", null, 10);
            mmsp.getMap().remove("maximumRecords");
            mmsp.getMap().put(CommonParams.ROWS, new String[] { Integer.toString(maximumRecords) }); // sru patch
        }
        mmsp.getMap().put(CommonParams.ROWS, new String[] { Integer
                .toString(Math.min(mmsp.getInt(CommonParams.ROWS, 10), (authenticated) ? 100000000 : 100)) });

        // set ranking according to profile number if ranking attributes are not given in the request
        Ranking ranking = sb.index.fulltext().getDefaultConfiguration().getRanking(profileNr);
        if (!mmsp.getMap().containsKey(CommonParams.SORT) && !mmsp.getMap().containsKey(DisMaxParams.BQ)
                && !mmsp.getMap().containsKey(DisMaxParams.BF) && !mmsp.getMap().containsKey("boost")) {
            if (!mmsp.getMap().containsKey("defType"))
                mmsp.getMap().put("defType", new String[] { "edismax" });
            String fq = ranking.getFilterQuery();
            String bq = ranking.getBoostQuery();
            String bf = ranking.getBoostFunction();
            if (fq.length() > 0)
                mmsp.getMap().put(CommonParams.FQ, new String[] { fq });
            if (bq.length() > 0)
                mmsp.getMap().put(DisMaxParams.BQ, new String[] { bq });
            if (bf.length() > 0)
                mmsp.getMap().put("boost", new String[] { bf }); // a boost function extension, see http://wiki.apache.org/solr/ExtendedDisMax#bf_.28Boost_Function.2C_additive.29
        }

        // get a response writer for the result
        String wt = mmsp.get(CommonParams.WT, "xml"); // maybe use /solr/select?q=*:*&start=0&rows=10&wt=exml
        QueryResponseWriter responseWriter = RESPONSE_WRITER.get(wt);
        if (responseWriter == null)
            throw new ServletException("no response writer");
        if (responseWriter instanceof OpensearchResponseWriter) {
            // set the title every time, it is possible that it has changed
            final String promoteSearchPageGreeting = (sb
                    .getConfigBool(SwitchboardConstants.GREETING_NETWORK_NAME, false))
                            ? sb.getConfig("network.unit.description", "")
                            : sb.getConfig(SwitchboardConstants.GREETING, "");
            ((OpensearchResponseWriter) responseWriter).setTitle(promoteSearchPageGreeting);
        }

        // if this is a call to YaCys special search formats, enhance the query with field assignments
        if ((responseWriter instanceof YJsonResponseWriter
                || responseWriter instanceof OpensearchResponseWriter)
                && "true".equals(mmsp.get("hl", "true"))) {
            // add options for snippet generation
            if (!mmsp.getMap().containsKey("hl.q"))
                mmsp.getMap().put("hl.q", new String[] { q });
            if (!mmsp.getMap().containsKey("hl.fl"))
                mmsp.getMap().put("hl.fl",
                        new String[] { CollectionSchema.description_txt + ","
                                + CollectionSchema.h4_txt.getSolrFieldName() + ","
                                + CollectionSchema.h3_txt.getSolrFieldName() + ","
                                + CollectionSchema.h2_txt.getSolrFieldName() + ","
                                + CollectionSchema.h1_txt.getSolrFieldName() + ","
                                + CollectionSchema.text_t.getSolrFieldName() });
            if (!mmsp.getMap().containsKey("hl.alternateField"))
                mmsp.getMap().put("hl.alternateField",
                        new String[] { CollectionSchema.description_txt.getSolrFieldName() });
            if (!mmsp.getMap().containsKey("hl.simple.pre"))
                mmsp.getMap().put("hl.simple.pre", new String[] { "<b>" });
            if (!mmsp.getMap().containsKey("hl.simple.post"))
                mmsp.getMap().put("hl.simple.post", new String[] { "</b>" });
            if (!mmsp.getMap().containsKey("hl.fragsize"))
                mmsp.getMap().put("hl.fragsize",
                        new String[] { Integer.toString(SearchEvent.SNIPPET_MAX_LENGTH) });
        }

        // get the embedded connector
        String requestURI = hrequest.getRequestURI();
        boolean defaultConnector = (requestURI.startsWith("/solr/" + WebgraphSchema.CORE_NAME)) ? false
                : requestURI.startsWith("/solr/" + CollectionSchema.CORE_NAME)
                        || mmsp.get("core", CollectionSchema.CORE_NAME).equals(CollectionSchema.CORE_NAME);
        mmsp.getMap().remove("core");
        SolrConnector connector = defaultConnector ? sb.index.fulltext().getDefaultEmbeddedConnector()
                : sb.index.fulltext().getEmbeddedConnector(WebgraphSchema.CORE_NAME);
        if (connector == null) {
            connector = defaultConnector ? sb.index.fulltext().getDefaultConnector()
                    : sb.index.fulltext().getConnectorForRead(WebgraphSchema.CORE_NAME);
        }
        if (connector == null)
            throw new ServletException("no core");

        // add default queryfield parameter according to local ranking config (or defaultfield)
        if (ranking != null) { // ranking normally never null
            final String qf = ranking.getQueryFields();
            if (qf.length() > 4) { // make sure qf has content (else use df)
                addParam(DisMaxParams.QF, qf, mmsp.getMap()); // add QF that we set to be best suited for our index
                // TODO: if every peer applies a decent QF itself, this can be reverted to getMap().put()
            } else {
                mmsp.getMap().put(CommonParams.DF, new String[] { CollectionSchema.text_t.getSolrFieldName() });
            }
        } else {
            mmsp.getMap().put(CommonParams.DF, new String[] { CollectionSchema.text_t.getSolrFieldName() });
        }

        // do the solr request, generate facets if we use a special YaCy format
        final SolrQueryResponse rsp;
        if (connector instanceof EmbeddedSolrConnector) {
            req = ((EmbeddedSolrConnector) connector).request(mmsp);
            rsp = ((EmbeddedSolrConnector) connector).query(req);

            // prepare response
            hresponse.setHeader("Cache-Control", "no-cache, no-store");
            HttpCacheHeaderUtil.checkHttpCachingVeto(rsp, hresponse, reqMethod);

            // check error
            if (rsp.getException() != null) {
                AccessTracker.addToDump(querystring, "0", new Date());
                sendError(hresponse, rsp.getException());
                return;
            }

            NamedList<?> values = rsp.getValues();
            DocList r = ((ResultContext) values.get("response")).docs;
            int numFound = r.matches();
            AccessTracker.addToDump(querystring, Integer.toString(numFound), new Date());

            // write response header
            final String contentType = responseWriter.getContentType(req, rsp);
            if (null != contentType)
                response.setContentType(contentType);

            if (Method.HEAD == reqMethod) {
                return;
            }

            // write response body
            if (responseWriter instanceof BinaryResponseWriter) {
                ((BinaryResponseWriter) responseWriter).write(response.getOutputStream(), req, rsp);
            } else {
                out = new FastWriter(new OutputStreamWriter(response.getOutputStream(), UTF8.charset));
                responseWriter.write(out, req, rsp);
                out.flush();
            }
        } else {
            // write a 'faked' response using a call to the backend
            SolrDocumentList sdl = connector.getDocumentListByQuery(mmsp.getMap().get(CommonParams.Q)[0],
                    mmsp.getMap().get(CommonParams.SORT) == null ? null
                            : mmsp.getMap().get(CommonParams.SORT)[0],
                    Integer.parseInt(mmsp.getMap().get(CommonParams.START)[0]),
                    Integer.parseInt(mmsp.getMap().get(CommonParams.ROWS)[0]),
                    mmsp.getMap().get(CommonParams.FL));
            OutputStreamWriter osw = new OutputStreamWriter(response.getOutputStream());
            EnhancedXMLResponseWriter.write(osw, req, sdl);
            osw.close();
        }
    } catch (final Throwable ex) {
        sendError(hresponse, ex);
    } finally {
        if (req != null) {
            req.close();
        }
        SolrRequestInfo.clearRequestInfo();
        if (out != null)
            try {
                out.close();
            } catch (final IOException e1) {
            }
    }
}

From source file:org.tallison.solr.search.QueryEqualityTest.java

License:Apache License

/**
 * NOTE: defType is not only used to pick the parser, but, if non-null it is
 * also to record the parser being tested for coverage sanity checking
 *
 * @see QueryUtils#check//from   www  . j a  v  a 2 s  .c  o m
 * @see QueryUtils#checkEqual
 * @see #testParserCoverage
 */
protected void assertQueryEquals(final String defType, final SolrQueryRequest req, final String... inputs)
        throws Exception {

    if (null != defType)
        qParsersTested.add(defType);

    final Query[] queries = new Query[inputs.length];

    try {
        SolrQueryResponse rsp = new SolrQueryResponse();
        SolrRequestInfo.setRequestInfo(new SolrRequestInfo(req, rsp));
        for (int i = 0; i < inputs.length; i++) {
            queries[i] = QParser.getParser(inputs[i], defType, true, req).getQuery();
        }
    } finally {
        SolrRequestInfo.clearRequestInfo();
    }

    for (int i = 0; i < queries.length; i++) {
        QueryUtils.check(queries[i]);
        // yes starting j=0 is redundent, we're making sure every query
        // is equal to itself, and that the quality checks work regardless
        // of which caller/callee is used.
        for (int j = 0; j < queries.length; j++) {
            QueryUtils.checkEqual(queries[i], queries[j]);
        }
    }
}

From source file:org.vootoo.schema.CrossCoreFieldTest.java

License:Apache License

public String query(String coreName, String... query) throws Exception {
    String handler = "/select";
    SolrQueryRequest req = null;/* ww  w .j a  v a 2 s  . c o  m*/
    try (SolrCore core = coreContainer.getCore(coreName)) {
        req = makeRequest(handler, core, 0, 10, query);
        SolrQueryResponse rsp = new SolrQueryResponse();
        SolrRequestInfo.setRequestInfo(new SolrRequestInfo(req, rsp));
        core.execute(core.getRequestHandler(handler), req, rsp);
        if (rsp.getException() != null) {
            throw rsp.getException();
        }
        StringWriter sw = new StringWriter(32000);
        QueryResponseWriter responseWriter = core.getQueryResponseWriter(req);
        responseWriter.write(sw, req, rsp);
        return sw.toString();
    } finally {
        if (req != null) {
            req.close();
        }
        SolrRequestInfo.clearRequestInfo();
    }
}

From source file:org.vootoo.server.RequestProcesser.java

License:Apache License

public void handleRequest(RequestGetter requestGetter) {
    MDCLoggingContext.reset();//w w  w  . j a va  2 s  .co m
    MDCLoggingContext.setNode(cores);

    String path = requestGetter.getPath();
    solrParams = requestGetter.getSolrParams();
    SolrRequestHandler handler = null;
    String corename = "";
    String origCorename = null;
    try {
        // set a request timer which can be reused by requests if needed
        //req.setAttribute(SolrRequestParsers.REQUEST_TIMER_SERVLET_ATTRIBUTE, new RTimer());
        // put the core container in request attribute
        //req.setAttribute("org.apache.solr.CoreContainer", cores);
        // check for management path
        String alternate = cores.getManagementPath();
        if (alternate != null && path.startsWith(alternate)) {
            path = path.substring(0, alternate.length());
        }
        // unused feature ?
        int idx = path.indexOf(':');
        if (idx > 0) {
            // save the portion after the ':' for a 'handler' path parameter
            path = path.substring(0, idx);
        }

        boolean usingAliases = false;
        List<String> collectionsList = null;

        // Check for container handlers
        handler = cores.getRequestHandler(path);
        if (handler != null) {
            solrReq = parseSolrQueryRequest(SolrRequestParsers.DEFAULT, requestGetter);
            handleAdminRequest(handler, solrReq);
            return;
        } else {
            //otherwise, we should find a core from the path
            idx = path.indexOf("/", 1);
            if (idx > 1) {
                // try to get the corename as a request parameter first
                corename = path.substring(1, idx);

                // look at aliases
                if (cores.isZooKeeperAware()) {
                    origCorename = corename;
                    ZkStateReader reader = cores.getZkController().getZkStateReader();
                    aliases = reader.getAliases();
                    if (aliases != null && aliases.collectionAliasSize() > 0) {
                        usingAliases = true;
                        String alias = aliases.getCollectionAlias(corename);
                        if (alias != null) {
                            collectionsList = StrUtils.splitSmart(alias, ",", true);
                            corename = collectionsList.get(0);
                        }
                    }
                }

                core = cores.getCore(corename);

                if (core != null) {
                    path = path.substring(idx);
                }
            }

            //add collection name
            if (core == null && StringUtils.isNotBlank(requestGetter.getCollection())) {
                corename = requestGetter.getCollection();
                core = cores.getCore(corename);
            }

            if (core == null) {
                if (!cores.isZooKeeperAware()) {
                    core = cores.getCore("");
                }
            }
        }

        if (core == null && cores.isZooKeeperAware()) {
            // we couldn't find the core - lets make sure a collection was not specified instead
            core = getCoreByCollection(cores, corename);

            if (core != null) {
                // we found a core, update the path
                path = path.substring(idx);
            }

            // try the default core
            if (core == null) {
                core = cores.getCore("");
                if (core != null) {
                }
            }
        }

        // With a valid core...
        if (core != null) {
            MDCLoggingContext.setCore(core);
            final SolrConfig config = core.getSolrConfig();
            // get or create/cache the parser for the core
            SolrRequestParsers parser = config.getRequestParsers();

            // Determine the handler from the url path if not set
            // (we might already have selected the cores handler)
            if (handler == null && path.length() > 1) { // don't match "" or "/" as valid path
                handler = core.getRequestHandler(path);

                if (handler == null) {
                    //may be a restlet path
                    // Handle /schema/* paths via Restlet
                    if (path.equals("/schema") || path.startsWith("/schema/")) {
                        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
                                "unsupport /schema/**, use http solr");
                    }

                }
                // no handler yet but allowed to handle select; let's check
                if (handler == null && parser.isHandleSelect()) {
                    if ("/select".equals(path) || "/select/".equals(path)) {
                        solrReq = parseSolrQueryRequest(parser, requestGetter);

                        invalidStates = checkStateIsValid(cores,
                                solrReq.getParams().get(CloudSolrClient.STATE_VERSION));
                        String qt = solrReq.getParams().get(CommonParams.QT);
                        handler = core.getRequestHandler(qt);
                        if (handler == null) {
                            throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
                                    "unknown handler: " + qt);
                        }
                        if (qt != null && qt.startsWith("/") && (handler instanceof ContentStreamHandlerBase)) {
                            //For security reasons it's a bad idea to allow a leading '/', ex: /select?qt=/update see SOLR-3161
                            //There was no restriction from Solr 1.4 thru 3.5 and it's not supported for update handlers.
                            throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
                                    "Invalid Request Handler ('qt').  Do not use /select to access: " + qt);
                        }
                    }
                }
            }

            // With a valid handler and a valid core...
            if (handler != null) {
                // if not a /select, create the request
                if (solrReq == null) {
                    solrReq = parseSolrQueryRequest(parser, requestGetter);
                }

                if (usingAliases) {
                    processAliases(solrReq, aliases, collectionsList);
                }

                SolrQueryResponse solrRsp = new SolrQueryResponse();
                SolrRequestInfo.setRequestInfo(new SolrRequestInfo(solrReq, solrRsp));
                this.execute(handler, solrReq, solrRsp);
                QueryResponseWriter responseWriter = core.getQueryResponseWriter(solrReq);
                if (invalidStates != null)
                    solrReq.getContext().put(CloudSolrClient.STATE_VERSION, invalidStates);
                writeResponse(solrRsp, responseWriter, solrReq);

                return; // we are done with a valid handler
            }
        }
        logger.debug("no handler or core retrieved for {}, follow through...", path);
        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
                "no handler or core retrieved for " + path);
    } catch (Throwable ex) {
        sendError(core, solrReq, ex);
        // walk the the entire cause chain to search for an Error
        Throwable t = ex;
        while (t != null) {
            if (t instanceof Error) {
                if (t != ex) {
                    logger.error(
                            "An Error was wrapped in another exception - please report complete stacktrace on SOLR-6161",
                            ex);
                }
                throw (Error) t;
            }
            t = t.getCause();
        }
        return;
    } finally {
        try {
            if (solrReq != null) {
                logger.debug("Closing out SolrRequest: {}", solrReq);
                solrReq.close();
            }
        } finally {
            try {
                if (core != null) {
                    core.close();
                }
            } finally {
                SolrRequestInfo.clearRequestInfo();
            }

        }
        MDCLoggingContext.clear();
    }
}