/* * File : $Source: /alkacon/cvs/alkacon/com.alkacon.opencms.documentcenter/src/com/alkacon/opencms/documentcenter/CmsNewDocuments.java,v $ * Date : $Date: 2010/03/19 15:31:13 $ * Version: $Revision: 1.3 $ * * This file is part of the Alkacon OpenCms Add-On Module Package * * Copyright (c) 2010 Alkacon Software GmbH (http://www.alkacon.com) * * The Alkacon OpenCms Add-On Module Package 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 3 of the License, or * (at your option) any later version. * * The Alkacon OpenCms Add-On Module Package 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 the Alkacon OpenCms Add-On Module Package. * If not, see http://www.gnu.org/licenses/. * * 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. */ package com.alkacon.opencms.v8.documentcenter; import org.opencms.file.CmsObject; import org.opencms.file.CmsResource; import org.opencms.file.CmsResourceFilter; import org.opencms.main.CmsException; import org.opencms.util.CmsUUID; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Set; import java.util.StringTokenizer; import javax.servlet.http.HttpServletRequest; /** * Helper class which provides static methods for the new documents functions of the LGT intranet.<p> * * @author Andreas Zahner * * @version $Revision: 1.3 $ * * @since 6.0.0 */ public final class CmsNewDocuments { /** * Hide public constructor.<p> */ private CmsNewDocuments() { // empty } /** * Creates an HTML list with checkboxes for all given categories.<p> * * @param categories list with the categories (CmsCategory) * @param attributes optional attributes for the input tags * @return the HTML code for a category input list */ public static String buildCategoryList(List<CmsCategory> categories, String attributes) { StringBuffer retValue = new StringBuffer(128); Iterator<CmsCategory> i = categories.iterator(); int counter = 0; while (i.hasNext()) { CmsCategory curCat = i.next(); if (!"".equals(curCat.getCmsResource())) { retValue.append("<input type=\"checkbox\" name=\"cat" + counter + "\" id=\"cat" + counter + "\" value=\"" + curCat.getCmsResource() + "\""); if (attributes != null) { retValue.append(" " + attributes); } retValue.append("> "); retValue.append(curCat.getTitle() + "<br>\n"); counter++; } } // clear objects to release memory i = null; return retValue.toString(); } /** * Builds the HTML code for a select box of days.<p> * * @param timeMillis the time in milliseconds which should be preselected * @param fieldName the prefix of the name attribute * @param attributes optional additional attributes of the select tag * @param localeString the current locale String * @return the HTML code for a select box of days */ public static String buildSelectDay(long timeMillis, String fieldName, String attributes, String localeString) { StringBuffer retValue = new StringBuffer(512); Locale locale = new Locale(localeString); Calendar cal = new GregorianCalendar(locale); cal.setTimeInMillis(timeMillis); retValue.append("<select name=\"" + fieldName + "day\""); if (attributes != null) { retValue.append(" " + attributes); } retValue.append(">\n"); for (int i = 1; i < 32; i++) { retValue.append("\t<option value=\"" + i + "\""); if (cal.get(Calendar.DAY_OF_MONTH) == i) { retValue.append(" selected=\"selected\""); } retValue.append(">" + i + "</option>\n"); } retValue.append("</select>\n"); return retValue.toString(); } /** * Builds the HTML code for a select box of months.<p> * * @param timeMillis the time in milliseconds which should be preselected * @param fieldName the prefix of the name attribute * @param attributes optional additional attributes of the select tag * @param localeString the current locale String * @return the HTML code for a select box of months */ public static String buildSelectMonth(long timeMillis, String fieldName, String attributes, String localeString) { StringBuffer retValue = new StringBuffer(512); Locale locale = new Locale(localeString); Calendar cal = new GregorianCalendar(locale); cal.setTimeInMillis(timeMillis); Calendar calTemp = new GregorianCalendar(locale); calTemp.setTimeInMillis(timeMillis); // set day to 2 to avoid display errors for days 29, 30 and 31 calTemp.set(Calendar.DAY_OF_MONTH, 2); DateFormat df = new SimpleDateFormat("MMMM", locale); retValue.append("<select name=\"" + fieldName + "month\""); if (attributes != null) { retValue.append(" " + attributes); } retValue.append(">\n"); for (int i = 0; i < 12; i++) { calTemp.set(Calendar.MONTH, i); retValue.append("\t<option value=\"" + (i + 1) + "\""); if (cal.get(Calendar.MONTH) == i) { retValue.append(" selected=\"selected\""); } retValue.append(">" + df.format(calTemp.getTime()) + "</option>\n"); } retValue.append("</select>\n"); return retValue.toString(); } /** * Builds the HTML code for a select box of years.<p> * * @param timeMillis the time in milliseconds which should be preselected * @param fieldName the prefix of the name attribute * @param attributes optional additional attributes of the select tag * @param localeString the current locale String * @param startyear the year to start with * @param endyear the last year to display in the selection * @return the HTML code for a select box of years */ public static String buildSelectYear( long timeMillis, String fieldName, String attributes, String localeString, int startyear, int endyear) { StringBuffer retValue = new StringBuffer(512); Locale locale = new Locale(localeString); Calendar cal = new GregorianCalendar(locale); cal.setTimeInMillis(timeMillis); if (startyear > endyear) { startyear = endyear; } retValue.append("<select name=\"" + fieldName + "year\""); if (attributes != null) { retValue.append(" " + attributes); } retValue.append(">\n"); for (int i = startyear; i <= endyear; i++) { retValue.append("\t<option value=\"" + i + "\""); if (cal.get(Calendar.YEAR) == i) { retValue.append(" selected=\"selected\""); } retValue.append(">" + i + "</option>\n"); } retValue.append("</select>\n"); return retValue.toString(); } /** * Returns a list of resources which contains no linked entries.<p> * * Links on the same resource entry are deleted from the list of resources. * This method has to be used after calling the method CmsObject.getResourcesInTimeRange(String, long, long); * * @param resources the list of resources which may contain links * @return a filtered list of resources */ public static List<CmsResource> filterLinkedResources(List<CmsResource> resources) { List<CmsResource> filteredResources = new ArrayList<CmsResource>(); Set<CmsUUID> addedResources = new HashSet<CmsUUID>(); Iterator<CmsResource> i = resources.iterator(); while (i.hasNext()) { CmsResource currentResource = i.next(); if (CmsDocumentFactory.isIgnoredDocument(currentResource.getRootPath(), true)) { // this resource is ignored, skip it before checking the resource id continue; } CmsUUID resId = currentResource.getResourceId(); if (!addedResources.contains(resId)) { // add resource to return list and ID to set addedResources.add(resId); filteredResources.add(currentResource); } } return filteredResources; } /** * Returns a String which holds the selected categories for the result page of the new documents query.<p> * * @param cms the CmsObject * @param request the HttpServletRequest * @param messageAll the localized message String used when all categories were selected * @return String with comma separated selected categories or localized "all" message */ public static String getCategories(CmsObject cms, HttpServletRequest request, String messageAll) { StringBuffer retValue = new StringBuffer(128); // get requet parameter for all categories String paramAll = request.getParameter("all"); if ("true".equals(paramAll)) { return messageAll; } else { List<String> categories = getCategoryList(request.getParameter("categorylist")); Iterator<String> i = categories.iterator(); while (i.hasNext()) { String path = i.next(); try { retValue.append(cms.readPropertyObject(path, CmsCategory.CATEGORY_TITLE, false)); } catch (CmsException e) { // should never happen } if (i.hasNext()) { retValue.append(", "); } } } return retValue.toString(); } /** * Builds a list of the categories which were selected in the form.<p> * * @param allCategories String with all selected category paths * @return List with all selected categories (holds String objects with absolute paths) */ public static List<String> getCategoryList(String allCategories) { ArrayList<String> categories = new ArrayList<String>(); // get the indiviadual category paths from the token StringTokenizer T = new StringTokenizer(allCategories, "*"); while (T.hasMoreTokens()) { String curToken = T.nextToken(); if (!"".equals(curToken.trim())) { // add the category to the list categories.add(curToken); } } return categories; } /** * Returns a list of new resources in the specified folder or category folder depending on the request parameters.<p> * * @param cms the CmsObject to perform some operations * @param request the HttpServletRequest to get the needed request parameters * @return the list of new resources */ public static List<CmsResource> getNewResources(CmsObject cms, HttpServletRequest request) { // get the needed request parameters String paramSite = request.getParameter("site"); String paramAll = request.getParameter("all"); String paramStartDate = request.getParameter("startdate"); String paramEndDate = request.getParameter("enddate"); // parse the date Strings to long long startDate = Long.parseLong(paramStartDate); long endDate = Long.parseLong(paramEndDate); // create list of categories if selected List<String> categories = new ArrayList<String>(); if (!"true".equals(paramAll)) { // search individual categories categories = getCategoryList(request.getParameter("categorylist")); if (categories.size() == 0) { return new ArrayList<CmsResource>(0); } } return getNewResourceList(cms, paramSite, startDate, endDate, categories); } /** * Creates a nice localized date String from the given String.<p> * * @param dateLongString the date as String representation of a long value * @param localeString the current locale String * @return nice formatted date string in long mode (e.g. 15. April 2003) */ public static String getNiceDate(String dateLongString, String localeString) { Locale locale = new Locale(localeString.toLowerCase()); DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, locale); Calendar cal = new GregorianCalendar(locale); cal.setTimeInMillis(Long.parseLong(dateLongString)); return df.format(cal.getTime()); } /** * Creates a nice localized date String from the given day, month and year Strings.<p> * * @param day the number of the day as String * @param month the number of the month as String * @param year the number of the year as String * @param localeString the current locale String * @return nice formatted date string in long mode (e.g. 15. April 2003) */ public static String getNiceDate(String day, String month, String year, String localeString) { Locale locale = new Locale(localeString.toLowerCase()); DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, locale); Calendar cal = new GregorianCalendar(locale); cal.set(Integer.parseInt(year), Integer.parseInt(month) - 1, Integer.parseInt(day)); return df.format(cal.getTime()); } /** * Creates a list of new resources of the specified folder and filters the unwanted resources.<p> * * If the parameter categoryFolders is an empty list, all new resources are returned, otherwise * only those resources which are in a subfolder specified by the list.<p> * @param cms the CmsObject * @param site the site root folder * @param startDate the start date in milliseconds * @param endDate the end date in milliseconds * @param categoryFolders list with subfolders * @return list of new resources */ private static List<CmsResource> getNewResourceList( CmsObject cms, String site, long startDate, long endDate, List<String> categoryFolders) { List<CmsResource> allResources = new ArrayList<CmsResource>(); // get all resources in the site root which are in the time range try { CmsResourceFilter filter = CmsResourceFilter.IGNORE_EXPIRATION.addRequireLastModifiedAfter(startDate).addRequireLastModifiedBefore( endDate); allResources = cms.readResources(site, filter); } catch (CmsException e) { // should never happen } if (categoryFolders.size() == 0) { // return all found resources with filtered links return filterLinkedResources(allResources); } else { // check every resource if it is in a subfolder of the list categoryFolders Set<CmsUUID> addedResources = new HashSet<CmsUUID>(); List<CmsResource> newResources = new ArrayList<CmsResource>(); Iterator<CmsResource> i = allResources.iterator(); while (i.hasNext()) { CmsResource curResource = i.next(); boolean add = false; String sitePath = cms.getSitePath(curResource); if (CmsDocumentFactory.isIgnoredDocument(sitePath, true)) { // this resource is ignored, skip it before checking the resource id continue; } Iterator<String> k = categoryFolders.iterator(); while (k.hasNext()) { // check if the path of the resource starts with the path of the categories in the list if (sitePath.startsWith(k.next())) { CmsUUID resId = curResource.getResourceId(); // check if the resource is a link already added to the result if (!addedResources.contains(resId)) { // add resource to return list and ID to set addedResources.add(resId); add = true; } break; } } if (add) { newResources.add(curResource); } } return newResources; } } }