private void writeProfileMap( javax.jcr.Session jcrSession, AuthorizableManager um, ExtendedJSONWriter writer, String user, boolean detailed) throws JSONException, AccessDeniedException, StorageClientException, RepositoryException { Authorizable au = um.findAuthorizable(user); if (au != null) { ValueMap profileMap; if (detailed) { profileMap = profileService.getProfileMap(au, jcrSession); } else { profileMap = new ValueMapDecorator(basicUserInfoService.getProperties(au)); } if (profileMap != null) { writer.valueMap(profileMap); } } else { writer.object(); writer.key("userid"); writer.value(user); writer.endObject(); } }
/** * Same as writeResults logic, but counts number of results iterated over. * * @param request * @param write * @param iterator * @return Set containing all unique paths processed. * @throws JSONException */ public Set<String> writeResultsInternal( SlingHttpServletRequest request, JSONWriter write, Iterator<Result> iterator) throws JSONException { final Set<String> uniquePaths = new HashSet<String>(); final Integer iDepth = (Integer) request.getAttribute("depth"); int depth = 0; if (iDepth != null) { depth = iDepth.intValue(); } try { javax.jcr.Session jcrSession = request.getResourceResolver().adaptTo(javax.jcr.Session.class); final Session session = StorageClientUtils.adaptToSession(jcrSession); while (iterator.hasNext()) { final Result result = iterator.next(); uniquePaths.add(result.getPath()); try { if ("authorizable".equals(result.getFirstValue("resourceType"))) { AuthorizableManager authManager = session.getAuthorizableManager(); Authorizable auth = authManager.findAuthorizable((String) result.getFirstValue("id")); if (auth != null) { write.object(); ValueMap map = profileService.getProfileMap(auth, jcrSession); ExtendedJSONWriter.writeValueMapInternals(write, map); write.endObject(); } } else { String contentPath = result.getPath(); final Content content = session.getContentManager().get(contentPath); if (content != null) { handleContent(content, session, write, depth); } else { LOGGER.debug("Found null content item while writing results [{}]", contentPath); } } } catch (AccessDeniedException e) { // do nothing } catch (RepositoryException e) { throw new JSONException(e); } } } catch (StorageClientException e) { throw new JSONException(e); } return uniquePaths; }
/** * {@inheritDoc} * * @see * org.apache.sling.api.servlets.SlingSafeMethodsServlet#doGet(org.apache.sling.api.SlingHttpServletRequest, * org.apache.sling.api.SlingHttpServletResponse) */ @Override protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { Authorizable authorizable = null; Resource resource = request.getResource(); if (resource != null) { authorizable = resource.adaptTo(Authorizable.class); } if (authorizable == null || !authorizable.isGroup()) { response.sendError(HttpServletResponse.SC_NO_CONTENT, "Couldn't find group"); return; } Group group = (Group) authorizable; List<String> selectors = Arrays.asList(request.getRequestPathInfo().getSelectors()); ExtendedJSONWriter writer = new ExtendedJSONWriter(response.getWriter()); writer.setTidy(selectors.contains("tidy")); // Get the sorting order, default is ascending or the natural sorting order (which is // null for a TreeMap.) Comparator<String> comparator = null; String order = "ascending"; if (request.getRequestParameter("sortOrder") != null) { order = request.getRequestParameter("sortOrder").getString(); if (order.equals("descending")) { comparator = Collections.reverseOrder(); } } try { response.setContentType("application/json"); TreeMap<String, Authorizable> map = null; if (selectors.contains("managers")) { map = getManagers(request, group, comparator); } else { // Members is the default. map = getMembers(request, group, comparator); } // Do some paging. long items = (request.getParameter(ITEMS) != null) ? Long.parseLong(request.getParameter(ITEMS)) : 25; long page = (request.getParameter(PAGE) != null) ? Long.parseLong(request.getParameter(PAGE)) : 0; if (page < 0) { page = 0; } if (items < 0) { items = 25; } Iterator<Entry<String, Authorizable>> iterator = getInPlaceIterator(request, map, items, page); // Write the whole lot out. Session session = request.getResourceResolver().adaptTo(Session.class); writer.array(); int i = 0; while (iterator.hasNext() && i < items) { Entry<String, Authorizable> entry = iterator.next(); Authorizable au = entry.getValue(); ValueMap profile; if (selectors.contains("detailed")) { profile = profileService.getProfileMap(au, session); } else { profile = profileService.getCompactProfileMap(au, session); } if (profile != null) { writer.valueMap(profile); i++; } else { // profile wasn't found. safe to ignore and not include the group logger.info("Profile not found for " + au.getID()); } } writer.endArray(); } catch (RepositoryException e) { response.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Failed to retrieve members/managers."); return; } catch (JSONException e) { response.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Failed to build a proper JSON output."); return; } }