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.connections.search.RelatedContactsSearchBatchResultProcessor.java

License:Apache License

/**
 * {@inheritDoc}//  w  ww . j ava 2s.  co  m
 * 
 * @see org.sakaiproject.nakamura.api.search.solr.SolrSearchBatchResultProcessor#writeResults(org.apache.sling.api.SlingHttpServletRequest,
 *      org.apache.sling.commons.json.io.JSONWriter, java.util.Iterator)
 */
public void writeResults(final SlingHttpServletRequest request, final JSONWriter writer,
        final Iterator<Result> iterator) throws JSONException {
    long startTicks = System.currentTimeMillis();
    final Session session = StorageClientUtils
            .adaptToSession(request.getResourceResolver().adaptTo(javax.jcr.Session.class));
    final String user = session.getUserId();
    final List<String> connectedUsers = connectionManager.getConnectedUsers(request, session.getUserId(),
            ConnectionState.ACCEPTED);
    final long nitems = SolrSearchUtil.longRequestParameter(request, PARAMS_ITEMS_PER_PAGE,
            DEFAULT_PAGED_ITEMS);
    // TODO add proper paging support
    // final long page = SolrSearchUtil.longRequestParameter(request, PARAMS_PAGE, 0);

    final Set<String> processedUsers = new HashSet<String>();
    try {
        final AuthorizableManager authMgr = session.getAuthorizableManager();
        final Authorizable auth = authMgr.findAuthorizable(user);
        int counter = 0;
        while (iterator.hasNext() && processedUsers.size() < nitems) {
            final Result result = iterator.next();
            final String resourceType = (String) result.getFirstValue("resourceType");
            if (ConnectionConstants.SAKAI_CONTACT_RT.equals(resourceType)) {
                renderConnection(session, authMgr, writer, result, connectedUsers, processedUsers);
            } else if (AUTHORIZABLE_RT.equals(resourceType)) {
                renderAuthorizable(session, authMgr, writer, result, connectedUsers, processedUsers);
            } else {
                LOG.warn("TODO: add missing handler for this resource type: {}: {}", result.getPath(),
                        result.getProperties());
            }
            counter++;
        }
        if (LOG.isDebugEnabled())
            LOG.debug("writeResults() primary search result count: " + counter);
        long firstIterationTicks = System.currentTimeMillis();
        long secondIterationTicks = 0L;
        if (LOG.isDebugEnabled())
            LOG.debug("writeResults() first iteration took {} seconds",
                    new Object[] { (float) (firstIterationTicks - startTicks) / 1000 });
        if (processedUsers.size() < nitems) {
            // TODO migrate to part of the primary solr query - this was a quick solution
            /* Add people that are a member of groups I'm a member of */
            final Set<String> relatedUsers = new HashSet<String>();
            final String[] principals = auth.getPrincipals();
            if (principals != null) {
                // process the groups randomly because we might hit page size any time
                final List<String> randomPrincipals = Arrays.asList(principals);
                Collections.shuffle(randomPrincipals);
                for (int i = 0; i < randomPrincipals.size() && processedUsers.size() < nitems; i++) {
                    final Group group = (Group) authMgr.findAuthorizable(randomPrincipals.get(i));
                    if (group != null) {
                        final String[] members = group.getMembers();
                        if (members != null) {
                            relatedUsers.addAll(Arrays.asList(members));
                        }
                    }
                }
                // randomize the list because we want different people showing up each time
                // but limit the size of the list to the number required by spec - significant optimization
                final List<String> relatedPeopleFromGroupMembers = makeRandomList(relatedUsers, nitems);
                for (final String peep : relatedPeopleFromGroupMembers) {
                    renderContact(peep, session, authMgr, writer, connectedUsers, processedUsers);
                }
            }
            secondIterationTicks = System.currentTimeMillis();
            if (LOG.isDebugEnabled())
                LOG.debug("writeResults() second iteration took {} seconds",
                        new Object[] { (float) (secondIterationTicks - firstIterationTicks) / 1000 });
        }
        if (processedUsers.size() < nitems) {
            /* Add some random people to feed */

            // query to find random people
            // TODO add some randomness; probably through solr.RandomSortField
            final StringBuilder sourceQuery = new StringBuilder("resourceType:");
            sourceQuery.append(AUTHORIZABLE_RT);
            sourceQuery.append(" AND type:u AND id:([* TO *] NOT ");
            sourceQuery.append(ClientUtils.escapeQueryChars(user));
            sourceQuery.append(")");
            final Query query = new Query(Query.SOLR, sourceQuery.toString(), SOURCE_QUERY_OPTIONS);

            SolrSearchResultSet rs = null;
            try {
                rs = defaultSearchProcessor.getSearchResultSet(request, query);
            } catch (SolrSearchException e) {
                LOG.error(e.getLocalizedMessage(), e);
                throw new IllegalStateException(e);
            }
            if (rs != null) {
                final Iterator<Result> i = rs.getResultSetIterator();
                while (i.hasNext() && processedUsers.size() <= nitems) {
                    final Result result = i.next();
                    final String path = (String) result.getFirstValue("path");
                    if (processedUsers.contains(path)) {
                        // we have already painted this result
                        continue;
                    }
                    final User u = (User) authMgr.findAuthorizable(path);
                    if (u != null) {
                        renderContact(u.getId(), session, authMgr, writer, connectedUsers, processedUsers);
                    } else {
                        // fail quietly in this edge case
                        LOG.debug("Contact not found: {}", path);
                    }
                }
            }
            long thirdIterationTicks = System.currentTimeMillis();
            if (LOG.isDebugEnabled())
                LOG.debug("writeResults() third iteration took {} seconds",
                        new Object[] { (float) (thirdIterationTicks - secondIterationTicks) / 1000 });
        }

        if (processedUsers.size() < VOLUME) {
            LOG.debug(
                    "Did not meet functional specification. There should be at least {} results; actual size was: {}",
                    VOLUME, processedUsers.size());
        }
    } catch (AccessDeniedException e) {
        // quietly swallow access denied
        LOG.debug(e.getLocalizedMessage(), e);
    } catch (StorageClientException e) {
        throw new IllegalStateException(e);
    }
    long endTicks = System.currentTimeMillis();
    if (LOG.isDebugEnabled())
        LOG.debug("writeResults() took {} seconds", new Object[] { (float) (endTicks - startTicks) / 1000 });
}

From source file:org.sakaiproject.nakamura.connections.search.RelatedContactsSearchPropertyProvider.java

License:Apache License

/**
 * {@inheritDoc}//  w  w w . j  a v a2  s. c  o  m
 * 
 * @see org.sakaiproject.nakamura.api.search.solr.SolrSearchPropertyProvider#loadUserProperties(org.apache.sling.api.SlingHttpServletRequest,
 *      java.util.Map)
 */
public void loadUserProperties(final SlingHttpServletRequest request, final Map<String, String> propertiesMap) {

    /* find source contacts to match against */
    try {
        final String me = request.getRemoteUser();
        final Set<String> relatedConnectionPaths = new HashSet<String>();

        final Session session = StorageClientUtils
                .adaptToSession(request.getResourceResolver().adaptTo(javax.jcr.Session.class));
        final AuthorizableManager authorizableManager = session.getAuthorizableManager();
        final Set<String> allTags = new HashSet<String>();
        final String[] myTags = (String[]) authorizableManager.findAuthorizable(me).getProperty("sakai:tags");
        if (myTags != null) {
            allTags.addAll(Arrays.asList(myTags));
        }
        final List<String> myConnections = connectionManager.getConnectedUsers(request, me,
                ConnectionState.ACCEPTED);
        if (myConnections != null) {
            for (final String myConnection : myConnections) {
                String connectionPath = ClientUtils
                        .escapeQueryChars(ConnectionUtils.getConnectionPathBase(myConnection));
                if (connectionPath.startsWith("/")) {
                    connectionPath = connectionPath.substring(1);
                }
                relatedConnectionPaths.add(connectionPath);
            }
        }

        if (relatedConnectionPaths.size() < 1) {
            // to prevent solr parse errors
            relatedConnectionPaths.add(String.valueOf(false));
        }
        final String connectionPath = Joiner.on(" OR ").join(relatedConnectionPaths);
        propertiesMap.put(SEARCH_PROP_CONNECTIONSTORE, connectionPath);

        if (allTags.isEmpty()) { // to prevent solr parse errors
            allTags.add(String.valueOf(false));
        }
        propertiesMap.put("tags", Joiner.on(" OR ").join(allTags));

    } catch (AccessDeniedException e) {
        LOG.error(e.getLocalizedMessage(), e);
    } catch (StorageClientException e) {
        LOG.error(e.getLocalizedMessage(), e);
    }
}

From source file:org.sakaiproject.nakamura.discussion.DiscussionManagerImpl.java

License:Apache License

private String expandHomeDirectory(String queryString) {
    Matcher homePathMatcher = homePathPattern.matcher(queryString);
    if (homePathMatcher.find()) {
        String username = homePathMatcher.group(3);
        String homePrefix = homePathMatcher.group(1);
        String userHome = LitePersonalUtils.getHomePath(username);
        userHome = ClientUtils.escapeQueryChars(userHome);
        String homePath = homePrefix + userHome + "/";
        String prefix = "";
        if (homePathMatcher.start() > 0) {
            prefix = queryString.substring(0, homePathMatcher.start());
        }//from   w ww  .j  a v  a  2  s  . c  o m
        String suffix = queryString.substring(homePathMatcher.end());
        queryString = prefix + homePath + suffix;
    }
    return queryString;
}

From source file:org.sakaiproject.nakamura.discussion.searchresults.CommentSearchPropertyProvider.java

License:Apache License

/**
 * @see org.sakaiproject.nakamura.api.search.SearchPropertyProvider#loadUserProperties(org.apache.sling.api.SlingHttpServletRequest, java.util.Map)
 *//*from   w  ww. j av a2s.  c o m*/
public void loadUserProperties(SlingHttpServletRequest request, Map<String, String> propertiesMap) {
    RequestParameter rp = request.getRequestParameter("path");
    if (rp != null) {
        String resourcePath = rp.getString();
        ResourceResolver resourceResolver = request.getResourceResolver();
        Resource pooledResource = resourceResolver.getResource(resourcePath);
        if (pooledResource != null) {
            Content pooledContent = pooledResource.adaptTo(Content.class);
            String safePath = ClientUtils.escapeQueryChars(pooledContent.getPath()) + "/*";
            propertiesMap.put("path", safePath);
        }
    }
}

From source file:org.sakaiproject.nakamura.discussion.searchresults.DiscussionInitialPostPropertyProvider.java

License:Apache License

public void loadUserProperties(SlingHttpServletRequest request, Map<String, String> propertiesMap) {

    RequestParameter pathParam = request.getRequestParameter("path");
    if (pathParam != null) {
        String resourcePath = pathParam.getString();
        ResourceResolver resourceResolver = request.getResourceResolver();
        Resource messageResource = resourceResolver.getResource(resourcePath);
        if (messageResource != null) {
            Content messageContent = messageResource.adaptTo(Content.class);
            String safePath = ClientUtils.escapeQueryChars(messageContent.getPath());
            propertiesMap.put("path", safePath);
        }/*from  ww w . j  a va2 s.c o  m*/
    }

}

From source file:org.sakaiproject.nakamura.discussion.searchresults.DiscussionThreadedPropertyProvider.java

License:Apache License

/**
 * {@inheritDoc}//from   www .j av  a2  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) {
    final String path = request.getParameter("path");
    if (path != null) {
        final String homePath = PathUtils.toUserContentPath(path) + "/";
        // we have to use a path hash here because a discussion thread has a hashed
        // messagestore value from LiteDiscussionMessageTransport@146
        final String pathHash = StorageClientUtils.insecureHash(homePath);
        propertiesMap.put(MessageConstants.SEARCH_PROP_MESSAGEROOT,
                "(" + pathHash + " OR " + ClientUtils.escapeQueryChars(homePath) + ")");
    }
}

From source file:org.sakaiproject.nakamura.files.pool.ContentPoolSearchPropertyProvider.java

License:Apache License

/**
 * {@inheritDoc}/*from  w w  w .j  a  va 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 userID = request.getRemoteUser();

    Session session = StorageClientUtils
            .adaptToSession(request.getResourceResolver().adaptTo(javax.jcr.Session.class));
    if (!UserConstants.ANON_USERID.equals(userID)) {
        addMyGroups(session, propertiesMap);
    }

    if (request.getParameter("group") != null) {
        propertiesMap.put("group", ClientUtils.escapeQueryChars(request.getParameter("group")));
    }

}

From source file:org.sakaiproject.nakamura.files.pool.ContentPoolSearchPropertyProvider.java

License:Apache License

/**
 * Gets all the declared groups for a user and adds an xpath constraint for both
 * managers and viewers to the map.//from  ww w.  j  av  a  2 s.  c  o  m
 *
 * @param session
 * @param propertiesMap
 */
protected void addMyGroups(Session session, Map<String, String> propertiesMap) {
    String sessionUserId = session.getUserId();

    try {
        AuthorizableManager authMgr = session.getAuthorizableManager();
        Authorizable auth = authMgr.findAuthorizable(sessionUserId);

        // create the manager and viewer query parameters
        String userId = ClientUtils.escapeQueryChars(sessionUserId);
        StringBuilder managers = new StringBuilder("AND manager:(").append(userId);
        StringBuilder viewers = new StringBuilder("AND viewer:(").append(userId);

        // add groups to the parameters
        List<String> groups = new ArrayList<String>();
        groups.addAll(Arrays.asList(auth.getPrincipals()));
        // KERN-1634 'everyone' should not be considered a group
        groups.remove("everyone");
        for (String group : groups) {
            String groupId = ClientUtils.escapeQueryChars(group);
            managers.append(" OR ").append(groupId);
            viewers.append(" OR ").append(groupId);
        }

        // cap off the parameters
        managers.append(")");
        viewers.append(")");

        // add properties for query templates
        propertiesMap.put("_meManagerGroups", managers.toString());
        propertiesMap.put("_meViewerGroups", viewers.toString());
    } catch (StorageClientException e) {
        LOGGER.error("Could not get the groups for user [{}].", sessionUserId, e);
    } catch (AccessDeniedException e) {
        LOGGER.error("Could not get the groups for user [{}].", sessionUserId, e);
    }
}

From source file:org.sakaiproject.nakamura.files.pool.ContentPoolSparseSearchPropertyProvider.java

License:Apache License

/**
 * Gets all the declared groups for a user and adds an query constraint for both
 * managers and viewers to the map.// www.  j  a v  a2s  .  c  o  m
 *
 * @param session
 * @param propertiesMap
 */
protected void addMyGroups(Session session, Map<String, String> propertiesMap) {
    String sessionUserId = session.getUserId();

    try {
        AuthorizableManager authMgr = session.getAuthorizableManager();
        Authorizable auth = authMgr.findAuthorizable(sessionUserId);

        // create the manager and viewer query parameters
        String userId = ClientUtils.escapeQueryChars(sessionUserId);
        StringBuilder managers = new StringBuilder("AND manager:(").append(userId);
        StringBuilder viewers = new StringBuilder("AND viewer:(").append(userId);

        // add groups to the parameters
        String[] groups = auth.getPrincipals();
        for (String group : groups) {
            String groupId = ClientUtils.escapeQueryChars(group);
            managers.append(" OR ").append(groupId);
            viewers.append(" OR ").append(groupId);
        }

        // cap off the parameters
        managers.append(")");
        viewers.append(")");

        // add properties for query templates
        propertiesMap.put("_meManagerGroups", managers.toString());
        propertiesMap.put("_meViewerGroups", viewers.toString());
    } catch (StorageClientException e) {
        LOGGER.error("Could not get the groups for user [{}].", sessionUserId, e);
    } catch (AccessDeniedException e) {
        LOGGER.error("Could not get the groups for user [{}].", sessionUserId, e);
    }
}

From source file:org.sakaiproject.nakamura.files.pool.GetRelatedContentServlet.java

License:Apache License

@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
        throws ServletException, IOException {
    LOGGER.info("GETTING RELATED CONTENT ================================================ ");
    // Query should look like:
    // //element(*,
    // sakai:pooled-content)[(@sakai:tag-uuid='6c589c99-4a08-4a51-8f09-2960b36bec6f'
    // or @sakai:tag-uuid='506edc80-ad50-4bb3-abe8-aa5c72e65888') and
    // (@sakai:permissions='public'
    // or @sakai:permissions='everyone')] order by @jcr:score descending
    final String sakaiPooledContent = ClientUtils.escapeQueryChars("sakai/pooled-content");
    StringBuilder sb = new StringBuilder("resourceType:");
    sb.append(sakaiPooledContent);/*from   w w  w. jav  a 2  s . com*/
    sb.append(" AND ");
    Set<String> selectors = ImmutableSet.copyOf(request.getRequestPathInfo().getSelectors());

    boolean publicSearch = selectors.contains(POOLED_CONTENT_PUBLIC_RELATED_SELECTOR);

    // Collect tags to search against.
    Resource resource = request.getResource();
    Content content = resource.adaptTo(Content.class);
    ContentManager contentManager = resource.adaptTo(ContentManager.class);
    try {
        ExtendedJSONWriter writer = new ExtendedJSONWriter(response.getWriter());
        writer.setTidy(selectors.contains("tidy"));
        writer.array();

        if (content.hasProperty(SAKAI_TAGS)) {
            String nodePath = content.getPath();
            Map<String, Object> properties = content.getProperties();
            Set<String> tags = Sets.newHashSet();
            if (properties.containsKey(SAKAI_TAGS)) {
                String[] contentTags = (String[]) properties.get(SAKAI_TAGS);
                for (String contentTag : contentTags) {
                    tags.add(ClientUtils.escapeQueryChars(contentTag));
                }
            }

            if (tags.size() > 0) {
                sb.append("tag:(").append(StringUtils.join(tags, " OR ")).append(")");
            }
            Query query = new Query(sb.toString());
            LOGGER.info("Submitting Query {} ", query);
            SolrSearchResultSet resultSet = solrSearchServiceFactory.getSearchResultSet(request, query,
                    publicSearch);
            Iterator<Result> iterator = resultSet.getResultSetIterator();
            int count = 0;
            while ((count < MAX_RESULTS) && iterator.hasNext()) {
                Result result = iterator.next();
                String path = result.getPath();
                if (!nodePath.equals(path)) {
                    try {
                        Content contentResult = contentManager.get(path);
                        writer.object();
                        ExtendedJSONWriter.writeNodeContentsToWriter(writer, contentResult);
                        writer.endObject();
                        count++;
                    } catch (StorageClientException e) {
                        LOGGER.error("Error getting related content for " + request.getPathTranslated(), e);
                    } catch (AccessDeniedException e) {
                        LOGGER.info("Denied access for related content to  " + request.getPathTranslated(), e);
                    }
                }
            }
        } else {
            LOGGER.info("No Tags in {} ", content.getProperties());
        }
        writer.endArray();
    } catch (JSONException e) {
        LOGGER.error("Error writing related content for " + request.getPathTranslated(), e);
        response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
    } catch (SolrSearchException e) {
        LOGGER.error("Error writing related content for " + request.getPathTranslated(), e);
        response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
    }
}