Java tutorial
/* * Copyright (C) 2003-2016 eXo Platform SAS. * * This program 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 3 of the License, or * (at your option) any later version. * * This program 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 program. If not, see http://www.gnu.org/licenses/ . */ package org.exoplatform.social.addons.search; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import org.exoplatform.addons.es.client.ElasticSearchingClient; import org.exoplatform.addons.es.search.ElasticSearchException; import org.exoplatform.addons.es.search.ElasticSearchServiceConnector; import org.exoplatform.commons.api.search.data.SearchContext; import org.exoplatform.commons.api.search.data.SearchResult; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.container.xml.InitParams; import org.exoplatform.portal.mop.SiteType; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.social.core.service.LinkProvider; import org.exoplatform.social.core.space.model.Space; import org.exoplatform.social.core.space.spi.SpaceService; public class SpaceElasticUnifiedSearchServiceConnector extends ElasticSearchServiceConnector { private static final Log LOG = ExoLogger.getLogger(SpaceElasticUnifiedSearchServiceConnector.class); private SpaceService spaceService; public SpaceElasticUnifiedSearchServiceConnector(InitParams initParams, ElasticSearchingClient client, SpaceService wikiService) { super(initParams, client); this.spaceService = wikiService; } @Override protected String getSourceFields() { List<String> fields = new ArrayList<>(); fields.add("prettyName"); fields.add("displayName"); fields.add("description"); List<String> sourceFields = new ArrayList<>(); for (String sourceField : fields) { sourceFields.add("\"" + sourceField + "\""); } return StringUtils.join(sourceFields, ","); } protected Collection<SearchResult> buildResult(String jsonResponse, SearchContext context) { LOG.debug("Search Query response from ES : {} ", jsonResponse); Collection<SearchResult> results = new ArrayList<>(); JSONParser parser = new JSONParser(); Map json; try { json = (Map) parser.parse(jsonResponse); } catch (ParseException e) { throw new ElasticSearchException("Unable to parse JSON response", e); } //TODO check if response is successful JSONObject jsonResult = (JSONObject) json.get("hits"); JSONArray jsonHits = (JSONArray) jsonResult.get("hits"); for (Object jsonHit : jsonHits) { JSONObject hitSource = (JSONObject) ((JSONObject) jsonHit).get("_source"); Space space = spaceService.getSpaceById(((JSONObject) jsonHit).get("_id").toString()); if (Space.HIDDEN.equals(space.getVisibility())) { continue; } String title = getTitleFromJsonResult(hitSource); String url = getUrlFromJsonResult(space, context); Long lastUpdatedDate = (Long) hitSource.get("lastUpdatedDate"); if (lastUpdatedDate == null) lastUpdatedDate = new Date().getTime(); Double score = (Double) ((JSONObject) jsonHit).get("_score"); // StringBuilder sb = new StringBuilder(String.valueOf(space.getDisplayName())); sb.append(String.format(" - %s Member(s)", space.getMembers().length)); if (Space.OPEN.equals(space.getRegistration())) { sb.append(" - Free to Join"); } else if (Space.VALIDATION.equals(space.getRegistration())) { sb.append(" - Register"); } else if (Space.CLOSE.equals(space.getRegistration())) { sb.append(" - Invitation Only"); } else { LOG.debug(space.getRegistration() + " registration unknown"); } results.add( new SearchResult(url, title, space.getDescription(), sb.toString(), space.getAvatarUrl() != null ? space.getAvatarUrl() : LinkProvider.SPACE_DEFAULT_AVATAR_URL, lastUpdatedDate, //score must not be null as "track_scores" is part of the query score.longValue())); } return results; } private String getUrlFromJsonResult(Space space, SearchContext context) { try { String permanentSpaceName = space.getPrettyName(); String groupId = space.getGroupId(); // String siteName = groupId.replaceAll("/", ":"); String siteType = SiteType.GROUP.getName(); ExoContainerContext eXoContext = (ExoContainerContext) ExoContainerContext.getCurrentContainer() .getComponentInstanceOfType(ExoContainerContext.class); String portalName = eXoContext.getPortalContainerName(); String spaceURI = context.handler(portalName).lang("").siteName(siteName).siteType(siteType) .path(permanentSpaceName).renderLink(); return URLDecoder.decode(String.format("/%s%s", portalName, spaceURI), "UTF-8"); } catch (Exception e) { LOG.error("Cannot compute space url for " + space.getDisplayName(), e); return ""; } } }