/** * Copyright ( C ) 2012 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.platform.common.space.rest; import org.exoplatform.commons.utils.ListAccess; import org.exoplatform.container.PortalContainer; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.rest.resource.ResourceContainer; import org.exoplatform.social.core.space.SpaceFilter; import org.exoplatform.social.core.space.model.Space; import org.exoplatform.social.core.space.spi.SpaceService; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.QueryParam; import javax.ws.rs.core.CacheControl; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import org.json.JSONException; import org.json.JSONObject; import java.util.*; /** * @author <a href="kmenzli@exoplatform.com">kmenzli</a> */ @Path("/space") public class SpaceRestServiceImpl implements ResourceContainer { private static final Log LOG = ExoLogger.getLogger(SpaceRestServiceImpl.class); private final SpaceService spaceService; private final CacheControl cacheControl; private static final int MAX_LOADED_SPACES_BY_REQUEST = 20; ListAccess<Space> listAccess; public SpaceRestServiceImpl(SpaceService spaceService) { this.spaceService = spaceService; cacheControl = new CacheControl(); cacheControl.setNoCache(true); cacheControl.setNoStore(true); } @GET @Path("/user/searchSpace/") public Response searchSpaces(@QueryParam("keyword") String keyword, @QueryParam("fields") String fields, @Context SecurityContext sc) { StringBuffer baseSpaceURL = null; List<Space> spaces = new ArrayList<Space>(); try { List<Space> alphabeticallySort = new ArrayList<Space>(); String userId = sc.getUserPrincipal().getName(); if (userId == null) { return Response.status(500).cacheControl(cacheControl).build(); } if ((keyword == null) || (keyword.equals(""))) { listAccess = spaceService.getMemberSpacesByFilter(userId, null); } else { listAccess = spaceService.getMemberSpacesByFilter(userId, new SpaceFilter(keyword)); } //--- List of searchedSpaces List<Space> spacesSearched = Arrays.asList(listAccess.load(0, MAX_LOADED_SPACES_BY_REQUEST)); //--- List of spaces sorted by access/alphabet ListAccess<Space> allSpacesSorted = spaceService.getVisitedSpaces(userId, null); //--- Convert user spaces to List collection spaces = Arrays.asList(allSpacesSorted.load(0,MAX_LOADED_SPACES_BY_REQUEST)); List<Object> sortedSearchedSpaces = new ArrayList<Object>(); for (Space space : spaces) { baseSpaceURL = new StringBuffer(); baseSpaceURL.append(PortalContainer.getCurrentPortalContainerName()+ "/g/:spaces:") ; String groupId = space.getGroupId(); String permanentSpaceName = groupId.split("/")[2]; if ((filterSpace(space.getId(), spacesSearched))) { if (permanentSpaceName.equals(space.getPrettyName())) { baseSpaceURL.append(permanentSpaceName) ; baseSpaceURL.append("/"); baseSpaceURL.append(permanentSpaceName) ; } else { baseSpaceURL.append(space.getPrettyName()) ; baseSpaceURL.append("/"); baseSpaceURL.append(space.getPrettyName()) ; } space.setUrl(baseSpaceURL.toString()); sortedSearchedSpaces.add(extractObject(space, fields)); } } return Response.ok(sortedSearchedSpaces, "application/json").cacheControl(cacheControl).build(); } catch (Exception ex) { if (LOG.isWarnEnabled()) { LOG.warn("An exception happens when searchSpaces", ex); } } return Response.status(500).cacheControl(cacheControl).build(); } private static boolean filterSpace(String spaceId, List<Space> spacesSearched) { for (Space space : spacesSearched) { if (space.getId().equalsIgnoreCase(spaceId)) { return true; } } return false; } private Object extractObject(Object from, String fields) { if (fields != null) { String[] f = fields.split(","); if (f.length > 0) { JSONObject obj = new JSONObject(from); Map<String, Object> map = new HashMap<String, Object>(); for (String name : f) { if (obj.has(name)) { try { map.put(name, obj.get(name)); } catch (JSONException e) { if (LOG.isWarnEnabled()) { LOG.warn("The key does NOT exist", e); } } } } return map; } } return from; } }