--- /dev/null
+package com.liferay.contacts.util;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.lang.ArrayUtils;
+
+import com.liferay.portal.kernel.bean.PortletBeanLocatorUtil;
+import com.liferay.portal.kernel.dao.orm.DynamicQuery;
+import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
+import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
+import com.liferay.portal.kernel.exception.PortalException;
+import com.liferay.portal.kernel.exception.SystemException;
+import com.liferay.portal.kernel.log.Log;
+import com.liferay.portal.kernel.log.LogFactoryUtil;
+import com.liferay.portal.model.Group;
+import com.liferay.portal.model.Organization;
+import com.liferay.portal.model.User;
+import com.liferay.portal.service.GroupLocalServiceUtil;
+import com.liferay.portal.service.OrganizationLocalServiceUtil;
+import com.pentila.entSavoie.communityInfos.model.OrganizationMapping;
+import com.pentila.entSavoie.communityInfos.service.OrganizationCiteScolaireLocalServiceUtil;
+import com.pentila.entSavoie.communityInfos.service.OrganizationMappingLocalServiceUtil;
+import com.pentila.entSavoie.userManagement.service.ClpSerializer;
+
+public class OrganizationFilter {
+
+ private static Log logger = LogFactoryUtil.getLog(OrganizationFilter.class);
+
+ public static final String REG_EXP_SUB_ORGS_TREEPATH = "/[0-9]+/[0-9]+/[0-9]+/";
+ public static final String REG_EXP_SCHOOL_ORGS_TREEPATH = "/[0-9]+/[0-9]+/";
+ private static List<String> _schoolYearRanges = new ArrayList<String>();
+
+
+ /**
+ * Returns a list of organizations from a given list of organization Ids
+ */
+ @SuppressWarnings("unchecked")
+ public static List<Organization> getOrganizationsFromOrgIds(List<Long> orgIdList) throws SystemException{
+
+ ClassLoader classLoader = (ClassLoader)PortletBeanLocatorUtil.locate(ClpSerializer.getServletContextName(),"portletClassLoader");
+ DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(Organization.class,classLoader);
+
+ Long[] orgIdTab = new Long[orgIdList.size()];
+ int idx = 0;
+ for (Long orgId : orgIdList) {
+ orgIdTab[idx++] = orgId;
+ }
+ dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").in(orgIdTab));
+
+ List<Organization> organizationToReturn = new ArrayList<Organization>();
+ organizationToReturn.addAll(GroupLocalServiceUtil.dynamicQuery(dynamicQuery));
+
+ return organizationToReturn;
+ }
+
+
+ /**
+ * Returns all classes and groups the user is member of
+ */
+ public static List<Organization> getUserClassesAndGroups(User user) {
+ List<Organization> userOrgs = new ArrayList<Organization>();
+ try {
+ userOrgs = user.getOrganizations();
+ } catch (Exception e) {
+ logger.error(e);
+ }
+ return filterClassesAndGroups(userOrgs);
+ }
+
+
+ /**
+ * Returns all schools the user is member of
+ */
+ public static List<Organization> getUserSchools(User user) {
+ List<Organization> userOrgs = new ArrayList<Organization>();
+ try {
+ userOrgs = user.getOrganizations();
+ } catch (Exception e) {
+ logger.error(e);
+ }
+ return filterSchools(userOrgs);
+ }
+
+
+ /**
+ * Filters classes and groups from a given list of organizations
+ */
+ public static List<Organization> filterClassesAndGroups(List<Organization> orgs) {
+ List<Organization> classesAndGroupsOrgs = new ArrayList<Organization>();
+ for (Organization org: orgs) {
+ if (org.getTreePath().matches(REG_EXP_SUB_ORGS_TREEPATH)) {
+ classesAndGroupsOrgs.add(org);
+ }
+ }
+ return classesAndGroupsOrgs;
+ }
+
+
+ /**
+ * Returns all the organizations of a user's schools
+ */
+ public static List<Organization> getAllUserSchoolOrganizations(User user) {
+
+ List<Organization> result = new ArrayList<Organization>();
+
+ List<Organization> userSchools = getUserSchools(user);
+ // Loop over user's school to get their classes
+ for (Organization school : userSchools) {
+ try {
+ result.addAll(OrganizationLocalServiceUtil.getOrganizations(user.getCompanyId(), school.getOrganizationId()));
+ } catch (Exception e) {
+ logger.error("Error while getting classes for school orgId "+school.getOrganizationId(), e);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Returns schools amongst a given list of organizations
+ */
+ public static List<Organization> filterSchools(List<Organization> orgList){
+ List<Organization> schoolList = new ArrayList<Organization>();
+ for (Organization org: orgList){
+ if (isOrgSchool(org)) {
+ schoolList.add(org);
+ }
+ }
+ return schoolList;
+ }
+
+ /**
+ * Returns true if organization is a school
+ * @param organization
+ * @return
+ */
+ public static boolean isOrgSchool(Organization organization) {
+ return (organization.getTreePath().matches(REG_EXP_SCHOOL_ORGS_TREEPATH) && !organization.getTreePath().matches(REG_EXP_SUB_ORGS_TREEPATH));
+ }
+
+
+ /**
+ * Returns a list of schools that belong to the school complex of given school
+ */
+ public static List<Organization> getSchoolComplexSchools(Organization school) {
+
+ List<Organization> orgaList = new ArrayList<Organization>();
+
+ String entStructureUai = OrganizationMappingLocalServiceUtil.getOrganizationStrutUAI(school);
+ if (entStructureUai != null && !entStructureUai.equals("")) {
+ try {
+ List<String> entStructureUaiList = OrganizationCiteScolaireLocalServiceUtil.getEtabsUAIInSchoolComplexFromAnEtabStructureUAI(entStructureUai);
+ if (entStructureUaiList != null) {
+ for (String entStructureUaiSchool : entStructureUaiList) {
+ OrganizationMapping orgMapping = OrganizationMappingLocalServiceUtil.getOrganizationMapping(entStructureUaiSchool);
+ if (orgMapping != null) {
+ Organization org = OrganizationLocalServiceUtil.getOrganization(orgMapping.getOrganizationId());
+ orgaList.add(org);
+ }
+ }
+ }
+ } catch (Exception e) {
+ logger.error("Could not get school complex etab for etab "+school.getName()+" (id="+school.getOrganizationId()+")");
+ }
+ }
+
+ // Add original entStructureUai if missing
+ boolean containsEtabRattach = false;
+ for (Organization orga : orgaList) {
+ if (orga.getOrganizationId() == school.getOrganizationId()) {
+ containsEtabRattach = true;
+ }
+ }
+ if (!containsEtabRattach) {
+ orgaList.add(school);
+ }
+ return orgaList;
+ }
+
+
+ /**
+ * Returns the list of user's schools including school complex
+ */
+ public static List<Organization> getAllUserSchoolsIncludingSchoolComplex(User user){
+ List<Organization> schoolsWithSchoolarComplex = new ArrayList<Organization>();
+ try{
+ List<Organization> userSchools = getUserSchools(user);
+
+ for (Organization aSchool : userSchools) {
+ if (!schoolsWithSchoolarComplex.contains(aSchool)) {
+ schoolsWithSchoolarComplex.addAll(getSchoolComplexSchools(aSchool));
+ }
+ }
+ }
+ catch (Exception e){
+ logger.error("Error while getting all schools for user " + user.getFullName(), e);
+ }
+ return schoolsWithSchoolarComplex;
+ }
+
+
+ /**
+ * Returns a list of organizations from a list of groups
+ */
+ @SuppressWarnings("unchecked")
+ public static List<Organization> getOrganizationsFromGroups(List<Group> groupsToSearchFor) throws SystemException{
+
+ List<Organization> orgsToReturn = new ArrayList<Organization>();
+ if (groupsToSearchFor != null && groupsToSearchFor.size() > 0) {
+ ClassLoader classLoader = (ClassLoader)PortletBeanLocatorUtil.locate(ClpSerializer.getServletContextName(),"portletClassLoader");
+ DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(Organization.class,classLoader);
+
+ Long[] groupClassPKTab = new Long[groupsToSearchFor.size()];
+ int idx = 0;
+ for (Group group : groupsToSearchFor) {
+ groupClassPKTab[idx++] = group.getClassPK();
+ }
+ dynamicQuery.add(PropertyFactoryUtil.forName("organizationId").in(groupClassPKTab));
+
+ orgsToReturn.addAll(GroupLocalServiceUtil.dynamicQuery(dynamicQuery));
+ }
+
+ return orgsToReturn;
+ }
+
+
+ /**
+ * Returns a list of non-archived organization amongst a given list of organization
+ */
+ public static List<Organization> filterNotArchivedOrganizations(List<Organization> oranizationsToVerify) throws SystemException {
+
+ List<Organization> notArchivedOrgs = new ArrayList<Organization>();
+ for (Organization org : oranizationsToVerify) {
+ if (!isArchived(org)) {
+ notArchivedOrgs.add(org);
+ }
+ }
+ return notArchivedOrgs;
+ }
+
+
+ /**
+ * Returns a filtered list of organizations that are not suffixed by "- Parent" or "- Enseignants" or "- Personnels"
+ */
+ public static List<Organization> filterNotSuffixedOrganizations(List<Organization> oranizationToVerify) {
+
+ List<Organization> notSuffixedOrgs = new ArrayList<Organization>();
+ for (Organization anOrg : oranizationToVerify){
+ if (!anOrg.getName().contains(OrganizationConstants.ORG_SUFFIX_PARENTS)
+ && !anOrg.getName().contains(OrganizationConstants.ORG_SUFFIX_PERSONNELS)
+ && !anOrg.getName().contains(OrganizationConstants.ORG_SUFFIX_TEACHERS)){
+ notSuffixedOrgs.add(anOrg);
+ }
+ }
+ return notSuffixedOrgs;
+ }
+
+ /**
+ * Returns the list of organizations from the given orgsToFilter list that belong to the given schoolList (including schools)
+ */
+ public static List<Organization> filterOrgsOfSchoolList(List<Organization> schoolList, List<Organization> orgsToFilter){
+ List<Organization> filteredOrgs = new ArrayList<Organization>();
+ for (Organization anOrgToFilter : orgsToFilter){
+ for(Organization anEtab : schoolList){
+ if(anOrgToFilter.getOrganizationId() == anEtab.getOrganizationId() ||
+ anOrgToFilter.getParentOrganizationId() == anEtab.getOrganizationId()){
+ filteredOrgs.add(anOrgToFilter);
+ }
+ }
+ }
+ return filteredOrgs;
+ }
+
+ /**
+ * Returns the list of organizations from the given orgsToFilter list that belong to the given schoolList (not including schools)
+ */
+ public static List<Organization> filterClassesOfSchoolList(List<Organization> schoolList, List<Organization> orgsToFilter){
+ List<Organization> filteredOrgs = new ArrayList<Organization>();
+ for (Organization anOrgToFilter : orgsToFilter){
+ for (Organization anEtab : schoolList){
+ if (anOrgToFilter.getParentOrganizationId() == anEtab.getOrganizationId()){
+ filteredOrgs.add(anOrgToFilter);
+ }
+ }
+ }
+ return filteredOrgs;
+ }
+
+ /**
+ * Returns the schools of the given organizations
+ */
+ public static List<Organization> getSchoolsFromOrgs(List<Organization> orgList) throws PortalException, SystemException{
+ List<Long> schoolsId = new ArrayList<Long>();
+ for (Organization org : orgList) {
+ String[] treePathPart = org.getTreePath().split("/");
+ if (treePathPart.length >= 3 && treePathPart[2] != null && !treePathPart[2].isEmpty() && !schoolsId.contains(Long.valueOf(treePathPart[2]))) {
+ schoolsId.add(Long.valueOf(treePathPart[2]));
+ }
+ }
+ return OrganizationLocalServiceUtil.getOrganizations(ArrayUtils.toPrimitive(schoolsId.toArray(new Long[schoolsId.size()])));
+ }
+
+ /**
+ * Returns true if the given organization is archived (according to its name suffixed or not)
+ */
+ public static boolean isArchived(Organization org) {
+
+ List<String> schoolYearRanges = buildSchoolYearRanges();
+ for (String schoolYearRange : schoolYearRanges) {
+ if (org.getName().endsWith(schoolYearRange)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Build school year ranges from 2014 until current year
+ */
+ public static List<String> buildSchoolYearRanges() {
+
+ if (_schoolYearRanges == null || _schoolYearRanges.size() == 0) {
+ int startYear = 2014;
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(new Date());
+ int currentYear = cal.get(Calendar.YEAR);
+
+ for (int year = startYear ; year < currentYear ; year++) {
+ _schoolYearRanges.add(year+"-"+(year+1));
+ }
+ }
+ return _schoolYearRanges;
+ }
+
+}