List of usage examples for org.apache.solr.client.solrj.util ClientUtils escapeQueryChars
public static String escapeQueryChars(String s)
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()); } }