/* * This library is part of OpenCms - * the Open Source Content Management System * * Copyright (c) Alkacon Software GmbH (http://www.alkacon.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * For further information about Alkacon Software GmbH, please see the * company website: http://www.alkacon.com * * For further information about OpenCms, please see the * project website: http://www.opencms.org * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.opencms.file.collectors; import org.opencms.file.CmsDataAccessException; import org.opencms.file.CmsObject; import org.opencms.file.CmsResource; import org.opencms.file.CmsResourceFilter; import org.opencms.file.I_CmsResource; import org.opencms.jsp.CmsJspNavBuilder; import org.opencms.jsp.CmsJspNavElement; import org.opencms.main.CmsException; import org.opencms.main.CmsIllegalArgumentException; import org.opencms.main.CmsLog; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; /** * A default resource collector to generate some example list of resources from the VFS.<p> * * @since 6.0.0 */ public class CmsDefaultResourceCollector extends A_CmsResourceCollector { /** Static array of the collectors implemented by this class. */ private static final String[] COLLECTORS = { "singleFile", "allInFolder", "allInFolderDateReleasedDesc", "allInFolderNavPos", "allInSubTree", "allInSubTreeDateReleasedDesc", "allInSubTreeNavPos"}; /** Array list for fast collector name lookup. */ private static final List<String> COLLECTORS_LIST = Collections.unmodifiableList(Arrays.asList(COLLECTORS)); /** The log object for this class. */ private static final Log LOG = CmsLog.getLog(CmsDefaultResourceCollector.class); /** * @see org.opencms.file.collectors.I_CmsResourceCollector#getCollectorNames() */ public List<String> getCollectorNames() { return COLLECTORS_LIST; } /** * @see org.opencms.file.collectors.I_CmsResourceCollector#getCreateLink(org.opencms.file.CmsObject, java.lang.String, java.lang.String) */ public String getCreateLink(CmsObject cms, String collectorName, String param) throws CmsDataAccessException, CmsException { // if action is not set, use default action if (collectorName == null) { collectorName = COLLECTORS[0]; } switch (COLLECTORS_LIST.indexOf(collectorName)) { case 0: // "singleFile" return null; case 1: // "allInFolder" case 2: // "allInFolderDateReleasedDesc" case 3: // "allInFolderNavPos" return getCreateInFolder(cms, param); case 4: // "allInSubTree" case 5: // "allInSubTreeDateReleasedDesc" case 6: // "allInSubTreeNavPos" return null; default: throw new CmsDataAccessException(Messages.get().container( Messages.ERR_COLLECTOR_NAME_INVALID_1, collectorName)); } } /** * @see org.opencms.file.collectors.I_CmsResourceCollector#getCreateParam(org.opencms.file.CmsObject, java.lang.String, java.lang.String) */ public String getCreateParam(CmsObject cms, String collectorName, String param) throws CmsDataAccessException { // if action is not set, use default action if (collectorName == null) { collectorName = COLLECTORS[0]; } switch (COLLECTORS_LIST.indexOf(collectorName)) { case 0: // "singleFile" return null; case 1: // "allInFolder" case 2: // "allInFolderDateReleasedDesc" case 3: // "allInFolderNavPos" return param; case 4: // "allInSubTree" case 5: // "allInSubTreeDateReleasedDesc" case 6: // "allInSubTreeNavPos" return null; default: throw new CmsDataAccessException(Messages.get().container( Messages.ERR_COLLECTOR_NAME_INVALID_1, collectorName)); } } /** * @see org.opencms.file.collectors.I_CmsResourceCollector#getResults(org.opencms.file.CmsObject, java.lang.String, java.lang.String) */ public List<CmsResource> getResults(CmsObject cms, String collectorName, String param) throws CmsDataAccessException, CmsException { // if action is not set use default if (collectorName == null) { collectorName = COLLECTORS[0]; } switch (COLLECTORS_LIST.indexOf(collectorName)) { case 0: // "singleFile" return getSingleFile(cms, param); case 1: // "allInFolder" return getAllInFolder(cms, param, false); case 2: // "allInFolderDateReleasedDesc" return allInFolderDateReleasedDesc(cms, param, false); case 3: // allInFolderNavPos" return allInFolderNavPos(cms, param, false); case 4: // "allInSubTree" return getAllInFolder(cms, param, true); case 5: // "allInSubTreeDateReleasedDesc" return allInFolderDateReleasedDesc(cms, param, true); case 6: // "allInSubTreeNavPos" return allInFolderNavPos(cms, param, true); default: throw new CmsDataAccessException(Messages.get().container( Messages.ERR_COLLECTOR_NAME_INVALID_1, collectorName)); } } /** * Returns a List of all resources in the folder pointed to by the parameter * sorted by the release date, descending.<p> * * @param cms the current CmsObject * @param param the folder name to use * @param tree if true, look in folder and all child folders, if false, look only in given folder * * @return a List of all resources in the folder pointed to by the parameter * sorted by the release date, descending * * @throws CmsException if something goes wrong */ protected List<CmsResource> allInFolderDateReleasedDesc(CmsObject cms, String param, boolean tree) throws CmsException { CmsCollectorData data = new CmsCollectorData(param); String foldername = CmsResource.getFolderPath(data.getFileName()); CmsResourceFilter filter = CmsResourceFilter.DEFAULT_FILES.addRequireType(data.getType()).addExcludeFlags( CmsResource.FLAG_TEMPFILE); List<CmsResource> result = cms.readResources(foldername, filter, tree); Collections.sort(result, I_CmsResource.COMPARE_DATE_RELEASED); return shrinkToFit(result, data.getCount()); } /** * Collects all resources in a folder (or subtree) sorted by the NavPos property.<p> * * @param cms the current user's Cms object * @param param the collector's parameter(s) * @param readSubTree if true, collects all resources in the subtree * @return a List of Cms resources found by the collector * @throws CmsException if something goes wrong * */ protected List<CmsResource> allInFolderNavPos(CmsObject cms, String param, boolean readSubTree) throws CmsException { CmsCollectorData data = new CmsCollectorData(param); String foldername = CmsResource.getFolderPath(data.getFileName()); CmsResourceFilter filter = CmsResourceFilter.DEFAULT_FILES.addRequireType(data.getType()).addExcludeFlags( CmsResource.FLAG_TEMPFILE); List<CmsResource> foundResources = cms.readResources(foldername, filter, readSubTree); // the Cms resources are saved in a map keyed by their nav elements // to save time sorting the resources by the value of their NavPos property CmsJspNavBuilder navBuilder = new CmsJspNavBuilder(cms); Map<CmsJspNavElement, CmsResource> navElementMap = new HashMap<CmsJspNavElement, CmsResource>(); for (int i = 0, n = foundResources.size(); i < n; i++) { CmsResource resource = foundResources.get(i); CmsJspNavElement navElement = navBuilder.getNavigationForResource(cms.getSitePath(resource)); // check if the resource has the NavPos property set or not if ((navElement != null) && (navElement.getNavPosition() != Float.MAX_VALUE)) { navElementMap.put(navElement, resource); } else if (LOG.isInfoEnabled()) { // printing a log messages makes it a little easier to identify // resources having not the NavPos property set LOG.info(Messages.get().getBundle().key( Messages.LOG_RESOURCE_WITHOUT_NAVPROP_1, cms.getSitePath(resource))); } } // all found resources have the NavPos property set // sort the nav. elements, and pull the found Cms resources // from the map in the correct order into a list // only resources with the NavPos property set are used here List<CmsJspNavElement> navElementList = new ArrayList<CmsJspNavElement>(navElementMap.keySet()); List result = new ArrayList<CmsResource>(); Collections.sort(navElementList); for (int i = 0, n = navElementList.size(); i < n; i++) { CmsJspNavElement navElement = navElementList.get(i); result.add(navElementMap.get(navElement)); } return shrinkToFit(result, data.getCount()); } /** * Returns all resources in the folder pointed to by the parameter.<p> * * @param cms the current OpenCms user context * @param param the folder name to use * @param tree if true, look in folder and all child folders, if false, look only in given folder * * @return all resources in the folder matching the given criteria * * @throws CmsException if something goes wrong * @throws CmsIllegalArgumentException if the given param argument is not a link to a single file * */ protected List<CmsResource> getAllInFolder(CmsObject cms, String param, boolean tree) throws CmsException, CmsIllegalArgumentException { CmsCollectorData data = new CmsCollectorData(param); String foldername = CmsResource.getFolderPath(data.getFileName()); CmsResourceFilter filter = CmsResourceFilter.DEFAULT_FILES.addRequireType(data.getType()).addExcludeFlags( CmsResource.FLAG_TEMPFILE); List<CmsResource> result = cms.readResources(foldername, filter, tree); Collections.sort(result, I_CmsResource.COMPARE_ROOT_PATH); Collections.reverse(result); return shrinkToFit(result, data.getCount()); } /** * Returns a List containing the resources pointed to by the parameter.<p> * * @param cms the current CmsObject * @param param the name of the file to load * * @return a List containing the resources pointed to by the parameter * * @throws CmsException if something goes wrong */ protected List<CmsResource> getSingleFile(CmsObject cms, String param) throws CmsException { if ((param == null) || (cms == null)) { throw new CmsIllegalArgumentException(Messages.get().container(Messages.ERR_COLLECTOR_PARAM_SINGLE_FILE_0)); } // create a list and return it List<CmsResource> result = new ArrayList<CmsResource>(1); if (cms.getRequestContext().getCurrentProject().isOnlineProject()) { result.add(cms.readFile(param)); } else { // ignore release and expiration date in offline projects to be able to preview file result.add(cms.readFile(param, CmsResourceFilter.IGNORE_EXPIRATION)); } return result; } }