1 package com.pentila.entSavoie.utils;
3 import java.text.Collator;
4 import java.text.Normalizer;
5 import java.util.ArrayList;
6 import java.util.HashMap;
7 import java.util.LinkedHashMap;
9 import java.util.Locale;
12 import com.liferay.contacts.util.InstitutionalListsFactory;
13 import com.liferay.contacts.util.ListFicheFactory;
14 import com.liferay.contacts.util.ProxyFiche;
15 import com.liferay.contacts.util.ProxyListCompletion;
16 import com.liferay.portal.kernel.dao.orm.QueryUtil;
17 import com.liferay.portal.kernel.exception.SystemException;
18 import com.liferay.portal.kernel.language.LanguageUtil;
19 import com.liferay.portal.kernel.log.Log;
20 import com.liferay.portal.kernel.log.LogFactoryUtil;
21 import com.liferay.portal.model.Group;
22 import com.liferay.portal.model.Organization;
23 import com.liferay.portal.model.User;
24 import com.liferay.portal.service.GroupLocalServiceUtil;
25 import com.liferay.portal.service.OrganizationLocalServiceUtil;
26 import com.liferay.portal.util.comparator.GroupNameComparator;
27 import com.pentila.entSavoie.amis.model.FriendFolder;
28 import com.pentila.entSavoie.amis.service.FriendFolderLocalServiceUtil;
29 import com.pentila.entSavoie.carnetDAdresses.model.ListProperty;
30 import com.pentila.entSavoie.carnetDAdresses.model.Liste;
31 import com.pentila.entSavoie.carnetDAdresses.service.ListeLocalServiceUtil;
32 import com.pentila.entSavoie.communityInfos.model.CommunityInfos;
33 import com.pentila.entSavoie.communityInfos.service.CommunityInfosLocalServiceUtil;
34 import com.pentila.entSavoie.institutionalList.model.ListeInstDetails;
35 import com.pentila.entSavoie.ENTDisplayUtil;
37 public class ENTAutoCompletionUtil {
39 public static final String CONTACT_LIST_CACHE_KEY = "UserMailCompletionPF_";
40 public static final String GROUP_LIST_CACHE_KEY = "UserMailCompletionList_";
42 private static Log logger = LogFactoryUtil.getLog(ENTAutoCompletionUtil.class);
45 * Return a list of users matching the query to display for auto completion
46 * @param query The String used to find result
47 * @param user The user currently searching
48 * @return a ProxyFiche Set which contains all the results
50 public static List<ProxyFiche> getContactCompletionForUser(String query, User user) {
52 List<ProxyFiche> cachePF = getContactsCache(user);
54 return getFilteredListFromProxyFicheList(cachePF, query);
58 * Take a users list and a query and return a filtered list with user matching the query
59 * @param usersProxyFicheList Full users List that we want to filtered
60 * @param query Query from user search to match
61 * @return a ProxyFiche List which contains matching users
63 public static List<ProxyFiche> getFilteredListFromProxyFicheList(List<ProxyFiche> usersProxyFicheList, String query) {
64 List<ProxyFiche> filteredPFList = new ArrayList<ProxyFiche>();
66 //Instantiation de l'operateur de comparaison avec Collator
67 Collator compareOperator = Collator.getInstance(Locale.FRENCH);
68 compareOperator.setStrength (Collator.PRIMARY);
70 if (query.equals("")) {
71 return usersProxyFicheList;
74 int sizeQuery = query.length();
75 for (ProxyFiche f : usersProxyFicheList) {
76 if (f.getType().equals("fiche") && f.getRelUserId().equals("")) {
79 if ((f.getNom().length()>=sizeQuery && (compareOperator.compare(f.getNom().substring(0,sizeQuery),query)==0)) ||
80 (f.getPrenom().length()>=sizeQuery && (compareOperator.compare(f.getPrenom().substring(0,sizeQuery),query)==0)) ||
81 ((f.getNom() + " " + f.getPrenom()).length()>=sizeQuery && (compareOperator.compare((f.getNom() + " " + f.getPrenom()).substring(0,sizeQuery),query)==0)) ||
82 ((f.getPrenom() + " " + f.getNom()).length()>=sizeQuery && (compareOperator.compare((f.getPrenom() + " " + f.getNom()).substring(0,sizeQuery),query)==0)) ||
83 (f.getStatut().length()>=sizeQuery && (compareOperator.compare(f.getStatut().substring(0,sizeQuery),query)==0))) {
84 filteredPFList.add(f);
89 return filteredPFList;
93 * Return a list of groups matching the query to display for auto completion
94 * @param query The String used to find result
95 * @param user The user currently searching
96 * @return a ProxyListCompletion List which contains all the results
98 public static List<ProxyListCompletion> getGroupsCompletionForUser(String query, User user) {
100 List<ProxyListCompletion> cacheList = getGroupsCache(user);
102 int sizeQuery = query.length();
104 //Search if groups contain the query
105 List<ProxyListCompletion> plCompResult = new ArrayList<ProxyListCompletion>();
106 query = Normalizer.normalize(query, Normalizer.Form.NFD).toLowerCase();
107 query = query.replaceAll("[^\\p{ASCII}]", "");
109 for (ProxyListCompletion plc: cacheList) {
110 String name = Normalizer.normalize(plc.getDisplay(), Normalizer.Form.NFD).toLowerCase();
111 name = name.replaceAll("[^\\p{ASCII}]", "");
112 if (plc.getDisplay().length()>=sizeQuery && name.contains(query)) {
113 plCompResult.add(plc);
121 * Returns all user's contacts after getting them in cache
122 * @param The user currently searching
123 * @return a ProxyFiche list
125 @SuppressWarnings("unchecked")
126 private static List<ProxyFiche> getContactsCache(User user) {
128 String contactListCacheKey = ENTAutoCompletionUtil.CONTACT_LIST_CACHE_KEY + user.getUserId();
130 // Try to get values from cache : if we can't we generate them
131 List<ProxyFiche> contactListCache = (List<ProxyFiche>) ENTCacheUtils.getObjectFromCache(contactListCacheKey);
133 if (contactListCache == null) {
134 generateAutoCompletionCaches(user);
135 contactListCache = (List<ProxyFiche>) ENTCacheUtils.getObjectFromCache(contactListCacheKey);
138 return contactListCache;
142 * Returns all user's groups/lists after getting them in cache
144 * @return a ProxyListCompletion list
146 @SuppressWarnings("unchecked")
147 private static List<ProxyListCompletion> getGroupsCache(User user) {
149 String groupListCacheKey = ENTAutoCompletionUtil.GROUP_LIST_CACHE_KEY + user.getUserId();
151 //Try to get values from cache : if we can't we generate them
152 List<ProxyListCompletion> groupListCache = (List<ProxyListCompletion>) ENTCacheUtils.getObjectFromCache(groupListCacheKey);
154 if (groupListCache == null) {
155 generateAutoCompletionCaches(user);
156 groupListCache = (List<ProxyListCompletion>) ENTCacheUtils.getObjectFromCache(groupListCacheKey);
159 return groupListCache;
163 * Generate cache for auto-completion. We get all the user's groups, lists and contacts to cache them
164 * @param user The user currently searching for his contacts
166 private static void generateAutoCompletionCaches(User user) {
167 LanguageUtil.get(user.getLocale(), "tous-mes-contacts-liste");
170 String cacheKeyPF = ENTAutoCompletionUtil.CONTACT_LIST_CACHE_KEY + user.getUserId();
171 String cacheKeyList = ENTAutoCompletionUtil.GROUP_LIST_CACHE_KEY + user.getUserId();
173 List<ProxyFiche> cachePF = new ArrayList<ProxyFiche>();
174 List<ProxyListCompletion> cacheList = new ArrayList<ProxyListCompletion>();
176 // First we manage personal user list
177 cacheList = new ArrayList<ProxyListCompletion>();
178 cacheList.add(new ProxyListCompletion(LanguageUtil.get(user.getLocale(), "tous-mes-contacts-liste"),LanguageUtil.get(user.getLocale(), "tous-mes-contacts-liste"), "all", "", "", ""));
179 cacheList.add(new ProxyListCompletion(LanguageUtil.get(user.getLocale(), "tous-mes-contacts-perso-liste"), LanguageUtil.get(user.getLocale(), "tous-mes-contacts-perso-liste"), "perso", "", "", ""));
180 cacheList.add(new ProxyListCompletion(LanguageUtil.get(user.getLocale(), "tous-mes-amis-liste"), LanguageUtil.get(user.getLocale(), "tous-mes-amis-liste"), "allAmis", "", "", ""));
181 cacheList.add(new ProxyListCompletion(LanguageUtil.get(user.getLocale(), "tous-mes-contacts-inst-liste"), LanguageUtil.get(user.getLocale(), "tous-mes-contacts-inst-liste"), "inst", "", "", ""));
183 List<Liste> lesListes;
185 lesListes = ListeLocalServiceUtil.findByGroupId(user.getGroup().getGroupId());
187 for (Liste list : lesListes) {
188 Map<String, List<ListProperty>> propsMapRes = ListeLocalServiceUtil.getPropertiesMap(list.getListeId());
189 String lName = propsMapRes.get("name").get(0).getValue_();
190 cacheList.add(new ProxyListCompletion(lName + " " + LanguageUtil.get(user.getLocale(), "liste"), lName + " " + LanguageUtil.get(user.getLocale(), "liste"), "local", "", "", String.valueOf(list.getListeId())));
192 } catch (Exception e) {
196 List<FriendFolder> friendLists;
198 friendLists = FriendFolderLocalServiceUtil.getFriendFolderByUserIDParentFolderId(user.getUserId(),0);
200 for (FriendFolder ff : friendLists) {
201 cacheList.add(new ProxyListCompletion(ff.getName() + " " + LanguageUtil.get(user.getLocale(), "liste"), ff.getName() + " " + LanguageUtil.get(user.getLocale(), "liste"), "amis", "", "", String.valueOf(ff.getFriendFolderId())));
203 } catch (SystemException e) {
207 // Second, we add all the institutional user lists
208 HashMap<String, List<ListeInstDetails> > userInstitutionalLists = ENTAddressBookListsManager.getUserInstitutionalLists(user, "");
209 List<ListeInstDetails> lids = userInstitutionalLists.get(ENTAddressBookListsManager.USER_CURRENT_LISTS);
210 List<ListeInstDetails> listFilter = new ArrayList<ListeInstDetails>();
211 for (ListeInstDetails lid : lids) {
212 if (lid.getOrgId() == Long.parseLong(lid.getSubOrgId())) {
214 Organization org = OrganizationLocalServiceUtil.getOrganization(lid.getOrgId());
215 cacheList.add(new ProxyListCompletion(lid.getListeInstDetailsName() + " " + LanguageUtil.get(user.getLocale(), "liste"),
216 lid.getListeInstDetailsName() + " - " + ENTDisplayUtil.formatSCONETName(user, org.getName()) + " " + LanguageUtil.get(user.getLocale(), "liste"),
217 "search", lid.getSubOrgId(), String.valueOf(lid.getRoleFilter()), String.valueOf(lid.getListeInstId())));
218 } catch (Exception e) {
224 cacheList.add(new ProxyListCompletion(lid.getListeInstDetailsName() + " " + LanguageUtil.get(user.getLocale(), "liste"),
225 lid.getListeInstDetailsName() + " " + LanguageUtil.get(user.getLocale(), "liste"), "search",
226 lid.getSubOrgId(), String.valueOf(lid.getRoleFilter()), String.valueOf(lid.getListeInstId())));
230 // Then we handle user's groups
231 List<Group> groupListResult = ENTAddressBookListsManager.getUserGroupsLists(user, "");
232 for(Group grp : groupListResult) {
233 cacheList.add(new ProxyListCompletion(grp.getName() + " " + LanguageUtil.get(user.getLocale(), "liste"),
234 grp.getName() + " " + LanguageUtil.get(user.getLocale(), "liste"),
235 "search", "", "", String.valueOf(grp.getGroupId())));
238 // We store all the lists in cache for half an hour (30 minutes)
239 ENTCacheUtils.storeObjectIntoCache(cacheKeyList, cacheList, 1800000);
241 // We get all contacts from lists and store them in cache too (30 minutes)
242 cachePF = ListFicheFactory.createAllContactsWithLists(user, lids, listFilter, groupListResult);
243 ENTCacheUtils.storeObjectIntoCache(cacheKeyPF, cachePF, 1800000);