Example usage for org.apache.solr.client.solrj.util ClientUtils escapeQueryChars

List of usage examples for org.apache.solr.client.solrj.util ClientUtils escapeQueryChars

Introduction

In this page you can find the example usage for org.apache.solr.client.solrj.util ClientUtils escapeQueryChars.

Prototype


public static String escapeQueryChars(String s) 

Source Link

Document

See: <a href="https://www.google.com/?gws_rd=ssl#q=lucene+query+parser+syntax">Lucene query parser syntax</a> for more information on Escaping Special Characters

Usage

From source file:org.sakaiproject.nakamura.message.search.MessageIndexingHandler.java

License:Apache License

/**
 * {@inheritDoc}//  w w  w .j  av a2  s  .c  o  m
 *
 * @see org.sakaiproject.nakamura.api.solr.IndexingHandler#getDeleteQueries(org.sakaiproject.nakamura.api.solr.RepositorySession,
 *      org.osgi.service.event.Event)
 */
public Collection<String> getDeleteQueries(RepositorySession repositorySession, Event event) {
    List<String> retval = Collections.emptyList();
    logger.debug("GetDelete for {} ", event);
    String path = (String) event.getProperty(IndexingHandler.FIELD_PATH);
    String resourceType = (String) event.getProperty("resourceType");
    if (CONTENT_TYPES.contains(resourceType)) {
        retval = ImmutableList.of("id:(" + ClientUtils.escapeQueryChars(path) + " OR "
                + ClientUtils.escapeQueryChars(path + AUTH_SUFFIX) + ")");
    }
    return retval;
}

From source file:org.sakaiproject.nakamura.message.search.MessageSearchPropertyProvider.java

License:Apache License

/**
 * {@inheritDoc}/*from  w  w  w .j a  v a  2 s.c  om*/
 *
 * @see org.sakaiproject.nakamura.api.search.SearchPropertyProvider#loadUserProperties(org.apache.sling.api.SlingHttpServletRequest,
 *      java.util.Map)
 */
public void loadUserProperties(SlingHttpServletRequest request, Map<String, String> propertiesMap) {
    String user = request.getRemoteUser();
    Session session = StorageClientUtils
            .adaptToSession(request.getResourceResolver().adaptTo(javax.jcr.Session.class));
    propertiesMap.put(MessageConstants.SEARCH_PROP_MESSAGESTORE,
            ClientUtils.escapeQueryChars(messagingService.getFullPathToStore(user, session)) + "*");

    RequestParameter address = request.getRequestParameter("address");
    if (address != null && !address.getString().equals("")) {
        // resolve the address by finding the authorizables.
        String addressString = address.getString();
        String storePath = messagingService.getFullPathToStore(addressString, session);
        propertiesMap.put(MessageConstants.SEARCH_PROP_MESSAGESTORE,
                ClientUtils.escapeQueryChars(storePath) + "*");
    }

    RequestParameter usersParam = request.getRequestParameter("_from");
    if (usersParam != null && !usersParam.getString().equals("")) {
        String[] users = StringUtils.split(usersParam.getString(), ',');

        StringBuilder solrQuery = new StringBuilder();

        //build solr query
        solrQuery.append("from:(");
        for (int i = 0; i < users.length; i++) {
            solrQuery.append('"').append(ClientUtils.escapeQueryChars(users[i])).append('"');

            if (i < users.length - 1) {
                solrQuery.append(" OR ");
            }
        }
        solrQuery.append(")");

        propertiesMap.put("_from", solrQuery.toString());
    }
}

From source file:org.sakaiproject.nakamura.message.search.MessageSearchPropertyProviderTest.java

License:Apache License

@Test
public void testProperties() throws Exception {
    SlingHttpServletRequest request = mock(SlingHttpServletRequest.class);

    ResourceResolver resolver = mock(ResourceResolver.class);
    JackrabbitSession jackrabbitSession = mock(JackrabbitSession.class);
    when(resolver.adaptTo(javax.jcr.Session.class)).thenReturn(jackrabbitSession);
    when(request.getResourceResolver()).thenReturn(resolver);
    when(request.getRemoteUser()).thenReturn("admin");

    Authorizable au = createAuthorizable("admin", false, true);
    UserManager um = createUserManager(null, true, au);
    when(jackrabbitSession.getUserManager()).thenReturn(um);

    // Special requests
    RequestParameter fromParam = mock(RequestParameter.class);
    when(fromParam.getString()).thenReturn("usera,userb");
    when(request.getRequestParameter("_from")).thenReturn(fromParam);

    Map<String, String> pMap = new HashMap<String, String>();

    MessageSearchPropertyProvider provider = new MessageSearchPropertyProvider();
    LiteMessagingService messagingService = new LiteMessagingServiceImpl();
    provider.messagingService = messagingService;
    provider.loadUserProperties(request, pMap);
    provider.messagingService = null;/*  w w w. j  av  a2 s  .  c o  m*/

    assertEquals(ClientUtils.escapeQueryChars(LitePersonalUtils.PATH_AUTHORIZABLE + "admin/message/") + "*",
            pMap.get(MessageConstants.SEARCH_PROP_MESSAGESTORE));

    assertEquals("from:(\"usera\" OR \"userb\")", pMap.get("_from"));
}

From source file:org.sakaiproject.nakamura.message.search.MessageSearchResponseDecorator.java

License:Apache License

public void decorateSearchResponse(SlingHttpServletRequest request, JSONWriter writer) throws JSONException {
    writer.key("unread");

    long count = 0;
    // We don't do queries for anonymous users. (Possible ddos hole).
    String userID = request.getRemoteUser();
    if (UserConstants.ANON_USERID.equals(userID)) {
        writer.value(count);//from   w w w.j  ava  2 s .  c o m
        return;
    }

    try {
        final Session session = StorageClientUtils
                .adaptToSession(request.getResourceResolver().adaptTo(javax.jcr.Session.class));
        String store = messagingService.getFullPathToStore(userID, session);
        store = ISO9075.encodePath(store);
        store = store.substring(0, store.length() - 1);
        String queryString = "path:" + ClientUtils.escapeQueryChars(store)
                + " AND resourceType:sakai/message AND type:internal AND messagebox:inbox AND read:false";
        Query query = new Query(queryString);
        SolrSearchResultSet resultSet = searchServiceFactory.getSearchResultSet(request, query, false);
        count = resultSet.getSize();
    } catch (SolrSearchException e) {
        LOGGER.error(e.getMessage());
    } finally {
        writer.value(count);
    }
}

From source file:org.sakaiproject.nakamura.message.search.MessageSparseSearchPropertyProvider.java

License:Apache License

/**
 * {@inheritDoc}//from ww  w .jav  a2 s . c o m
 *
 * @see org.sakaiproject.nakamura.api.search.SearchPropertyProvider#loadUserProperties(org.apache.sling.api.SlingHttpServletRequest,
 *      java.util.Map)
 */
public void loadUserProperties(SlingHttpServletRequest request, Map<String, String> propertiesMap) {
    String user = request.getRemoteUser();
    Session session = StorageClientUtils
            .adaptToSession(request.getResourceResolver().adaptTo(javax.jcr.Session.class));
    final String resourceType = request.getResource().getResourceType();
    final boolean solrSearchType = "sakai/solr-search".equals(resourceType);
    String fullPathToStore = ClientUtils.escapeQueryChars(messagingService.getFullPathToStore(user, session));
    propertiesMap.put(MessageConstants.SEARCH_PROP_MESSAGESTORE, fullPathToStore);

    RequestParameter address = request.getRequestParameter("address");
    if (address != null && !address.getString().equals("")) {
        // resolve the address by finding the authorizables.
        String addressString = address.getString();
        String storePath = messagingService.getFullPathToStore(addressString, session);
        propertiesMap.put(MessageConstants.SEARCH_PROP_MESSAGESTORE,
                ClientUtils.escapeQueryChars(storePath) + "*");
    }

    String[] categoryStrings = request.getParameterValues("category");
    if (categoryStrings != null && !categoryStrings[0].equals("") && !categoryStrings[0].equals("*")) {
        final StringBuilder categoryClauseBuffer = new StringBuilder();
        if (solrSearchType) {
            categoryClauseBuffer.append(" AND category:(");
        } else {
            categoryClauseBuffer.append(" AND sakai\\:category:(");
        }
        String[] commaSeparatedTerms = categoryStrings[0].split(",");
        categoryClauseBuffer.append(commaSeparatedTerms[0]);
        for (int h = 0; h < categoryStrings.length; h++) {
            commaSeparatedTerms = categoryStrings[h].split(",");
            int starter = 0;
            if (h == 0) {
                starter++;
            }
            for (int i = starter; i < commaSeparatedTerms.length; i++) {
                categoryClauseBuffer.append(" OR ").append(commaSeparatedTerms[i]);
            }
        }
        categoryClauseBuffer.append(")");
        propertiesMap.put("_categoryClause", categoryClauseBuffer.toString());
    } else {
        propertiesMap.put("_categoryClause", "");
    }

    RequestParameter usersParam = request.getRequestParameter("_from");
    if (usersParam != null && !usersParam.getString().equals("")) {
        String[] users = StringUtils.split(usersParam.getString(), ',');

        StringBuilder solrQuery = new StringBuilder();

        //build solr query
        solrQuery.append("from:(");
        for (int i = 0; i < users.length; i++) {
            solrQuery.append('"').append(ClientUtils.escapeQueryChars(users[i])).append('"');

            if (i < users.length - 1) {
                solrQuery.append(" OR ");
            }
        }
        solrQuery.append(")");

        propertiesMap.put("_from", solrQuery.toString());
    }
}

From source file:org.sakaiproject.nakamura.message.search.MessageSparseSearchPropertyProviderTest.java

License:Apache License

@Test
public void testProperties() throws Exception {
    SlingHttpServletRequest request = mock(SlingHttpServletRequest.class);

    ResourceResolver resolver = mock(ResourceResolver.class);
    javax.jcr.Session jcrSession = mock(javax.jcr.Session.class,
            withSettings().extraInterfaces(SessionAdaptable.class));
    Session session = mock(Session.class);

    when(request.getResourceResolver()).thenReturn(resolver);
    when(resolver.adaptTo(javax.jcr.Session.class)).thenReturn(jcrSession);
    when(((SessionAdaptable) jcrSession).getSession()).thenReturn(session);

    when(request.getRemoteUser()).thenReturn("admin");

    AuthorizableManager am = mock(AuthorizableManager.class);
    Authorizable au = mock(Authorizable.class);
    when(am.findAuthorizable("admin")).thenReturn(au);
    when(session.getAuthorizableManager()).thenReturn(am);

    // Special requests
    RequestParameter fromParam = mock(RequestParameter.class);
    when(fromParam.getString()).thenReturn("usera,userb");
    when(request.getRequestParameter("_from")).thenReturn(fromParam);

    Resource mockResource = mock(Resource.class);
    when(mockResource.getResourceType()).thenReturn("sakai/solr-search");
    when(request.getResource()).thenReturn(mockResource);

    Map<String, String> pMap = new HashMap<String, String>();

    MessageSparseSearchPropertyProvider provider = new MessageSparseSearchPropertyProvider();
    LiteMessagingService messagingService = new LiteMessagingServiceImpl();
    provider.messagingService = messagingService;
    provider.loadUserProperties(request, pMap);
    provider.messagingService = null;//from www .ja  v  a2 s .c om

    assertEquals(ClientUtils.escapeQueryChars(LitePersonalUtils.PATH_AUTHORIZABLE + "admin/message/"),
            pMap.get(MessageConstants.SEARCH_PROP_MESSAGESTORE));

    assertEquals("from:(\"usera\" OR \"userb\")", pMap.get("_from"));
}

From source file:org.sakaiproject.nakamura.pages.search.PageContentIndexingHandler.java

License:Apache License

/**
 * {@inheritDoc}/*from   w w w  .  j a  v  a  2  s  .c  om*/
 * 
 * @see org.sakaiproject.nakamura.api.solr.IndexingHandler#getDeleteQueries(org.sakaiproject.nakamura.api.solr.RepositorySession,
 *      org.osgi.service.event.Event)
 */
public Collection<String> getDeleteQueries(RepositorySession respositorySession, Event event) {
    LOGGER.debug("GetDelete for {} ", event);
    String path = (String) event.getProperty(FIELD_PATH);
    return ImmutableList.of("id:" + ClientUtils.escapeQueryChars(path));
}

From source file:org.sakaiproject.nakamura.pages.search.PageSearchPropertyProvider.java

License:Apache License

public void loadUserProperties(SlingHttpServletRequest request, Map<String, String> propertiesMap) {
    LOG.info("loading properties.");
    RequestParameter pathParam = request.getRequestParameter("path");
    RequestParameter[] properties = request.getRequestParameters("properties");
    RequestParameter[] values = request.getRequestParameters("values");
    RequestParameter[] operators = request.getRequestParameters("operators");

    String path = request.getResource().getPath();
    String filter = "";

    if (properties != null && values != null && operators != null && properties.length == values.length
            && values.length == operators.length) {
        for (int i = 0; i < properties.length; i++) {
            String op = operators[i].getString();
            if (op.equals(">") || op.equals("=") || op.equals("<")) {
                filter += " AND " + properties[i].getString() + operators[i].getString() + '"'
                        + values[i].getString() + '"';
            }/* ww w . ja va 2s .  c  o  m*/
        }
    }

    if (pathParam != null) {
        path = pathParam.getString();
    }

    if (path.endsWith("/")) {
        path = path.substring(0, path.length() - 1);
    }

    propertiesMap.put("_filter", ClientUtils.escapeQueryChars(filter));
    propertiesMap.put("_path", ClientUtils.escapeQueryChars(path));
}

From source file:org.sakaiproject.nakamura.search.processors.GroupMembersSearchPropertyProvider.java

License:Apache License

/**
 * {@inheritDoc}/*w  w w. ja v  a 2 s.c o m*/
 *
 * @see org.sakaiproject.nakamura.api.search.SearchPropertyProvider#loadUserProperties(org.apache.sling.api.SlingHttpServletRequest,
 *      java.util.Map)
 */
public void loadUserProperties(SlingHttpServletRequest request, Map<String, String> propertiesMap) {
    try {
        Session session = StorageClientUtils
                .adaptToSession(request.getResourceResolver().adaptTo(javax.jcr.Session.class));
        AuthorizableManager am = session.getAuthorizableManager();

        if (request.getParameter("q") == null) {
            throw new IllegalArgumentException("Must provide 'q' parameter to use for search.");
        }

        // get the request group name
        String groupName = request.getParameter("group");
        if (groupName == null) {
            throw new IllegalArgumentException("Must provide group to search within.");
        }

        // get the authorizable associated to the requested group name
        Group group = (Group) am.findAuthorizable(groupName);
        if (group == null) {
            throw new IllegalArgumentException("Unable to find group [" + groupName + "]");
        }

        LinkedHashSet<String> memberIds = new LinkedHashSet<String>();

        // collect the declared members of the requested group
        addDeclaredMembers(memberIds, group);

        boolean includeSelf = Boolean.parseBoolean(request.getParameter("includeSelf"));
        String currentUser = request.getRemoteUser();
        if (!includeSelf) {
            memberIds.remove(currentUser);
        }

        // 900 is the number raydavis said we should split on. This can be tuned as needed.
        if (memberIds.size() > 900) {
            // more than the threshold; pass along for post processing
            request.setAttribute("memberIds", memberIds);
        } else {
            // update the query to filter before writing nodes

            // start building solr query
            StringBuilder solrQuery = new StringBuilder("name:(");

            // add member id's
            Iterator<String> members = memberIds.iterator();
            while (members.hasNext()) {
                String memberId = members.next();
                solrQuery.append("'");
                solrQuery.append(ClientUtils.escapeQueryChars(memberId));
                solrQuery.append("'");

                if (members.hasNext()) {
                    solrQuery.append(" OR ");
                }
            }

            // finish building solr query
            solrQuery.append(")");

            propertiesMap.put("_groupQuery", solrQuery.toString());
        }
    } catch (StorageClientException e) {
        logger.error(e.getMessage(), e);
    } catch (AccessDeniedException e) {
        logger.error(e.getMessage(), e);
    }
}

From source file:org.sakaiproject.nakamura.search.processors.TagMatchSearchPropertyProvider.java

License:Apache License

/**
 * {@inheritDoc}/*from  w w  w  .ja  v a 2  s .c om*/
 *
 * @see org.sakaiproject.nakamura.api.search.SearchPropertyProvider#loadUserProperties(org.apache.sling.api.SlingHttpServletRequest,
 *      java.util.Map)
 */
public void loadUserProperties(SlingHttpServletRequest request, Map<String, String> propertiesMap) {
    javax.jcr.Session session = null;
    try {
        //      javax.jcr.Session session = request.getResourceResolver().adaptTo(javax.jcr.Session.class);
        session = repository.loginAdministrative(null);

        StringBuilder tagClause = new StringBuilder();
        String q = request.getParameter("q");
        if (!StringUtils.isBlank(q)) {
            if (q.endsWith("*")) {
                q = q.substring(0, q.length() - 1);
            }

            String statement = "//element(*)MetaData[@sling:resourceType='sakai/tag'";
            // KERN-1917, KERN-1918
            if (!StringUtils.isBlank(q)) {
                tagClause.append(" OR tag:(").append(SearchUtil.escapeString(q, SOLR)).append(")");
                statement += " and jcr:like(@sakai:tag-name,'%" + ISO9075.encode(q) + "%')";
            }
            statement += "]";

            QueryResult result = JcrResourceUtil.query(session, statement, "xpath");
            RowIterator rows = result.getRows();

            if (rows.hasNext()) {
                tagClause.append(" OR taguuid:(");
                String sep = "";
                while (rows.hasNext()) {
                    tagClause.append(sep);
                    Row row = rows.nextRow();
                    String uuid = row.getNode().getIdentifier();
                    tagClause.append(ClientUtils.escapeQueryChars(uuid));
                    sep = " OR ";
                }
                tagClause.append(")");
            }
        }

        propertiesMap.put("_taguuids", tagClause.toString());
    } catch (RepositoryException e) {
        logger.error("failed to add search properties for tags", e);
    } finally {
        if (session != null) {
            session.logout();
        }
    }
}