1 package com.liferay.contacts.util;
3 import java.util.ArrayList;
4 import java.util.Calendar;
8 import org.apache.commons.lang.ArrayUtils;
10 import com.liferay.portal.kernel.bean.PortletBeanLocatorUtil;
11 import com.liferay.portal.kernel.dao.orm.DynamicQuery;
12 import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
13 import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
14 import com.liferay.portal.kernel.exception.PortalException;
15 import com.liferay.portal.kernel.exception.SystemException;
16 import com.liferay.portal.kernel.log.Log;
17 import com.liferay.portal.kernel.log.LogFactoryUtil;
18 import com.liferay.portal.model.Group;
19 import com.liferay.portal.model.Organization;
20 import com.liferay.portal.model.User;
21 import com.liferay.portal.service.GroupLocalServiceUtil;
22 import com.liferay.portal.service.OrganizationLocalServiceUtil;
23 import com.pentila.entSavoie.communityInfos.model.OrganizationMapping;
24 import com.pentila.entSavoie.communityInfos.service.OrganizationCiteScolaireLocalServiceUtil;
25 import com.pentila.entSavoie.communityInfos.service.OrganizationMappingLocalServiceUtil;
26 import com.pentila.entSavoie.userManagement.service.ClpSerializer;
28 public class OrganizationFilter {
30 private static Log logger = LogFactoryUtil.getLog(OrganizationFilter.class);
32 public static final String REG_EXP_SUB_ORGS_TREEPATH = "/[0-9]+/[0-9]+/[0-9]+/";
33 public static final String REG_EXP_SCHOOL_ORGS_TREEPATH = "/[0-9]+/[0-9]+/";
34 private static List<String> _schoolYearRanges = new ArrayList<String>();
38 * Returns a list of organizations from a given list of organization Ids
40 @SuppressWarnings("unchecked")
41 public static List<Organization> getOrganizationsFromOrgIds(List<Long> orgIdList) throws SystemException{
43 ClassLoader classLoader = (ClassLoader)PortletBeanLocatorUtil.locate(ClpSerializer.getServletContextName(),"portletClassLoader");
44 DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(Organization.class,classLoader);
46 Long[] orgIdTab = new Long[orgIdList.size()];
48 for (Long orgId : orgIdList) {
49 orgIdTab[idx++] = orgId;
51 dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").in(orgIdTab));
53 List<Organization> organizationToReturn = new ArrayList<Organization>();
54 organizationToReturn.addAll(GroupLocalServiceUtil.dynamicQuery(dynamicQuery));
56 return organizationToReturn;
61 * Returns all classes and groups the user is member of
63 public static List<Organization> getUserClassesAndGroups(User user) {
64 List<Organization> userOrgs = new ArrayList<Organization>();
66 userOrgs = user.getOrganizations();
67 } catch (Exception e) {
70 return filterClassesAndGroups(userOrgs);
75 * Returns all schools the user is member of
77 public static List<Organization> getUserSchools(User user) {
78 List<Organization> userOrgs = new ArrayList<Organization>();
80 userOrgs = user.getOrganizations();
81 } catch (Exception e) {
84 return filterSchools(userOrgs);
89 * Filters classes and groups from a given list of organizations
91 public static List<Organization> filterClassesAndGroups(List<Organization> orgs) {
92 List<Organization> classesAndGroupsOrgs = new ArrayList<Organization>();
93 for (Organization org: orgs) {
94 if (org.getTreePath().matches(REG_EXP_SUB_ORGS_TREEPATH)) {
95 classesAndGroupsOrgs.add(org);
98 return classesAndGroupsOrgs;
103 * Returns all the organizations of a user's schools
105 public static List<Organization> getAllUserSchoolOrganizations(User user) {
107 List<Organization> result = new ArrayList<Organization>();
109 List<Organization> userSchools = getUserSchools(user);
110 // Loop over user's school to get their classes
111 for (Organization school : userSchools) {
113 result.addAll(OrganizationLocalServiceUtil.getOrganizations(user.getCompanyId(), school.getOrganizationId()));
114 } catch (Exception e) {
115 logger.error("Error while getting classes for school orgId "+school.getOrganizationId(), e);
122 * Returns schools amongst a given list of organizations
124 public static List<Organization> filterSchools(List<Organization> orgList){
125 List<Organization> schoolList = new ArrayList<Organization>();
126 for (Organization org: orgList){
127 if (isOrgSchool(org)) {
135 * Returns true if organization is a school
136 * @param organization
139 public static boolean isOrgSchool(Organization organization) {
140 return (organization.getTreePath().matches(REG_EXP_SCHOOL_ORGS_TREEPATH) && !organization.getTreePath().matches(REG_EXP_SUB_ORGS_TREEPATH));
145 * Returns a list of schools that belong to the school complex of given school
147 public static List<Organization> getSchoolComplexSchools(Organization school) {
149 List<Organization> orgaList = new ArrayList<Organization>();
151 String entStructureUai = OrganizationMappingLocalServiceUtil.getOrganizationStrutUAI(school);
152 if (entStructureUai != null && !entStructureUai.equals("")) {
154 List<String> entStructureUaiList = OrganizationCiteScolaireLocalServiceUtil.getEtabsUAIInSchoolComplexFromAnEtabStructureUAI(entStructureUai);
155 if (entStructureUaiList != null) {
156 for (String entStructureUaiSchool : entStructureUaiList) {
157 OrganizationMapping orgMapping = OrganizationMappingLocalServiceUtil.getOrganizationMapping(entStructureUaiSchool);
158 if (orgMapping != null) {
159 Organization org = OrganizationLocalServiceUtil.getOrganization(orgMapping.getOrganizationId());
164 } catch (Exception e) {
165 logger.error("Could not get school complex etab for etab "+school.getName()+" (id="+school.getOrganizationId()+")");
169 // Add original entStructureUai if missing
170 boolean containsEtabRattach = false;
171 for (Organization orga : orgaList) {
172 if (orga.getOrganizationId() == school.getOrganizationId()) {
173 containsEtabRattach = true;
176 if (!containsEtabRattach) {
177 orgaList.add(school);
184 * Returns the list of user's schools including school complex
186 public static List<Organization> getAllUserSchoolsIncludingSchoolComplex(User user){
187 List<Organization> schoolsWithSchoolarComplex = new ArrayList<Organization>();
189 List<Organization> userSchools = getUserSchools(user);
191 for (Organization aSchool : userSchools) {
192 if (!schoolsWithSchoolarComplex.contains(aSchool)) {
193 schoolsWithSchoolarComplex.addAll(getSchoolComplexSchools(aSchool));
198 logger.error("Error while getting all schools for user " + user.getFullName(), e);
200 return schoolsWithSchoolarComplex;
205 * Returns a list of organizations from a list of groups
207 @SuppressWarnings("unchecked")
208 public static List<Organization> getOrganizationsFromGroups(List<Group> groupsToSearchFor) throws SystemException{
210 List<Organization> orgsToReturn = new ArrayList<Organization>();
211 if (groupsToSearchFor != null && groupsToSearchFor.size() > 0) {
212 ClassLoader classLoader = (ClassLoader)PortletBeanLocatorUtil.locate(ClpSerializer.getServletContextName(),"portletClassLoader");
213 DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(Organization.class,classLoader);
215 Long[] groupClassPKTab = new Long[groupsToSearchFor.size()];
217 for (Group group : groupsToSearchFor) {
218 groupClassPKTab[idx++] = group.getClassPK();
220 dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").in(groupClassPKTab));
222 orgsToReturn.addAll(GroupLocalServiceUtil.dynamicQuery(dynamicQuery));
230 * Returns a list of non-archived organization amongst a given list of organization
232 public static List<Organization> filterNotArchivedOrganizations(List<Organization> oranizationsToVerify) throws SystemException {
234 List<Organization> notArchivedOrgs = new ArrayList<Organization>();
235 for (Organization org : oranizationsToVerify) {
236 if (!isArchived(org)) {
237 notArchivedOrgs.add(org);
240 return notArchivedOrgs;
245 * Returns a filtered list of organizations that are not suffixed by "- Parent" or "- Enseignants" or "- Personnels"
247 public static List<Organization> filterNotSuffixedOrganizations(List<Organization> oranizationToVerify) {
249 List<Organization> notSuffixedOrgs = new ArrayList<Organization>();
250 for (Organization anOrg : oranizationToVerify){
251 if (!anOrg.getName().contains(OrganizationConstants.ORG_SUFFIX_PARENTS)
252 && !anOrg.getName().contains(OrganizationConstants.ORG_SUFFIX_PERSONNELS)
253 && !anOrg.getName().contains(OrganizationConstants.ORG_SUFFIX_TEACHERS)){
254 notSuffixedOrgs.add(anOrg);
257 return notSuffixedOrgs;
261 * Returns the list of organizations from the given orgsToFilter list that belong to the given schoolList (including schools)
263 public static List<Organization> filterOrgsOfSchoolList(List<Organization> schoolList, List<Organization> orgsToFilter){
264 List<Organization> filteredOrgs = new ArrayList<Organization>();
265 for (Organization anOrgToFilter : orgsToFilter){
266 for(Organization anEtab : schoolList){
267 if(anOrgToFilter.getOrganizationId() == anEtab.getOrganizationId() ||
268 anOrgToFilter.getParentOrganizationId() == anEtab.getOrganizationId()){
269 filteredOrgs.add(anOrgToFilter);
277 * Returns the list of organizations from the given orgsToFilter list that belong to the given schoolList (not including schools)
279 public static List<Organization> filterClassesOfSchoolList(List<Organization> schoolList, List<Organization> orgsToFilter){
280 List<Organization> filteredOrgs = new ArrayList<Organization>();
281 for (Organization anOrgToFilter : orgsToFilter){
282 for (Organization anEtab : schoolList){
283 if (anOrgToFilter.getParentOrganizationId() == anEtab.getOrganizationId()){
284 filteredOrgs.add(anOrgToFilter);
292 * Returns the schools of the given organizations
294 public static List<Organization> getSchoolsFromOrgs(List<Organization> orgList) throws PortalException, SystemException{
295 List<Long> schoolsId = new ArrayList<Long>();
296 for (Organization org : orgList) {
297 String[] treePathPart = org.getTreePath().split("/");
298 if (treePathPart.length >= 3 && treePathPart[2] != null && !treePathPart[2].isEmpty() && !schoolsId.contains(Long.valueOf(treePathPart[2]))) {
299 schoolsId.add(Long.valueOf(treePathPart[2]));
302 return OrganizationLocalServiceUtil.getOrganizations(ArrayUtils.toPrimitive(schoolsId.toArray(new Long[schoolsId.size()])));
306 * Returns true if the given organization is archived (according to its name suffixed or not)
308 public static boolean isArchived(Organization org) {
310 List<String> schoolYearRanges = buildSchoolYearRanges();
311 for (String schoolYearRange : schoolYearRanges) {
312 if (org.getName().endsWith(schoolYearRange)) {
320 * Build school year ranges from 2014 until current year
322 public static List<String> buildSchoolYearRanges() {
324 if (_schoolYearRanges == null || _schoolYearRanges.size() == 0) {
325 int startYear = 2014;
326 Calendar cal = Calendar.getInstance();
327 cal.setTime(new Date());
328 int currentYear = cal.get(Calendar.YEAR);
330 for (int year = startYear ; year < currentYear ; year++) {
331 _schoolYearRanges.add(year+"-"+(year+1));
334 return _schoolYearRanges;