--- /dev/null
+package com.pentila.entSavoie.ws.utils;
+
+import java.io.StringWriter;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.w3c.dom.Element;
+
+import com.liferay.portal.kernel.exception.PortalException;
+import com.liferay.portal.kernel.exception.SystemException;
+import com.liferay.portal.kernel.json.JSONArray;
+import com.liferay.portal.kernel.json.JSONFactoryUtil;
+import com.liferay.portal.kernel.json.JSONObject;
+import com.liferay.portal.kernel.repository.model.FileEntry;
+import com.liferay.portal.kernel.repository.model.Folder;
+import com.liferay.portal.kernel.search.Document;
+import com.liferay.portal.kernel.search.Hits;
+import com.liferay.portal.kernel.util.GetterUtil;
+import com.liferay.portal.model.Role;
+import com.liferay.portal.model.User;
+import com.liferay.portal.security.ldap.LDAPLocalServiceUtil;
+import com.liferay.portal.security.permission.PermissionChecker;
+import com.liferay.portal.security.permission.PermissionCheckerFactoryUtil;
+import com.liferay.portal.service.RoleLocalServiceUtil;
+import com.liferay.portal.service.UserLocalServiceUtil;
+import com.liferay.portal.util.PortalUtil;
+import com.liferay.portal.util.PortletKeys;
+import com.liferay.portlet.blogs.model.BlogsEntry;
+import com.liferay.portlet.blogs.util.service.BlogsEntryLocalServiceUtil;
+import com.liferay.portlet.documentlibrary.folder.service.DLFolderLocalServiceUtil;
+import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
+import com.liferay.portlet.documentlibrary.store.CustomDLStoreUtil;
+import com.liferay.portlet.messageboards.category.service.MBCategoryLocalServiceUtil;
+import com.liferay.portlet.messageboards.model.MBMessage;
+import com.liferay.portlet.messageboards.service.MBMessageLocalServiceUtil;
+import com.pentila.entSavoie.ENTDisplayUtil;
+import com.pentila.entSavoie.ENTRoleUtilFactory;
+import com.pentila.entSavoie.ENTRolesConstants;
+import com.pentila.entSavoie.agenda.model.EventAgenda;
+import com.pentila.entSavoie.agenda.service.EventAgendaLocalServiceUtil;
+import com.pentila.entSavoie.cahierDeTexte.model.EventCDT;
+import com.pentila.entSavoie.cahierDeTexte.model.Matiere;
+import com.pentila.entSavoie.cahierDeTexte.service.MatiereLocalServiceUtil;
+import com.pentila.entSavoie.cahierDeTexte.util.CDTUtil;
+import com.pentila.entSavoie.cartable.NoSuchCasierEntryException;
+import com.pentila.entSavoie.cartable.model.CasierEntry;
+import com.pentila.entSavoie.cartable.service.CasierEntryLocalServiceUtil;
+import com.pentila.entSavoie.messageBoards.MBUtils;
+import com.pentila.entSavoie.utils.PermissionsUtils;
+
+public class WSUtil {
+
+ private static SimpleDateFormat classicDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+ private static SimpleDateFormat frenchDateFormat = new SimpleDateFormat("dd/MM/yyyy");
+
+ private static boolean isEleve = false;
+ private static boolean isParent = false;
+ private static boolean isEnseignant = false;
+ private static boolean isPrincipal = false;
+
+ /**
+ * Obtention de l'utilisateur depuis le LDAP
+ * @param companyId
+ * @param entPersonJointure
+ * @return
+ * @throws Exception
+ */
+ public static User getUser(long companyId, String entPersonJointure) throws Exception{
+ User user = LDAPLocalServiceUtil.getUser(companyId, "ENTPersonJointure", entPersonJointure);
+ setRoles(user);
+ return user;
+ }
+
+ private static void setRoles(User user) throws SystemException, PortalException{
+ Role eleveRole = ENTRoleUtilFactory.getInstance(user.getCompanyId()).getRole(ENTRolesConstants.NATIONAL_1);
+ Role parentRole = ENTRoleUtilFactory.getInstance(user.getCompanyId()).getRole(ENTRolesConstants.NATIONAL_2);
+ Role enseignantRole = ENTRoleUtilFactory.getInstance(user.getCompanyId()).getRole(ENTRolesConstants.NATIONAL_3);
+ Role principal = RoleLocalServiceUtil.getRole(user.getCompanyId(), ENTRolesConstants.NATIONAL_4);
+
+ isEleve = RoleLocalServiceUtil.hasUserRole(user.getUserId(), eleveRole.getRoleId());
+ isParent = RoleLocalServiceUtil.hasUserRole(user.getUserId(), parentRole.getRoleId());
+ isEnseignant = RoleLocalServiceUtil.hasUserRole(user.getUserId(), enseignantRole.getRoleId());
+ isPrincipal = RoleLocalServiceUtil.hasUserRole(user.getUserId(), principal.getRoleId());
+ }
+
+ /**
+ * Nombre de nouveaux documents dans le casier
+ * @param user
+ * @return
+ * @throws NoSuchCasierEntryException
+ * @throws SystemException
+ * @throws PortalException
+ */
+ public static int countNewDropBoxFiles(User user) throws NoSuchCasierEntryException, SystemException, PortalException{
+ return CasierEntryLocalServiceUtil.countByC_G_isNew(user.getCompanyId(), user.getGroup().getGroupId(), true);
+ }
+
+
+ /**
+ * Nouveaux documents dans le casier au format XML
+ * @param user
+ * @return
+ * @throws Exception
+ */
+ public static String getNewDropBoxFilesAsXML(User user) throws Exception{
+ List<CasierEntry> casierEntries = CasierEntryLocalServiceUtil.findByC_G_isNew(user.getCompanyId(), user.getGroup().getGroupId(), true);
+ casierEntries = casierEntries.subList(0, casierEntries.size()>5?4:casierEntries.size());
+
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+ org.w3c.dom.Document doc = docBuilder.newDocument();
+ Element rootElement = doc.createElement("DROPBOX");
+
+ FileEntry fileEntry = null;
+ User senderUser = null;
+ Element file = null;
+ Element title = null;
+ Element sender = null;
+ Element date = null;
+ Element url = null;
+
+ for(CasierEntry casierEntry: casierEntries){
+ fileEntry = DLAppLocalServiceUtil.getFileEntry(casierEntry.getEntryId());
+ senderUser = UserLocalServiceUtil.getUser(casierEntry.getSenderId());
+
+ file = doc.createElement("FILE");
+
+ // Title
+ title = doc.createElement("TITLE");
+ title.appendChild(doc.createTextNode(fileEntry.getTitle()));
+ file.appendChild(title);
+
+ // Sender
+ sender = doc.createElement("SENDER");
+ sender.appendChild(doc.createTextNode(senderUser.getFullName()));
+ file.appendChild(sender);
+
+ // Send Date
+ date = doc.createElement("DATE");
+ date.appendChild(doc.createTextNode(frenchDateFormat.format(casierEntry.getSendDate())));
+ file.appendChild(date);
+
+ // Url
+ url = doc.createElement("URL");
+ url.appendChild(doc.createTextNode(PortalUtil.getPortalProperties().getProperty("absolute.url") + "/user/" + user.getLogin() + "/casier?entryId=" + fileEntry.getFileEntryId()));
+ file.appendChild(url);
+
+ rootElement.appendChild(file);
+ }
+
+ TransformerFactory transFactory = TransformerFactory.newInstance();
+ Transformer transformer = transFactory.newTransformer();
+ StringWriter buffer = new StringWriter();
+ transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+ transformer.transform(new DOMSource(rootElement), new StreamResult(buffer));
+
+ return buffer.toString();
+ }
+
+ /**
+ * Nouveaux documents dans le casier au format JSON
+ * @param user
+ * @return
+ * @throws NoSuchCasierEntryException
+ * @throws SystemException
+ * @throws PortalException
+ */
+ public static String getNewDropBoxFilesAsJSON(User user) throws NoSuchCasierEntryException, SystemException, PortalException{
+ List<CasierEntry> casierEntries = CasierEntryLocalServiceUtil.findByC_G_isNew(user.getCompanyId(), user.getGroup().getGroupId(), true);
+ casierEntries = casierEntries.subList(0, casierEntries.size()>5?4:casierEntries.size());
+
+ JSONObject result = JSONFactoryUtil.createJSONObject();
+ JSONArray objects = JSONFactoryUtil.createJSONArray();
+
+ FileEntry fileEntry = null;
+ User senderUser = null;
+ JSONObject object = null;
+
+ for(CasierEntry casierEntry: casierEntries){
+ fileEntry = DLAppLocalServiceUtil.getFileEntry(casierEntry.getEntryId());
+ senderUser = UserLocalServiceUtil.getUser(casierEntry.getSenderId());
+
+ object = JSONFactoryUtil.createJSONObject();
+ object.put("title", fileEntry.getTitle());
+ object.put("sender", senderUser.getFullName());
+ object.put("date", frenchDateFormat.format(casierEntry.getSendDate()));
+ object.put("url", PortalUtil.getPortalProperties().getProperty("absolute.url") + "/user/" + user.getLogin() + "/casier?entryId=" + fileEntry.getFileEntryId());
+
+ objects.put(object);
+ }
+
+ result.put("dropbox", objects);
+
+ return result.toString();
+ }
+
+ /**
+ * Prochains evenements du CDT au format XML
+ * @param user
+ * @return
+ * @throws Exception
+ */
+ public static String getEventCDTsAsXML(User user) throws Exception{
+ GregorianCalendar startDay = new GregorianCalendar();
+ Calendar endDay = new GregorianCalendar();
+ endDay.add(Calendar.DAY_OF_YEAR, 50);
+
+ int showFilter = 1;
+ boolean onlyCreator = true;
+
+ if(isEleve || isParent){
+ showFilter = 2;
+ onlyCreator = false;
+ }
+
+ List<EventCDT> eventCDTs = CDTUtil.calendarEvent_list(user.getUserId(), showFilter, -1l, "[-1]", onlyCreator, startDay.getTime(), endDay.getTime(), 0);
+ eventCDTs = eventCDTs.subList(0, eventCDTs.size()>5?4:eventCDTs.size());
+
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+ org.w3c.dom.Document doc = docBuilder.newDocument();
+ Element rootElement = doc.createElement("CDT");
+
+ Matiere matiere = null;
+ Element event = null;
+ Element date = null;
+ Element title = null;
+ Element subject = null;
+ Element type = null;
+ Element url = null;
+
+ for(EventCDT eventCDT: eventCDTs){
+ matiere = MatiereLocalServiceUtil.getMatiere(eventCDT.getSubjectCDT());
+
+ event = doc.createElement("EVENT");
+
+ // Date
+ date = doc.createElement("DATE");
+ date.appendChild(doc.createTextNode(frenchDateFormat.format(eventCDT.getStartDay())));
+ event.appendChild(date);
+
+ // Title
+ title = doc.createElement("TITLE");
+ title.appendChild(doc.createTextNode(eventCDT.getSubject()));
+ event.appendChild(title);
+
+ // Subject
+ subject = doc.createElement("SUBJECT");
+ subject.appendChild(doc.createTextNode(matiere.getLabelLong()));
+ event.appendChild(subject);
+
+ // TYPE
+ type = doc.createElement("TYPE");
+ type.appendChild(doc.createTextNode((showFilter == 1?"Cours":"Devoir")));
+ event.appendChild(type);
+
+ // Url
+ url = doc.createElement("URL");
+ url.appendChild(doc.createTextNode(PortalUtil.getPortalProperties().getProperty("absolute.url") + "/user/" + user.getLogin() + "/cahier-de-texte?eventId=" + eventCDT.getEvtId()));
+ event.appendChild(url);
+
+ rootElement.appendChild(event);
+ }
+
+ TransformerFactory transFactory = TransformerFactory.newInstance();
+ Transformer transformer = transFactory.newTransformer();
+ StringWriter buffer = new StringWriter();
+ transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+ transformer.transform(new DOMSource(rootElement), new StreamResult(buffer));
+
+ return buffer.toString();
+ }
+
+ /**
+ * Prochains evenements du CDT au format JSON
+ * @param user
+ * @return
+ * @throws Exception
+ */
+ public static String getEventCDTsAsJSON(User user) throws Exception{
+ GregorianCalendar startDay = new GregorianCalendar();
+ Calendar endDay = new GregorianCalendar();
+ endDay.add(Calendar.DAY_OF_YEAR, 50);
+
+ int showFilter = 1;
+
+ if(isEleve || isParent){
+ showFilter = 2;
+ }
+
+ List<EventCDT> eventCDTs = CDTUtil.calendarEvent_list(user.getUserId(), showFilter, -1l, "[-1]", false, startDay.getTime(), endDay.getTime(), 0);
+ eventCDTs = eventCDTs.subList(0, eventCDTs.size()>5?4:eventCDTs.size());
+
+ JSONObject result = JSONFactoryUtil.createJSONObject();
+ JSONArray objects = JSONFactoryUtil.createJSONArray();
+
+ Matiere matiere = null;
+ JSONObject object = null;
+
+ for(EventCDT eventCDT: eventCDTs){
+ matiere = MatiereLocalServiceUtil.getMatiere(eventCDT.getSubjectCDT());
+
+ object = JSONFactoryUtil.createJSONObject();
+
+ object.put("date", frenchDateFormat.format(eventCDT.getStartDay()));
+ object.put("title", eventCDT.getSubject());
+ object.put("subject", matiere.getLabelLong());
+ object.put("type", (showFilter == 1?"Cours":"Devoir"));
+ object.put("url", PortalUtil.getPortalProperties().getProperty("absolute.url") + "/user/" + user.getLogin() + "/cahier-de-texte?eventId=" + eventCDT.getEvtId());
+
+ objects.put(object);
+ }
+
+ result.put("cdt", objects);
+
+ return result.toString();
+ }
+
+ /**
+ * Interval de notification - 1 jour
+ */
+ public static String interval = "";
+ static {
+ GregorianCalendar today = new GregorianCalendar();
+ String currentDate = classicDateFormat.format(today.getTime());
+
+ Calendar previousDay = new GregorianCalendar();
+ previousDay.setTime(today.getTime());
+ previousDay.add(Calendar.DAY_OF_WEEK,-1);
+ String fromDate = classicDateFormat.format(previousDay.getTime());
+ interval = "[" + fromDate + " TO " + currentDate + "]";
+ }
+
+ /**
+ * Nombre de nouvelles actualites
+ * @param user
+ * @return
+ * @throws SystemException
+ */
+ public static int countNewBlogEntries(User user) throws SystemException{
+ int count = 0;
+
+ Hits blogsEntry = BlogsEntryLocalServiceUtil.searchByDate(user.getCompanyId(), 0, user.getUserId(), 0, interval, -1, -1);
+ List<Document> listBlogsEntry = blogsEntry.toList();
+ for (Document d : listBlogsEntry){
+ try{
+ long entryId = GetterUtil.getLong(d.get("entryClassPK"));
+ BlogsEntry blogEntry = BlogsEntryLocalServiceUtil.getBlogsEntry(entryId);
+ if (user.getUserId() != blogEntry.getUserId()){
+ count++;
+ }
+ } catch(Exception e){
+ // Actualite n'existe plus mais l'index est toujours present
+ }
+ }
+
+ return count;
+ }
+
+ /**
+ * Nombre de nouveaux messages dans le forum
+ * @param user
+ * @return
+ * @throws SystemException
+ */
+ public static int countNewMBMessages(User user) throws SystemException{
+ int count = 0;
+
+ Hits mbCategory = MBCategoryLocalServiceUtil.searchByDate(user.getCompanyId(), 0, null, 0, interval, -1, -1, user.getUserId());
+ List<Document> listMBCategory = mbCategory.toList();
+ for (Document doc : listMBCategory){
+ try{
+ long messageId = GetterUtil.getLong(doc.get("entryClassPK"));
+ MBMessage mbMessage = MBMessageLocalServiceUtil.getMBMessage(messageId);
+ if (user.getUserId() != mbMessage.getUserId()) {
+ PermissionChecker myPermissionChecker = PermissionCheckerFactoryUtil.create(user);
+ if (PermissionsUtils.hasUserPermissionForRessourceInGroup(myPermissionChecker, mbMessage, "VIEW")) {
+ count++;
+ }
+ }
+ } catch(Exception e){
+ // Message n'existe plus mais l'index est toujours present
+ }
+ }
+
+ return count;
+ }
+
+ /**
+ * Nombre de nouveaux dossiers
+ * @param user
+ * @return
+ * @throws SystemException
+ */
+ public static int countNewFolders(User user) throws SystemException{
+ int count = 0;
+
+ Hits folders = DLFolderLocalServiceUtil.searchByDate(user.getCompanyId(), 0, user.getUserId(), 0, interval, -1, -1);
+ List<Document> listFolders = folders.toList();
+ for (Document doc : listFolders){
+ try{
+ long folderId = GetterUtil.getLong(doc.get("entryClassPK"));
+ Folder folder = DLAppLocalServiceUtil.getFolder(folderId);
+ if (user.getUserId() != folder.getUserId() ){
+ if(folderId != 0){
+ Folder dlfo = folder;
+ PermissionChecker myPermissionChecker = PermissionCheckerFactoryUtil.create(user);
+ if (PermissionsUtils.checkFolderPermission(myPermissionChecker, dlfo, "VIEW")){
+ while(dlfo.getParentFolderId() != 0){
+ dlfo = DLAppLocalServiceUtil.getFolder(dlfo.getParentFolderId());
+ }
+ if(!dlfo.getName().contains("_TEMPORARY_")
+ && !dlfo.getName().contains("Mon cartable")
+ && !dlfo.getName().contains("_CASIER_")){
+ String groupName = ENTDisplayUtil.formatSCONETName(user,dlfo.getName());
+ if(!groupName.contains("_IM_BOX_")){
+ count++;
+ }
+ }
+ }
+ }
+ }
+ } catch(Exception e){
+ // Dossier n'existe plus mais l'index est toujours present
+ }
+ }
+
+ return count;
+ }
+
+ /**
+ * Nombre de nouveaux fichiers
+ * @param user
+ * @return
+ * @throws SystemException
+ */
+ public static int countNewFileEntries(User user) throws SystemException{
+ int count = 0;
+
+ Hits files = CustomDLStoreUtil.searchByDate(user.getCompanyId(), PortletKeys.DOCUMENT_LIBRARY, 0, user.getUserId(), null, interval, -1, -1);
+ List<Document> listFiles = files.toList();
+ for (Document doc : listFiles){
+ try{
+ long entryId = GetterUtil.getLong(doc.get("entryClassPK"));
+ FileEntry fileEntry = DLAppLocalServiceUtil.getFileEntry(entryId);
+ if (user.getUserId() != fileEntry.getUserId()){
+ PermissionChecker myPermissionChecker = PermissionCheckerFactoryUtil.create(user);
+ if (PermissionsUtils.checkFilePermission(myPermissionChecker, fileEntry, "VIEW")){
+ long dlfoId = fileEntry.getFolderId();
+ Folder dlfo = DLAppLocalServiceUtil.getFolder(dlfoId);
+ while(dlfo.getParentFolderId() != 0){
+ dlfo = DLAppLocalServiceUtil.getFolder(dlfo.getParentFolderId());
+ }
+ if(!dlfo.getName().contains("_TEMPORARY_")
+ && !dlfo.getName().contains("Mon cartable")
+ && !dlfo.getName().contains("_CASIER_")){
+ count++;
+ }
+ }
+ }
+ } catch(Exception e){
+ // Fichier n'existe plus mais l'index est toujours present
+ }
+ }
+
+ return count;
+ }
+
+ /**
+ * Nombre de nouveaux evenements
+ * @param user
+ * @return
+ * @throws SystemException
+ */
+ public static int countNewEventAgendas(User user) throws SystemException{
+ int count = 0;
+
+ Hits events = EventAgendaLocalServiceUtil.searchByDate(user.getCompanyId(), 0, 0, user.getUserId(), 0, interval, -1, -1);
+ List<Document> listEvents = events.toList();
+ for (Document doc : listEvents){
+ try{
+ long eventId = GetterUtil.getLong(doc.get("entryClassPK"));
+ EventAgenda event = EventAgendaLocalServiceUtil.getEventAgenda(eventId);
+ if (user.getUserId() != event.getCreatorId()){
+ count++;
+ }
+ } catch(Exception e){
+ // Evenement n'existe plus mais l'index est toujours present
+ }
+ }
+
+ return count;
+ }
+}
\ No newline at end of file