/** * OpenKM, Open Document Management System (http://www.openkm.com) * Copyright (c) 2006-2011 Paco Avila & Josep Llort * * No bytes were intentionally harmed during the development of this application. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package com.openkm.module.direct; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import javax.jcr.ItemNotFoundException; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.Session; import javax.jcr.Workspace; import javax.jcr.query.Query; import javax.jcr.query.QueryManager; import javax.jcr.query.QueryResult; import org.hibernate.HibernateException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.openkm.bean.DashboardDocumentResult; import com.openkm.bean.DashboardFolderResult; import com.openkm.bean.DashboardMailResult; import com.openkm.bean.Document; import com.openkm.bean.Folder; import com.openkm.bean.Mail; import com.openkm.cache.UserItemsManager; import com.openkm.core.Config; import com.openkm.core.DatabaseException; import com.openkm.core.JcrSessionManager; import com.openkm.core.ParseException; import com.openkm.core.RepositoryException; import com.openkm.dao.ActivityDAO; import com.openkm.dao.DashboardDAO; import com.openkm.dao.HibernateUtil; import com.openkm.dao.QueryParamsDAO; import com.openkm.dao.bean.Activity; import com.openkm.dao.bean.Dashboard; import com.openkm.dao.bean.QueryParams; import com.openkm.dao.bean.cache.UserItems; import com.openkm.jcr.JCRUtils; import com.openkm.module.DashboardModule; import com.openkm.module.base.BaseDocumentModule; import com.openkm.module.base.BaseFolderModule; import com.openkm.module.base.BaseMailModule; import com.openkm.util.UserActivity; public class DirectDashboardModule implements DashboardModule { private static Logger log = LoggerFactory.getLogger(DirectDashboardModule.class); private static final int MAX_RESULTS = 20; @Override public List<DashboardDocumentResult> getUserLockedDocuments(String token) throws RepositoryException, DatabaseException { log.debug("getUserLockedDocuments({})", token); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } List<DashboardDocumentResult> al = getUserLockedDocuments(session); log.debug("getUserLockedDocuments: {}", al); return al; } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } } /** * Convenient method for syndication */ public List<DashboardDocumentResult> getUserLockedDocuments(Session session) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getUserLockedDocuments({})", session); String qs = "/jcr:root/okm:root//element(*, okm:document)[@jcr:lockOwner='"+session.getUserID()+"' and okm:content/@jcr:isCheckedOut=false()]"; List<DashboardDocumentResult> al = executeQueryDocument(session, qs, "LOCK_DOCUMENT", Integer.MAX_VALUE); // Check for already visited results checkVisitedDocuments(session.getUserID(), "UserLockedDocuments", al); log.debug("getUserLockedDocuments: {}", al); return al; } @Override public List<DashboardDocumentResult> getUserCheckedOutDocuments(String token) throws RepositoryException, DatabaseException { log.debug("getUserCheckedOutDocuments({})", token); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } List<DashboardDocumentResult> al = getUserCheckedOutDocuments(session); log.debug("getUserCheckedOutDocuments: {}", al); return al; } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } } /** * Convenient method for syndication */ public List<DashboardDocumentResult> getUserCheckedOutDocuments(Session session) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getUserCheckedOutDocuments({})", session); String qs = "/jcr:root/okm:root//element(*, okm:document)[@jcr:lockOwner='"+session.getUserID()+"' and okm:content/@jcr:isCheckedOut=true()]"; List<DashboardDocumentResult> al = executeQueryDocument(session, qs, "CHECKOUT_DOCUMENT", Integer.MAX_VALUE); // Check for already visited results checkVisitedDocuments(session.getUserID(), "UserCheckedOutDocuments", al); log.debug("getUserCheckedOutDocuments: {}", al); return al; } @Override public List<DashboardDocumentResult> getUserSubscribedDocuments(String token) throws RepositoryException { log.debug("getUserSubscribedDocuments({})", token); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } List<DashboardDocumentResult> al = getUserSubscribedDocuments(session); log.debug("getUserSubscribedDocuments: {}", al); return al; } catch (DatabaseException e) { throw new RepositoryException(e.getMessage(), e); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } } /** * Convenient method for syndication */ public List<DashboardDocumentResult> getUserSubscribedDocuments(Session session) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getUserSubscribedDocuments({})", session); String qs = "/jcr:root/okm:root//element(*, mix:notification)[@jcr:primaryType='okm:document' and @okm:subscriptors='"+session.getUserID()+"']"; List<DashboardDocumentResult> al = executeQueryDocument(session, qs, "SUBSCRIBE_USER", Integer.MAX_VALUE); // Check for already visited results checkVisitedDocuments(session.getUserID(), "UserSubscribedDocuments", al); log.debug("getUserSubscribedDocuments: {}", al); return al; } @Override public List<DashboardFolderResult> getUserSubscribedFolders(String token) throws RepositoryException { log.debug("getUserSubscribedFolders({})", token); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } List<DashboardFolderResult> al = getUserSubscribedFolders(session); log.debug("getUserSubscribedFolders: {}", al); return al; } catch (DatabaseException e) { throw new RepositoryException(e.getMessage(), e); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } } /** * Convenient method for syndication */ public List<DashboardFolderResult> getUserSubscribedFolders(Session session) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getUserSubscribedFolders({})", session); String qs = "/jcr:root/okm:root//element(*, mix:notification)[@jcr:primaryType='okm:folder' and @okm:subscriptors='"+session.getUserID()+"']"; List<DashboardFolderResult> al = executeQueryFolder(session, qs, "SUBSCRIBE_USER", Integer.MAX_VALUE); // Check for already visited results checkVisitedFolders(session.getUserID(), "UserSubscribedFolders", al); log.debug("getUserSubscribedFolders: {}", al); return al; } /** * Execute query with documents */ private List<DashboardDocumentResult> executeQueryDocument(Session session, String qs, String action, int maxResults) throws javax.jcr.RepositoryException, DatabaseException { List<DashboardDocumentResult> al = new ArrayList<DashboardDocumentResult>(); Workspace workspace = session.getWorkspace(); QueryManager queryManager = workspace.getQueryManager(); Query query = queryManager.createQuery(qs, Query.XPATH); QueryResult result = query.execute(); int i = 0; for (NodeIterator nit = result.getNodes(); nit.hasNext() && i++ < maxResults; ) { Node node = nit.nextNode(); Document doc = BaseDocumentModule.getProperties(session, node); DashboardDocumentResult vo = new DashboardDocumentResult(); vo.setDocument(doc); vo.setDate(ActivityDAO.getActivityDate(session.getUserID(), action, node.getUUID())); vo.setVisited(false); al.add(vo); } // Sort results Collections.sort(al, new Comparator<DashboardDocumentResult>() { public int compare(DashboardDocumentResult doc1, DashboardDocumentResult doc2) { return doc2.getDate().compareTo(doc1.getDate()); } }); return al; } /** * Execute query with folders */ private ArrayList<DashboardFolderResult> executeQueryFolder(Session session, String qs, String action, int maxResults) throws javax.jcr.RepositoryException, DatabaseException { ArrayList<DashboardFolderResult> al = new ArrayList<DashboardFolderResult>(); Workspace workspace = session.getWorkspace(); QueryManager queryManager = workspace.getQueryManager(); Query query = queryManager.createQuery(qs, Query.XPATH); QueryResult result = query.execute(); int i = 0; for (NodeIterator nit = result.getNodes(); nit.hasNext() && i++ < maxResults; ) { Node node = nit.nextNode(); Folder fld = BaseFolderModule.getProperties(session, node); DashboardFolderResult vo = new DashboardFolderResult(); vo.setFolder(fld); vo.setDate(ActivityDAO.getActivityDate(session.getUserID(), action, node.getUUID())); vo.setVisited(false); al.add(vo); } // Order results Collections.sort(al, new Comparator<DashboardFolderResult>() { public int compare(DashboardFolderResult fld1, DashboardFolderResult fld2) { return fld2.getDate().compareTo(fld1.getDate()); } }); return al; } @Override public List<DashboardDocumentResult> getUserLastUploadedDocuments(String token) throws RepositoryException { log.debug("getUserLastUploadedDocuments({})", token); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } List<DashboardDocumentResult> al = getUserLastUploadedDocuments(session); log.debug("getUserLastUploadedDocuments: {}", al); return al; } catch (DatabaseException e) { throw new RepositoryException(e.getMessage(), e); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } } /** * Convenient method for syndication */ public List<DashboardDocumentResult> getUserLastUploadedDocuments(Session session) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getUserLastUploadedDocuments({})", session); String qs = "select a.item, a.date from Activity a " + "where a.action='CREATE_DOCUMENT' and a.user= :user " + "order by a.date desc"; List<DashboardDocumentResult> al = getDocuments(session, qs); // Check for already visited results checkVisitedDocuments(session.getUserID(), "UserLastUploadedDocuments", al); log.debug("getUserLastUploadedDocuments: {}", al); return al; } @Override public List<DashboardDocumentResult> getUserLastModifiedDocuments(String token) throws RepositoryException { log.debug("getUserLastModifiedDocuments({})", token); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } List<DashboardDocumentResult> al = getUserLastModifiedDocuments(session); log.debug("getUserLastModifiedDocuments: {}", al); return al; } catch (DatabaseException e) { throw new RepositoryException(e.getMessage(), e); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } } /** * Convenient method for syndication */ public List<DashboardDocumentResult> getUserLastModifiedDocuments(Session session) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getUserLastModifiedDocuments({})", session); String qs = "select distinct a.item, max(a.date) from Activity a "+ "where a.action='SET_DOCUMENT_CONTENT' and a.user= :user "+ "group by a.item order by max(a.date) desc"; List<DashboardDocumentResult> al = getDocuments(session, qs); // Check for already visited results checkVisitedDocuments(session.getUserID(), "UserLastModifiedDocuments", al); log.debug("getUserLastModifiedDocuments: {}", al); return al; } @Override public List<DashboardDocumentResult> getUserLastDownloadedDocuments(String token) throws RepositoryException { log.debug("getUserLastDownloadedDocuments({})", token); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } List<DashboardDocumentResult> al = getUserLastDownloadedDocuments(session); log.debug("getUserLastDownloadedDocuments: {}", al); return al; } catch (DatabaseException e) { throw new RepositoryException(e.getMessage(), e); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } } /** * Convenient method for syndication */ public List<DashboardDocumentResult> getUserLastDownloadedDocuments(Session session) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getUserLastDownloadedDocuments({})", session); String qs = "select distinct a.item, max(a.date) from Activity a "+ "where a.action='GET_DOCUMENT_CONTENT' and a.user= :user "+ "group by a.item order by max(a.date) desc"; List<DashboardDocumentResult> al = getDocuments(session, qs); // Check for already visited results checkVisitedDocuments(session.getUserID(), "UserLastDownloadedDocuments", al); log.debug("getUserLastDownloadedDocuments: {}", al); return al; } @Override public List<DashboardMailResult> getUserLastImportedMails(String token) throws RepositoryException { log.debug("getUserLastImportedMails({})", token); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } List<DashboardMailResult> al = getUserLastImportedMails(session); log.debug("getUserLastImportedMails: {}", al); return al; } catch (DatabaseException e) { throw new RepositoryException(e.getMessage(), e); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } } /** * Convenient method for syndication */ public List<DashboardMailResult> getUserLastImportedMails(Session session) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getUserLastImportedMails({})", session); String sq = "from Activity a where a.action='CREATE_MAIL' and a.user= :user " + "order by a.date desc"; List<DashboardMailResult> al = getMails(session, sq); // Check for already visited results checkVisitedMails(session.getUserID(), "UserLastImportedMails", al); log.debug("getUserLastImportedMails: {}", al); return al; } @Override public List<DashboardDocumentResult> getUserLastImportedMailAttachments(String token) throws RepositoryException { log.debug("getUserLastImportedMailAttachments({})", token); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } List<DashboardDocumentResult> al = getUserLastImportedMailAttachments(session); log.debug("getUserLastImportedMailAttachments: {}", al); return al; } catch (DatabaseException e) { throw new RepositoryException(e.getMessage(), e); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } } /** * Convenient method for syndication */ public List<DashboardDocumentResult> getUserLastImportedMailAttachments(Session session) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getUserLastImportedMailAttachments({})", session); String qs = "select a.item, a.date from Activity a " + "where a.action='CREATE_MAIL_ATTACHMENT' and a.user= :user " + "order by a.date desc"; List<DashboardDocumentResult> al = getDocuments(session, qs); // Check for already visited results checkVisitedDocuments(session.getUserID(), "UserLastImportedMailAttachments", al); log.debug("getUserLastImportedMailAttachments: {}", al); return al; } /** * Get documents from statement */ @SuppressWarnings("unchecked") private ArrayList<DashboardDocumentResult> getDocuments(Session session, String qs) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getDocuments({}, {})", session, qs); ArrayList<DashboardDocumentResult> al = new ArrayList<DashboardDocumentResult>(); org.hibernate.Session hSession = null; try { hSession = HibernateUtil.getSessionFactory().openSession(); org.hibernate.Query q = hSession.createQuery(qs); q.setString("user", session.getUserID()); q.setMaxResults(MAX_RESULTS); for (Iterator<Object[]> it = q.list().iterator(); it.hasNext(); ) { Object[] actData = it.next(); String actItem = (String) actData[0]; Calendar actDate = (Calendar) actData[1]; try { boolean NodeFlag=false; //Document doc = new Document(); //added by vissu Node node = session.getRootNode(); //if actItem is UUID if(!actItem.startsWith("/okm:")){ node = session.getNodeByUUID(actItem); NodeFlag = true; }else{ //else actItem is path if (session.getRootNode().hasNode(actItem.substring(1))) { node = session.getRootNode().getNode(actItem.substring(1)); NodeFlag = true; } // doc = BaseDocumentModule.getProperties(session, node); } if(!NodeFlag) continue; Document doc = BaseDocumentModule.getProperties(session, node); DashboardDocumentResult vo = new DashboardDocumentResult(); vo.setDocument(doc); vo.setDate(actDate); vo.setVisited(false); al.add(vo); } catch (ItemNotFoundException e) { // Do nothing } } } catch (HibernateException e) { throw new DatabaseException(e.getMessage(), e); } finally { HibernateUtil.close(hSession); } log.debug("getDocuments: {}", al); return al; } /** * Get mails from statement */ @SuppressWarnings("unchecked") private ArrayList<DashboardMailResult> getMails(Session session, String qs) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getMails({}, {})", session, qs); ArrayList<DashboardMailResult> al = new ArrayList<DashboardMailResult>(); org.hibernate.Session hSession = null; try { hSession = HibernateUtil.getSessionFactory().openSession(); org.hibernate.Query q = hSession.createQuery(qs); q.setString("user", session.getUserID()); q.setMaxResults(MAX_RESULTS); for (Iterator<Activity> it = q.list().iterator(); it.hasNext(); ) { Activity act = it.next(); try { Node node = session.getNodeByUUID(act.getItem()); Mail mail = BaseMailModule.getProperties(session, node); DashboardMailResult vo = new DashboardMailResult(); vo.setMail(mail); vo.setDate(act.getDate()); vo.setVisited(false); al.add(vo); } catch (ItemNotFoundException e) { // Do nothing } } } catch (HibernateException e) { throw new DatabaseException(e.getMessage(), e); } finally { HibernateUtil.close(hSession); } log.debug("getMails: {}", al); return al; } @Override public long getUserDocumentsSize(String token) throws RepositoryException, DatabaseException { log.debug("getUserDocumentsSize({})", token); long size = 0; if (Config.USER_ITEM_CACHE) { size = getUserDocumentsSizeCached(token); } else { size = getUserDocumentsSizeLive(token); } log.debug("getUserDocumentsSize: {}", size); return size; } /** * Get user document size */ private long getUserDocumentsSizeLive(String token) throws RepositoryException, DatabaseException { log.debug("getUserDocumentsSizeLive({})", token); long size = 0; Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } size = JCRUtils.calculateQuota(session); } catch (javax.jcr.RepositoryException e) { log.error(e.getMessage(), e); throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } log.debug("getUserDocumentsSizeLive: {}", size); return size; } /** * Get user document size */ private long getUserDocumentsSizeCached(String token) throws RepositoryException, DatabaseException { log.debug("getUserDocumentsSizeCached({})", token); Session session = null; UserItems usrItems = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } usrItems = UserItemsManager.get(session.getUserID()); } catch (javax.jcr.RepositoryException e) { log.error(e.getMessage(), e); throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } log.debug("getUserDocumentsSizeCached: {}", usrItems.getSize()); return usrItems.getSize(); } @Override public List<QueryParams> getUserSearchs(String token) throws RepositoryException, DatabaseException { log.debug("getUserSearchs({})", token); List<QueryParams> ret = new ArrayList<QueryParams>(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } List<QueryParams> qParams = QueryParamsDAO.findByUser(session.getUserID()); for (Iterator<QueryParams> it = qParams.iterator(); it.hasNext(); ) { QueryParams qp = it.next(); // If this is a dashboard user search, dates are used internally if (qp.isDashboard()) { qp.setLastModifiedFrom(null); qp.setLastModifiedTo(null); ret.add(qp); } } // Activity log UserActivity.log(session.getUserID(), "GET_DASHBOARD_USER_SEARCHS", null, null); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } catch (DatabaseException e) { throw e; } finally { if (token == null) JCRUtils.logout(session); } log.debug("getUserSearchs: {}", ret); return ret; } @Override public List<DashboardDocumentResult> find(String token, int qpId) throws IOException, ParseException, RepositoryException, DatabaseException { log.debug("find({}, {})", token, qpId); List<DashboardDocumentResult> al = new ArrayList<DashboardDocumentResult>(); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } al = find(session, qpId); } catch (DatabaseException e) { throw new RepositoryException(e.getMessage(), e); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } log.debug("find: {}", al); return al; } /** * Convenient method for syndication */ public List<DashboardDocumentResult> find(Session session, int qpId) throws javax.jcr.RepositoryException, DatabaseException, ParseException, IOException { log.debug("find({}, {})", session, qpId); List<DashboardDocumentResult> al = new ArrayList<DashboardDocumentResult>(); DirectSearchModule directSearch = new DirectSearchModule(); // Get the saved query params QueryParams params = QueryParamsDAO.findByPk(qpId); log.debug("PARAMS: {}", params.toString()); // Set query date (first time) if (params.getLastModifiedTo() == null) { Calendar firstExecution = Calendar.getInstance(); firstExecution.add(Calendar.MONTH, -1); params.setLastModifiedTo(firstExecution); } Calendar lastExecution = resetHours(params.getLastModifiedTo()); Calendar actualDate = resetHours(Calendar.getInstance()); log.debug("lastExecution -> {}", lastExecution.getTime()); log.debug("actualDate -> {}", actualDate.getTime()); if (lastExecution.before(actualDate)) { params.setLastModifiedFrom(params.getLastModifiedTo()); } params.setLastModifiedTo(Calendar.getInstance()); // Prepare statement log.debug("PARAMS {}", params); String qs = directSearch.prepareStatement(params); log.debug("STATEMENT {}", qs); // Execute query al = executeQueryDocument(session, qs, null, MAX_RESULTS); // Update query params QueryParamsDAO.update(params); // Check for already visited results checkVisitedDocuments(session.getUserID(), Integer.toString(params.getId()), al); log.debug("find: {}", al); return al; } /** * Reset calendar hours */ private Calendar resetHours(Calendar cal) { Calendar tmp = (Calendar) cal.clone(); tmp.set(Calendar.HOUR_OF_DAY, 0); tmp.set(Calendar.MINUTE, 0); tmp.set(Calendar.SECOND, 0); tmp.set(Calendar.MILLISECOND, 0); return tmp; } @Override public List<DashboardDocumentResult> getLastWeekTopDownloadedDocuments(String token) throws RepositoryException { log.debug("getLastWeekTopDownloadedDocuments({})", token); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } List<DashboardDocumentResult> al = getLastWeekTopDownloadedDocuments(session); log.debug("getLastWeekTopDownloadedDocuments: {}", al); return al; } catch (DatabaseException e) { throw new RepositoryException(e.getMessage(), e); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } } /** * Convenient method for syndication */ public List<DashboardDocumentResult> getLastWeekTopDownloadedDocuments(Session session) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getLastWeekTopDownloadedDocuments({})", session); String qs = "select a.item, max(a.date) from Activity a " + "where a.action='GET_DOCUMENT_CONTENT' " + "and a.date>:date group by a.item order by count(a.item) desc"; Calendar cal = Calendar.getInstance(); cal.add(Calendar.WEEK_OF_YEAR, -1); List<DashboardDocumentResult> al = getTopDocuments(session, qs, cal); // Check for already visited results checkVisitedDocuments(session.getUserID(), "LastWeekTopDownloadedDocuments", al); log.debug("getLastWeekTopDownloadedDocuments: {}", al); return al; } @Override public List<DashboardDocumentResult> getLastMonthTopDownloadedDocuments(String token) throws RepositoryException { log.debug("getLastMonthTopDownloadedDocuments({})", token); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } List<DashboardDocumentResult> al = getLastMonthTopDownloadedDocuments(session); log.debug("getLastMonthTopDownloadedDocuments: {}", al); return al; } catch (DatabaseException e) { throw new RepositoryException(e.getMessage(), e); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } } /** * Convenient method for syndication */ public List<DashboardDocumentResult> getLastMonthTopDownloadedDocuments(Session session) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getLastMonthTopDownloadedDocuments({})", session); String qs = "select a.item, max(a.date) from Activity a " + "where a.action='GET_DOCUMENT_CONTENT' " + "and a.date>:date group by a.item order by count(a.item) desc"; Calendar cal = Calendar.getInstance(); cal.add(Calendar.MONTH, -1); List<DashboardDocumentResult> al = getTopDocuments(session, qs, cal); // Check for already visited results checkVisitedDocuments(session.getUserID(), "LastMonthTopDownloadedDocuments", al); log.debug("getLastMonthTopDownloadedDocuments: {}", al); return al; } @Override public List<DashboardDocumentResult> getLastWeekTopModifiedDocuments(String token) throws RepositoryException { log.debug("getLastWeekTopModifiedDocuments({})", token); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } List<DashboardDocumentResult> al = getLastWeekTopModifiedDocuments(session); log.debug("getLastWeekTopModifiedDocuments: {}", al); return al; } catch (DatabaseException e) { log.error(e.getMessage(), e); throw new RepositoryException(e.getMessage(), e); } catch (javax.jcr.RepositoryException e) { log.error(e.getMessage(), e); throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } } /** * Convenient method for syndication */ public List<DashboardDocumentResult> getLastWeekTopModifiedDocuments(Session session) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getLastWeekTopModifiedDocuments({})", session); String qs = "select a.item, max(a.date) from Activity a " + "where a.action='SET_DOCUMENT_CONTENT' " + "and a.date>:date group by a.item order by count(a.item) desc"; Calendar cal = Calendar.getInstance(); cal.add(Calendar.WEEK_OF_YEAR, -1); List<DashboardDocumentResult> al = getTopDocuments(session, qs, cal); // Check for already visited results checkVisitedDocuments(session.getUserID(), "LastWeekTopModifiedDocuments", al); log.debug("getLastWeekTopModifiedDocuments: {}", al); return al; } @Override public List<DashboardDocumentResult> getLastMonthTopModifiedDocuments(String token) throws RepositoryException { log.debug("getLastMonthTopModifiedDocuments({})", token); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } List<DashboardDocumentResult> al = getLastMonthTopModifiedDocuments(session); log.debug("getLastMonthTopModifiedDocuments: {}", al); return al; } catch (DatabaseException e) { throw new RepositoryException(e.getMessage(), e); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } } /** * Convenient method for syndication */ public List<DashboardDocumentResult> getLastMonthTopModifiedDocuments(Session session) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getLastMonthTopModifiedDocuments({})", session); String qs = "select a.item, max(a.date) from Activity a " + "where a.action='SET_DOCUMENT_CONTENT' " + "and a.date>:date group by a.item order by count(a.item) desc"; Calendar cal = Calendar.getInstance(); cal.add(Calendar.MONTH, -1); List<DashboardDocumentResult> al = getTopDocuments(session, qs, cal); // Check for already visited results checkVisitedDocuments(session.getUserID(), "LastMonthTopModifiedDocuments", al); log.debug("getLastMonthTopModifiedDocuments: {}", al); return al; } @Override public List<DashboardDocumentResult> getLastModifiedDocuments(String token) throws RepositoryException { log.debug("getLastModifiedDocuments({})", token); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } List<DashboardDocumentResult> al = getLastModifiedDocuments(session); log.debug("getLastModifiedDocuments: {}", al); return al; } catch (DatabaseException e) { log.error(e.getMessage(), e); throw new RepositoryException(e.getMessage(), e); } catch (javax.jcr.RepositoryException e) { log.error(e.getMessage(), e); throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } } /** * Convenient method for syndication */ public List<DashboardDocumentResult> getLastModifiedDocuments(Session session) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getLastModifiedDocuments({})", session); String qs = "select distinct a.item, max(a.date) from Activity a " + "where a.action='SET_DOCUMENT_CONTENT' " + "group by a.item order by max(a.date) desc"; List<DashboardDocumentResult> al = getTopDocuments(session, qs, null); // Check for already visited results checkVisitedDocuments(session.getUserID(), "LastModifiedDocuments", al); log.debug("getLastModifiedDocuments: {}", al); return al; } @Override public List<DashboardDocumentResult> getLastUploadedDocuments(String token) throws RepositoryException { log.debug("getLastUploadedDocuments({})", token); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } List<DashboardDocumentResult> al = getLastUploadedDocuments(session); log.debug("getLastUploadedDocuments: {}", al); return al; } catch (DatabaseException e) { throw new RepositoryException(e.getMessage(), e); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } } /** * Convenient method for syndication * TODO Tiene sentido agrupar por item siendo el UUID Ășnico? */ public List<DashboardDocumentResult> getLastUploadedDocuments(Session session) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getLastUploadedDocuments({})", session); String qs = "select distinct a.item, max(a.date) from Activity a " + "where a.action='CREATE_DOCUMENT' " + "group by a.item order by max(a.date) desc"; List<DashboardDocumentResult> al = getTopDocuments(session, qs, null); // Check for already visited results checkVisitedDocuments(session.getUserID(), "LastUploadedDocuments", al); log.debug("getLastUploadedDocuments: {}", al); return al; } /** * Get top documents */ @SuppressWarnings("unchecked") private ArrayList<DashboardDocumentResult> getTopDocuments(Session session, String qs, Calendar date) throws javax.jcr.RepositoryException, DatabaseException { log.debug("getTopDocuments({}, {}, {})", new Object[] { session, qs, (date!=null?date.getTime():"null") }); ArrayList<DashboardDocumentResult> al = new ArrayList<DashboardDocumentResult>(); org.hibernate.Session hSession = null; int cont = 0; try { hSession = HibernateUtil.getSessionFactory().openSession(); org.hibernate.Query q = hSession.createQuery(qs); if (date != null) { q.setCalendar("date", date); } // Because we can't filter only documents from /okm:root in the query //q.setMaxResults(MAX_RESULTS); // While there is more query results and the MAX_RESULT limit has reached for (Iterator<Object[]> it = q.list().iterator(); it.hasNext() && cont < MAX_RESULTS; cont++) { Object[] obj = it.next(); String resItem = (String) obj[0]; Calendar resDate = (Calendar) obj[1]; try { boolean NodeFlag=false; Node node = session.getRootNode(); //added by vissu //if actItem is UUID if(!resItem.startsWith("/okm:")){ node = session.getNodeByUUID(resItem); NodeFlag = true; }else{ //else actItem is path if (session.getRootNode().hasNode(resItem.substring(1))) { node = session.getRootNode().getNode(resItem.substring(1)); NodeFlag = true; } } //Node node = session.getNodeByUUID(resItem); if(!NodeFlag) continue; // Only documents from taxonomy if (node.getPath().startsWith("/okm:root")) { Document doc = BaseDocumentModule.getProperties(session, node); DashboardDocumentResult vo = new DashboardDocumentResult(); vo.setDocument(doc); vo.setDate(resDate); vo.setVisited(false); al.add(vo); } } catch (ItemNotFoundException e) { // Do nothing } } log.debug("getTopDocuments: {}", al); return al; } catch (HibernateException e) { throw new DatabaseException(e.getMessage(), e); } finally { HibernateUtil.close(hSession); } } @Override public void visiteNode(String token, String source, String node, Calendar date) throws RepositoryException { log.debug("visiteNode({}, {}, {}, {})", new Object[] { token, source, node, (date==null?null:date.getTime()) }); Session session = null; try { if (token == null) { session = JCRUtils.getSession(); } else { session = JcrSessionManager.getInstance().get(token); } Dashboard vo = new Dashboard(); vo.setUser(session.getUserID()); vo.setSource(source); vo.setNode(node); vo.setDate(date); DashboardDAO.createIfNew(vo); } catch (DatabaseException e) { throw new RepositoryException(e.getMessage(), e); } catch (javax.jcr.RepositoryException e) { throw new RepositoryException(e.getMessage(), e); } finally { if (token == null) JCRUtils.logout(session); } log.debug("visiteNode: void"); } /** * Check visited documents */ private void checkVisitedDocuments(String user, String source, List<DashboardDocumentResult> docResult) throws DatabaseException { List<Dashboard> visitedNodes = DashboardDAO.findByUserSource(user, source); // Set already visited nodes for (Iterator<DashboardDocumentResult> itDocs = docResult.iterator(); itDocs.hasNext(); ) { DashboardDocumentResult dsDocResult = itDocs.next(); for (Iterator<Dashboard> itVisited = visitedNodes.iterator(); itVisited.hasNext(); ) { Dashboard visitedNode = itVisited.next(); // Same node path and same activity log date ? if (visitedNode.getNode().equals(dsDocResult.getDocument().getPath()) && visitedNode.getDate().equals(dsDocResult.getDate())) { dsDocResult.setVisited(true); } } } for (Iterator<Dashboard> itVisited = visitedNodes.iterator(); itVisited.hasNext(); ) { Dashboard visitedNode = itVisited.next(); boolean old = true; for (Iterator<DashboardDocumentResult> itDocs = docResult.iterator(); itDocs.hasNext(); ) { DashboardDocumentResult dsDocResult = itDocs.next(); // Same node path and same activity log date ? if (visitedNode.getNode().equals(dsDocResult.getDocument().getPath()) && visitedNode.getDate().equals(dsDocResult.getDate())) { old = false; } } if (old) { DashboardDAO.purgeOldVisitedNode(user, source, visitedNode.getNode(), visitedNode.getDate()); } } } /** * Check visited folders */ private void checkVisitedFolders(String user, String source, List<DashboardFolderResult> fldResult) throws DatabaseException { List<Dashboard> visitedNodes = DashboardDAO.findByUserSource(user, source); // Set already visited nodes for (Iterator<DashboardFolderResult> itFlds = fldResult.iterator(); itFlds.hasNext(); ) { DashboardFolderResult dsFldResult = itFlds.next(); for (Iterator<Dashboard> itVisited = visitedNodes.iterator(); itVisited.hasNext(); ) { Dashboard visitedNode = itVisited.next(); if (visitedNode.getNode().equals(dsFldResult.getFolder().getPath()) && visitedNode.getDate().equals(dsFldResult.getDate())) { dsFldResult.setVisited(true); } } } for (Iterator<Dashboard> itVisited = visitedNodes.iterator(); itVisited.hasNext(); ) { Dashboard visitedNode = itVisited.next(); boolean old = true; for (Iterator<DashboardFolderResult> itFlds = fldResult.iterator(); itFlds.hasNext(); ) { DashboardFolderResult dsFldResult = itFlds.next(); // Same node path and same activity log date ? if (visitedNode.getNode().equals(dsFldResult.getFolder().getPath()) && visitedNode.getDate().equals(dsFldResult.getDate())) { old = false; } } if (old) { DashboardDAO.purgeOldVisitedNode(user, source, visitedNode.getNode(), visitedNode.getDate()); } } } /** * Check visited mails */ private void checkVisitedMails(String user, String source, List<DashboardMailResult> mailResult) throws DatabaseException { List<Dashboard> visitedNodes = DashboardDAO.findByUserSource(user, source); // Set already visited nodes for (Iterator<DashboardMailResult> itMails = mailResult.iterator(); itMails.hasNext(); ) { DashboardMailResult dsMailResult = itMails.next(); for (Iterator<Dashboard> itVisited = visitedNodes.iterator(); itVisited.hasNext(); ) { Dashboard visitedNode = itVisited.next(); // Same node path and same activity log date ? if (visitedNode.getNode().equals(dsMailResult.getMail().getPath()) && visitedNode.getDate().equals(dsMailResult.getDate())) { dsMailResult.setVisited(true); } } } for (Iterator<Dashboard> itVisited = visitedNodes.iterator(); itVisited.hasNext(); ) { Dashboard visitedNode = itVisited.next(); boolean old = true; for (Iterator<DashboardMailResult> itMails = mailResult.iterator(); itMails.hasNext(); ) { DashboardMailResult dsMailResult = itMails.next(); // Same node path and same activity log date ? if (visitedNode.getNode().equals(dsMailResult.getMail().getPath()) && visitedNode.getDate().equals(dsMailResult.getDate())) { old = false; } } if (old) { DashboardDAO.purgeOldVisitedNode(user, source, visitedNode.getNode(), visitedNode.getDate()); } } } }