package org.openedit.entermedia.modules; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openedit.Data; import org.openedit.data.Searcher; import org.openedit.entermedia.Asset; import org.openedit.entermedia.MediaArchive; import org.openedit.entermedia.autocomplete.AutoCompleteSearcher; import com.openedit.WebPageRequest; import com.openedit.hittracker.HitTracker; import com.openedit.hittracker.ListHitTracker; import com.openedit.hittracker.SearchQuery; import com.openedit.users.Group; import com.openedit.users.User; public class AutoCompleteModule extends DataEditModule { private static final Log log = LogFactory.getLog(AutoCompleteModule.class); public AutoCompleteSearcher getAutoCompleteSearcher(WebPageRequest inReq, boolean inSave) { String catalogid = null; String type = inReq.findValue("searchtype"); if (type == null || type.equals("compositeLucene") ) { type = "compositeLucene"; catalogid = inReq.findValue("applicationid"); } else { catalogid = inReq.findValue("catalogid"); } type = type + "AutoComplete"; AutoCompleteSearcher searcher = (AutoCompleteSearcher) getSearcherManager().getSearcher(catalogid, type); // e.g. // "assetThesaurusSearcher" if (inSave) { inReq.putPageValue("searcher", searcher); } return searcher; } public AutoCompleteSearcher getAutoCompleteSearcher(WebPageRequest inReq) { return getAutoCompleteSearcher(inReq, true); } /** * Look up the hits that we got and update our auto complete searcher * * @param inReq * @throws Exception */ public void updateHits(WebPageRequest inReq) { String word = inReq.getRequestParameter("description.value"); if (word == null) { return; } Searcher searcher = getAutoCompleteSearcher(inReq); if (searcher == null) { searcher = (Searcher) inReq.getPageValue("searcher"); if (searcher == null) { return; } } HitTracker tracker = searcher.loadHits(inReq); if (tracker == null) { tracker = (HitTracker) inReq.getPageValue("hits"); } if (tracker == null) { return; } getAutoCompleteSearcher(inReq, false).updateHits(tracker, word); } public HitTracker userSearchSuggestions(WebPageRequest inReq) { Searcher userSearcher = getSearcherManager().getSearcher("system", "user"); SearchQuery query = userSearcher.createSearchQuery(); query.setAndTogether(false); String searchString = inReq.getRequestParameter("term"); query.addStartsWith("description", searchString); HitTracker hits = userSearcher.cachedSearch(inReq, query); if (Boolean.parseBoolean(inReq.findValue("cancelactions"))) { inReq.setCancelActions(true); } inReq.putPageValue("suggestions", hits); return hits; } public HitTracker myGroupUsersSuggestions(WebPageRequest inReq) { User currentUser = inReq.getUser(); Collection groups = currentUser.getGroups(); HashSet<String> ids = new HashSet<String>(); for (Iterator iterator = groups.iterator(); iterator.hasNext();) { Group group = (Group) iterator.next(); Collection users = getUserManager().getUsersInGroup(group); for (Iterator iterator2 = users.iterator(); iterator2.hasNext();) { User user = (User) iterator2.next(); ids.add(user.getId()); } } //make sure we exclude users that are already in there MediaArchive archive = getMediaArchive(inReq); Asset asset = getAsset(inReq); Collection<String> userNames = archive.getAssetSecurityArchive().getAccessList(archive, asset); ids.removeAll(userNames); HitTracker hits = null; if(ids.size() > 0) { StringBuffer groupuserids = new StringBuffer(); for (Iterator iterator = ids.iterator(); iterator.hasNext();) { String id = (String) iterator.next(); if(iterator.hasNext()) { groupuserids.append(id + " "); } else { groupuserids.append(id); } } Searcher userSearcher = getSearcherManager().getSearcher("system", "user"); SearchQuery innerquery = userSearcher.createSearchQuery(); innerquery.setAndTogether(false); String searchString = inReq.getRequestParameter("term"); innerquery.addStartsWith("id", searchString); innerquery.addStartsWith("email", searchString); innerquery.addStartsWith("lastName", searchString); innerquery.addStartsWith("firstName", searchString); SearchQuery query = userSearcher.createSearchQuery(); query.setAndTogether(true); query.addChildQuery(innerquery); query.addOrsGroup("id", groupuserids.toString()); query.addSortBy("lastName"); hits = userSearcher.cachedSearch(inReq, query); if (Boolean.parseBoolean(inReq.findValue("cancelactions"))) { inReq.setCancelActions(true); } } inReq.putPageValue("suggestions", hits); return hits; } /** * @deprecated groupSuggestions is nicer to use * @param inReq * @return */ public HitTracker myGroupSuggestions(WebPageRequest inReq) { User currentUser = inReq.getUser(); Collection<Group> groups = currentUser.getGroups(); Collection<String> groupidscol = new ArrayList<String>(); StringBuffer groupids = new StringBuffer(); for (Iterator iterator = groups.iterator(); iterator.hasNext();) { Group group = (Group) iterator.next(); groupidscol.add(group.getId()); } //make sure we exclude groups that are already in there MediaArchive archive = getMediaArchive(inReq); Asset asset = getAsset(inReq); Collection<String> userNames = archive.getAssetSecurityArchive().getAccessList(archive, asset); groupidscol.removeAll(userNames); HitTracker hits = null; if(groupidscol.size() > 0) { //put them in something safe for a query for (Iterator iterator = groupidscol.iterator(); iterator.hasNext();) { String group = (String) iterator.next(); if(iterator.hasNext()) { groupids.append(group + " "); } else { groupids.append(group); } } Searcher groupSearcher = getSearcherManager().getSearcher("system", "group"); SearchQuery innerquery = groupSearcher.createSearchQuery(); String searchString = inReq.getRequestParameter("term"); innerquery.addStartsWith("description", searchString); innerquery.setAndTogether(false); SearchQuery query = groupSearcher.createSearchQuery(); query.addOrsGroup("id", groupids.toString()); query.setAndTogether(true); query.addChildQuery(innerquery); hits = groupSearcher.cachedSearch(inReq, query); if (Boolean.parseBoolean(inReq.findValue("cancelactions"))) { inReq.setCancelActions(true); } } inReq.putPageValue("suggestions", hits); return hits; } public HitTracker groupSuggestions(WebPageRequest inReq) { //make sure we exclude groups that are already in there MediaArchive archive = getMediaArchive(inReq); Asset asset = getAsset(inReq); HitTracker hits = null; Searcher groupSearcher = getSearcherManager().getSearcher("system", "group"); SearchQuery query = groupSearcher.createSearchQuery(); String searchString = inReq.getRequestParameter("term"); query.addStartsWith("description", searchString); query.addSortBy("namesorted"); Collection<String> alreadyhave = archive.getAssetSecurityArchive().getAccessList(archive, asset); for (Iterator iterator = alreadyhave.iterator(); iterator.hasNext();) { String existinggroup = (String) iterator.next(); query.addNot("id", existinggroup); } query.addNot("enabled","false"); hits = groupSearcher.cachedSearch(inReq, query); if (Boolean.parseBoolean(inReq.findValue("cancelactions"))) { inReq.setCancelActions(true); } inReq.putPageValue("suggestions", hits); // for (Iterator iterator = hits.iterator(); iterator.hasNext();) // { // Data hit = (Data) iterator.next(); // log.info(hit.getName()); // } return hits; } public HitTracker searchUserEmails(WebPageRequest inReq) throws Exception { Searcher userSearcher = getSearcherManager().getSearcher("system", "user"); String querystring = inReq.getRequestParameter("q"); //get what comes after the last semicolon if(querystring == null) { return null; } int semicolon = querystring.lastIndexOf(";"); if (semicolon > -1) { String existingmail = querystring.substring(0, semicolon); inReq.putPageValue("existingmail", existingmail + "; "); querystring = querystring.substring(semicolon + 1); } else { inReq.putPageValue("existingmail", ""); } SearchQuery query = userSearcher.createSearchQuery(); query.addStartsWith("description", querystring); HitTracker hits = userSearcher.cachedSearch(inReq, query); inReq.putPageValue("suggestions", hits); return hits; } public HitTracker searchFriendEmails(WebPageRequest inReq) throws Exception { Searcher userSearcher = getSearcherManager().getSearcher("system", "user"); String querystring = inReq.getRequestParameter("q"); //get what comes after the last semicolon if(querystring == null) { return null; } int semicolon = querystring.lastIndexOf(";"); if (semicolon > -1) { String existingmail = querystring.substring(0, semicolon); inReq.putPageValue("existingmail", existingmail + "; "); querystring = querystring.substring(semicolon + 1); } else { inReq.putPageValue("existingmail", ""); } SearchQuery query = userSearcher.createSearchQuery(); query.addStartsWith("description", querystring); query.addMatches("friend.friendid", inReq.getUserName()); HitTracker hits = userSearcher.cachedSearch(inReq, query); ListHitTracker users = new ListHitTracker(); if( hits.size() > 0) { //only show friends for (Iterator iterator = hits.iterator(); iterator.hasNext();) { Data user = (Data) iterator.next(); String email = user.get("email"); if( email != null) { users.add(user); } } } inReq.putPageValue("suggestions", users); return users; } // this searches for suggestions that are already in the index. used for // autocomplete public HitTracker searchSuggestions(WebPageRequest inReq) throws Exception { AutoCompleteSearcher searcher = (AutoCompleteSearcher) getAutoCompleteSearcher(inReq); SearchQuery query = searcher.createSearchQuery(); String field = inReq.getRequestParameter("field"); String searchString = inReq.getRequestParameter(field + ".value"); if (searchString == null) { searchString = inReq.getRequestParameter("q"); } if (searchString == null) { searchString = inReq.getRequestParameter("term"); } query.addStartsWith("synonymsenc", searchString); query.setSortBy("hitsDown"); // log.info("searching in : " + searcher.getCatalogId() +"/" + searcher.getSearchType() + "/" + searchString); HitTracker wordsHits = searcher.cachedSearch(inReq, query); if (Boolean.parseBoolean(inReq.findValue("cancelactions"))) { inReq.setCancelActions(true); } inReq.putPageValue("searchstring", searchString); return wordsHits; } public void autocomplete(WebPageRequest inReq) throws Exception { Searcher searcher = loadSearcher(inReq); String field = inReq.getRequestParameter("field"); if (searcher != null) { SearchQuery query = searcher.createSearchQuery(); String term = inReq.getRequestParameter("term"); query.addStartsWith(field, term); HitTracker hits = searcher.cachedSearch(inReq, query); if (hits != null) { String name = inReq.findValue("hitsname"); inReq.putPageValue(name, hits); inReq.putSessionValue(hits.getSessionId(), hits); } } inReq.putPageValue("searcher", searcher); } }