/*
* File : $Source: /home/cvs/EbkModules/src-modules/org/opencms/frontend/templateone/modules/CmsTemplateModules.java,v $
* Date : $Date: 2011-07-13 14:08:12 $
* Version: $Revision: 1.11 $
*
* This library is part of OpenCms -
* the Open Source Content Mananagement System
*
* Copyright (c) 2005 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 com.alkacon.opencms.v8.commons;
import com.alkacon.simapi.Simapi;
import org.opencms.file.CmsFile;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsPropertyDefinition;
import org.opencms.file.CmsResource;
import org.opencms.file.CmsResourceFilter;
import org.opencms.file.types.CmsResourceTypeFolder;
import org.opencms.file.types.I_CmsResourceType;
import org.opencms.i18n.CmsEncoder;
import org.opencms.jsp.CmsJspNavElement;
import org.opencms.loader.CmsImageScaler;
import org.opencms.main.CmsException;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.util.CmsRequestUtil;
import org.opencms.util.CmsStringUtil;
import org.opencms.xml.content.CmsXmlContent;
import org.opencms.xml.content.CmsXmlContentFactory;
import org.opencms.xml.types.CmsXmlVfsImageValue;
import org.opencms.xml.types.I_CmsXmlContentValue;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.PageContext;
import org.apache.commons.logging.Log;
/**
* A helper bean for the template one modules.<p>
*
* Provides methods to create list views with category browsing and
* convenience methods to display date values and links.<p>
*
* @author Andreas Zahner
*
* @version $Revision: 1.11 $
*
* @since 6.0.0
*/
public class CmsTemplateModules extends CmsTemplateBase {
/** Image alignment right. */
public static final String IMAGE_RIGHT = "imageright";
/** Image width variant name for medium images. */
public static final String IMG_WIDTH_MEDIUM = "medium";
/** Xml content description node. */
public static final String NODE_DESCRIPTION = "Description";
/** Xml content paragraph node. */
public static final String NODE_FAQPARAGRAPH = "NewFaqParagraph";
/** Xml content image node. */
public static final String NODE_IMAGE = "Image";
/** Xml content text node. */
public static final String NODE_TEXT = "Text";
/** Request parameter name for the category folder. */
public static final String PARAM_CATEGORYFOLDER = "categoryfolder";
/** Request parameter name for the xmlcontent folder. */
public static final String PARAM_FOLDER = "folder";
/** The log object for this class. */
private static final Log LOG = CmsLog.getLog(CmsTemplateModules.class);
/** FAQ category folder. */
private String m_categoryFolder;
/** FAQ flag if category folders are present. */
private boolean m_hasCategoryFolders;
/** Image alignment. */
private String m_imageAlignment;
/** Main image uri for image group in new image format. */
private String m_mainImageUri;
/** FAQ paragraph number. */
private int m_paragraphNumber;
/**
* @see org.opencms.jsp.CmsJspActionElement#CmsJspActionElement(PageContext, HttpServletRequest, HttpServletResponse)
*/
public CmsTemplateModules(PageContext context, HttpServletRequest req, HttpServletResponse res) {
super(context, req, res);
}
/**
* Creates a html breadcrumb navigation.<p>
*
* Instead of the NavText properties the title properties are used as anchor texts in this breadcrumb navigation!
* The navigation starts from a folder as specified in the request parameter "folder" and
* goes to the folder specified in the request parameter "categoryfolder".<p>
*
* @param separator a String to separate the anchors in the breadcrumb navigation
* @return the html for the breadcrumb navigation
*/
public String buildHtmlNavBreadcrumb(String separator) {
StringBuffer result = new StringBuffer(16);
// get the value of the start folder request parameter
String startfolder = getRequest().getParameter(PARAM_FOLDER);
// calculate levels to go down
int displayLevels = -((CmsResource.getPathLevel(getCategoryFolder()) - CmsResource.getPathLevel(startfolder)) + 1);
// get the navigation list
List<CmsJspNavElement> breadcrumb = getNavigation().getNavigationBreadCrumb(
getCategoryFolder(),
displayLevels,
-1,
true);
for (int i = 0, n = breadcrumb.size(); i < n; i++) {
CmsJspNavElement navElement = breadcrumb.get(i);
// get the title of the current navigation element
String title = navElement.getTitle();
if (CmsStringUtil.isEmptyOrWhitespaceOnly(title)) {
if (LOG.isWarnEnabled()) {
LOG.warn(Messages.get().getBundle().key(
Messages.LOG_ERR_MISSING_PROP_2,
navElement.getResourceName(),
CmsPropertyDefinition.PROPERTY_TITLE));
}
title = CmsResource.getName(navElement.getResourceName());
}
// generate the link for the navigation element
String folderUri = link(getRequestContext().getUri()
+ "?"
+ PARAM_CATEGORYFOLDER
+ "="
+ navElement.getResourceName());
// append the anchor
result.append("<a href=\"");
result.append(folderUri);
result.append("\">");
result.append(title);
result.append("</a>");
// append the separator
if (i < (n - 1)) {
result.append(separator);
}
}
return result.toString();
}
/**
* Creates a html <li> list of all folders inside the current folder.<p>
*
* Additionally, behind each folder the number of resources of a specified resource type gets listed.<p>
*
* @param resourceTypeId the resource type to count resources inside folders
* @param attrs optional html attributes to use in the <ul> tag
* @return a html <li> list of all folders inside the current folder
* @throws CmsException if something goes wrong
*/
public String buildHtmlNavList(int resourceTypeId, String attrs) throws CmsException {
// get the start folder from request
String startfolder = getCategoryFolder();
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_DEBUG_BUILD_HTML_NAVLIST_2,
startfolder,
new Integer(resourceTypeId)));
}
// read the resource tree
CmsResourceFilter filter = CmsResourceFilter.DEFAULT.addRequireType(CmsResourceTypeFolder.RESOURCE_TYPE_ID);
List<CmsResource> resourceTree = getCmsObject().readResources(startfolder, filter, true);
String indent = " ";
StringBuffer result = new StringBuffer(32);
if (resourceTree.size() > 0) {
// open the list
result.append("<ul");
if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(attrs)) {
// append additional attributes
result.append(" ").append(attrs);
}
result.append(">\n");
int indentCount = 0;
int startLevel = CmsResource.getPathLevel(getCmsObject().getSitePath(resourceTree.get(0)));
int lastLevel = startLevel;
// set flag that category folders are present
m_hasCategoryFolders = true;
for (int i = 0, n = resourceTree.size(); i < n; i++) {
CmsResource resource = resourceTree.get(i);
String resourceName = getCmsObject().getSitePath(resource);
// skip files
if (!resource.isFolder()) {
continue;
}
// count resources of the specified type inside folder
int faqCount = getResourceCount(resourceName, resourceTypeId);
int level = CmsResource.getPathLevel(resourceName);
if (lastLevel < level) {
// increase indentation level
indentCount++;
} else if (lastLevel > level) {
// decrease indentation level
indentCount--;
}
// open a new list item (by closing a previous list item first eventually)
if (level == startLevel) {
if (i == 0) {
result.append("<li>\n");
} else {
result.append("<br> \n");
result.append("</li>\n");
result.append("<li>\n");
}
}
// append a line break on sub-FAQs
if (level > startLevel) {
result.append("<br>");
}
// append indentation for sub-FAQs
for (int j = 0; j < indentCount; j++) {
result.append(indent);
}
String faqUri = link(getRequestContext().getUri() + "?" + PARAM_CATEGORYFOLDER + "=" + resourceName);
String title = getCmsObject().readPropertyObject(
resourceName,
CmsPropertyDefinition.PROPERTY_TITLE,
false).getValue(null);
if (CmsStringUtil.isEmptyOrWhitespaceOnly(title)) {
if (LOG.isWarnEnabled()) {
LOG.warn(Messages.get().getBundle().key(
Messages.LOG_ERR_MISSING_PROP_2,
resourceName,
CmsPropertyDefinition.PROPERTY_TITLE));
}
title = resource.getName();
}
// append the anchor
result.append("<a href=\"");
result.append(faqUri);
result.append("\">");
if (level == startLevel) {
result.append("<b>").append(title).append("</b>");
} else {
result.append(title);
}
result.append("</a>");
// append number of FAQ articles on "top-level" FAQs
if (level == startLevel) {
result.append(" (");
result.append(faqCount);
result.append(")\n");
}
result.append("\n");
lastLevel = level;
}
// close the last open list item
result.append("</li>\n");
// close the list
result.append("</ul>\n");
}
return result.toString();
}
/**
* Creates a html <li> list of all folders inside the current folder.<p>
*
* Additionally, behind each folder the number of resources of a specified resource type gets listed.<p>
*
* @param resourceTypeName the resource type name to count resources inside folders
* @param attrs optional html attributes to use in the <ul> tag
* @return a html <li> list of all folders inside the current folder
* @throws CmsException if something goes wrong
*/
public String buildHtmlNavList(String resourceTypeName, String attrs) throws CmsException {
I_CmsResourceType resType = OpenCms.getResourceManager().getResourceType(resourceTypeName);
return buildHtmlNavList(resType.getTypeId(), attrs);
}
/**
* Creates a HTML anchor from the values of three page context attribute names.
*
* @param hrefAttrib the name of the page context attribute containing the link URL
* @param descrAttrib the name of the page context attribute containing the link description
* @param targetAttrib the name of the page context attribute containing the link target
* @return an HTML anchor
*/
public String getAnchor(String hrefAttrib, String descrAttrib, String targetAttrib) {
String attribHref = (String)getJspContext().getAttribute(hrefAttrib);
String attribDescr = (String)getJspContext().getAttribute(descrAttrib);
boolean openBlank = Boolean.valueOf((String)getJspContext().getAttribute(targetAttrib)).booleanValue();
String description = attribDescr;
if (CmsStringUtil.isEmpty(attribDescr) || attribDescr.startsWith("???")) {
description = attribHref;
}
String href = attribHref;
if (!attribHref.toLowerCase().startsWith("http")) {
href = link(attribHref);
}
String target = "";
if (openBlank) {
target = "_blank";
}
StringBuffer anchor = new StringBuffer();
anchor.append("<a href=\"").append(href).append("\"");
if (CmsStringUtil.isNotEmpty(description)) {
anchor.append(" title=\"").append(description).append("\"");
}
if (CmsStringUtil.isNotEmpty(target)) {
anchor.append(" target=\"").append(target).append("\"");
}
anchor.append(">").append(description).append("</a>");
return anchor.toString();
}
/**
* Returns the URI of the currently displayed category folder.<p>
*
* @return the URI of the currently displayed category folder
*/
public String getCategoryFolder() {
if (m_categoryFolder == null) {
// get the category folder from request
m_categoryFolder = getRequest().getParameter(PARAM_CATEGORYFOLDER);
if (CmsStringUtil.isEmptyOrWhitespaceOnly(m_categoryFolder)) {
// no folder found in request, use folder parameter
m_categoryFolder = getRequest().getParameter(PARAM_FOLDER);
}
}
return m_categoryFolder;
}
/**
* Get Html code for images in modules: event, job and news.<p>
*
* @param showTextContent True if show text content
*
* @return Html code for images in modules: event, job and news
*/
public String getHtmlCodeToShowImageInPhotoGalleryInEventModuleOrJobModuleOrNewsModule(boolean showTextContent) {
String contentPath = getCmsObject().getRequestContext().getUri();
if (isUriChanged()) {
contentPath = getOriginalUri();
}
return getHtmlCodeToShowImageInPhotoGalleryInEventModuleOrJobModuleOrNewsModule(showTextContent, contentPath);
}
/**
* Get Html code for images in modules: event, job and news.<p>
*
* @param showTextContent True if show text content
* @param contentPath the path to the XML content with the image
*
* @return Html code for images in modules: event, job and news
*/
public String getHtmlCodeToShowImageInPhotoGalleryInEventModuleOrJobModuleOrNewsModule(
boolean showTextContent,
String contentPath) {
StringBuffer htmlTag = new StringBuffer(1024);
CmsXmlContent xmlContent = null;
Locale locale = getCmsObject().getRequestContext().getLocale();
boolean hide = false;
//setLayoutValues();
try {
CmsFile xmlFile = getCmsObject().readFile(contentPath);
xmlContent = CmsXmlContentFactory.unmarshal(getCmsObject(), xmlFile);
// get the image nodes from the XML content
// get text content
String textContent = "";
if (showTextContent) {
String xPath = NODE_TEXT + "/";
if (xmlContent.hasValue(xPath, locale)) {
textContent = xmlContent.getValue(xPath, locale).getStringValue(getCmsObject());
}
}
// get images
Iterator<I_CmsXmlContentValue> iterImages = xmlContent.getValues(NODE_IMAGE, locale).iterator();
while (iterImages.hasNext()) {
// loop all image nodes
I_CmsXmlContentValue value = iterImages.next();
String xPath = value.getPath() + "/";
xPath += NODE_IMAGE + "/";
if (xmlContent.hasValue(xPath, locale)) {
htmlTag.append(createHtmlCodePerImage(getCmsObject(), xPath, xmlContent, locale, hide, textContent));
}
hide = true;
textContent = "";
}
} catch (CmsException e) {
if (LOG.isErrorEnabled()) {
// TODO, create message resource bundle key
LOG.error(Messages.get().getBundle().key(org.opencms.loader.Messages.ERR_UNKNOWN_RESTYPE_NAME_REQ_1), e);
}
}
return htmlTag.toString();
}
/**
* Get Html code for images in faq module.<p>
*
* @return Html code for images in faq module
*/
public String getHtmlCodeToShowImageInPhotoGalleryInFaqModule() {
String contentPath = getCmsObject().getRequestContext().getUri();
if (isUriChanged()) {
contentPath = getOriginalUri();
}
return getHtmlCodeToShowImageInPhotoGalleryInFaqModule(contentPath);
}
/**
* Get Html code for images in faq module.<p>
*
* @param contentPath the path to the XML content with the image
*
* @return Html code for images in faq module
*/
public String getHtmlCodeToShowImageInPhotoGalleryInFaqModule(String contentPath) {
StringBuffer htmlTag = new StringBuffer(1024);
CmsObject cmsObject = getCmsObject();
CmsXmlContent xmlContent = null;
Locale locale = cmsObject.getRequestContext().getLocale();
boolean hide = false;
int paragraphNumber = getParagraphNumber(); // current number of used paragraph
int paragraphCounter = 0; // counter to get the current used paragraph
//setLayoutValues();
try {
CmsFile xmlFile = cmsObject.readFile(contentPath);
xmlContent = CmsXmlContentFactory.unmarshal(cmsObject, xmlFile);
// get the paragraph nodes from the XML content
Iterator<I_CmsXmlContentValue> iterParagraphs = xmlContent.getValues(NODE_FAQPARAGRAPH, locale).iterator();
while (iterParagraphs.hasNext()) {
// loop all paragraph nodes
I_CmsXmlContentValue valueParagraph = iterParagraphs.next();
if (paragraphCounter == paragraphNumber) {
String xPathParagraph = valueParagraph.getPath();
Iterator<I_CmsXmlContentValue> iterImages = xmlContent.getValues(
xPathParagraph + "/" + NODE_IMAGE,
locale).iterator();
while (iterImages.hasNext()) {
// loop all image nodes
I_CmsXmlContentValue valueImage = iterImages.next();
String xPathImage = valueImage.getPath() + "/";
xPathImage += NODE_IMAGE + "/";
if (xmlContent.hasValue(xPathImage, locale)) {
htmlTag.append(createHtmlCodePerImage(cmsObject, xPathImage, xmlContent, locale, hide, ""));
}
hide = true;
}
}
paragraphCounter += 1;
}
} catch (CmsException e) {
if (LOG.isErrorEnabled()) {
// TODO, create message resource bundle key
LOG.error(Messages.get().getBundle().key(org.opencms.loader.Messages.ERR_UNKNOWN_RESTYPE_NAME_REQ_1), e);
}
}
setParagraphNumber(paragraphNumber + 1);
return htmlTag.toString();
}
/**
* Gets image alignment.<p>
*
* @return Image alignment
*/
public String getImageAlignment() {
return m_imageAlignment;
}
/**
* Gets image uri from first picture.<p>
*
* @return Image uri from first picture
*/
public String getMainImageUri() {
return m_mainImageUri;
}
/**
* Gets current paragraph number from faq module.<p>
*
* @return Current paragraph number from faq module
*/
public int getParagraphNumber() {
return m_paragraphNumber;
}
/**
* Returns the number of resources with a given resource type inside a folder.<p>
*
* @param foldername the folder to read resources
* @param resourceTypeId the desired resource type ID
*
* @return the number of resources
*/
public int getResourceCount(String foldername, int resourceTypeId) {
int result = -1;
try {
// filter the resources with the specified id
CmsResourceFilter filter = CmsResourceFilter.DEFAULT.addRequireType(resourceTypeId);
List<CmsResource> resources = getCmsObject().readResources(foldername, filter, false);
result = resources.size();
} catch (CmsException e) {
// error reading the resources
if (LOG.isErrorEnabled()) {
LOG.error(
org.opencms.db.Messages.get().getBundle().key(
org.opencms.db.Messages.ERR_READ_RESOURCES_WITH_TYPE_2,
new Integer(resourceTypeId),
foldername),
e);
}
result = -1;
}
return result;
}
/**
* Returns the number of resources with a given resource type inside a folder.<p>
*
* @param foldername the folder to read resources
* @param resourceTypeName the desired resource type name
*
* @return the number of resources
*/
public int getResourceCount(String foldername, String resourceTypeName) {
try {
I_CmsResourceType resType = OpenCms.getResourceManager().getResourceType(resourceTypeName);
return getResourceCount(foldername, resType.getTypeId());
} catch (CmsException e) {
// error getting resource type ID
if (LOG.isErrorEnabled()) {
LOG.error(
Messages.get().getBundle().key(
org.opencms.loader.Messages.ERR_UNKNOWN_RESTYPE_NAME_REQ_1,
resourceTypeName),
e);
}
return -1;
}
}
/**
* Returns HTML code to show top messages in modules: event and news.<p>
*
* @param file File to show top message for
* @param localeString Locale in string format
* @param imgWidth the image width
* @param imgHeight the image height
* @param imgClass the image class
*
* @return HTML code to show top messages in modules: event and news
*/
public String getScaledImageTag(String file, String localeString, int imgWidth, int imgHeight, String imgClass) {
CmsObject cmsObject = getCmsObject();
CmsXmlContent xmlContent = null;
Locale locale = new Locale(localeString);
try {
CmsFile xmlFile = cmsObject.readFile(file);
xmlContent = CmsXmlContentFactory.unmarshal(cmsObject, xmlFile);
// image
String xPath = NODE_IMAGE + "/";
if (xmlContent.hasValue(xPath, locale)) {
if (!xmlContent.hasValue(xPath + NODE_DESCRIPTION, locale)) {
I_CmsXmlContentValue value = xmlContent.getValue(xPath, locale);
xPath = value.getPath() + "/" + NODE_IMAGE + "/";
return getHtmlTagForNewImageInTopMessage(
cmsObject,
xPath,
xmlContent,
locale,
imgWidth,
imgHeight,
imgClass).toString();
} else {
// old image format
I_CmsXmlContentValue value = xmlContent.getValue(xPath, locale);
xPath = value.getPath() + "/" + NODE_IMAGE + "/";
return getHtmlTagForNewImageInTopMessage(
cmsObject,
xPath,
xmlContent,
locale,
imgWidth,
imgHeight,
imgClass).toString();
}
}
} catch (CmsException e) {
if (LOG.isErrorEnabled()) {
// TODO, create message resource bundle key
LOG.error(Messages.get().getBundle().key(org.opencms.loader.Messages.ERR_UNKNOWN_RESTYPE_NAME_REQ_1), e);
}
}
return "";
}
/**
* Returns true if the currently displayed folder contains subfolders which are used as category folders.<p>
*
* This method has to be called after the method {@link CmsTemplateModules#buildHtmlNavList(int, String)}.<p>
*
* @return true if the currently displayed folder contains subfolders which are used as category folders
*/
public boolean hasCategoryFolders() {
return m_hasCategoryFolders;
}
/**
* Checks for new version of image code in modules: event, job and news.<p>
*
* @return True, if new version of image code in modules: event, job and news
*/
public boolean isNewImageCodeInEventModuleOrJobModuleOrNewsModule() {
CmsObject cmsObject = getCmsObject();
String imgUri = cmsObject.getRequestContext().getUri();
if (isUriChanged()) {
imgUri = getOriginalUri();
}
CmsXmlContent xmlContent = null;
Locale locale = cmsObject.getRequestContext().getLocale();
try {
CmsFile xmlFile = cmsObject.readFile(imgUri);
xmlContent = CmsXmlContentFactory.unmarshal(cmsObject, xmlFile);
Iterator<I_CmsXmlContentValue> iterImages = xmlContent.getValues(NODE_IMAGE, locale).iterator();
while (iterImages.hasNext()) {
// loop all paragraph nodes
I_CmsXmlContentValue value = iterImages.next();
String xPath = value.getPath() + "/";
xPath += NODE_DESCRIPTION;
if (!xmlContent.hasValue(xPath, locale)) {
return true;
}
}
} catch (CmsException e) {
if (LOG.isErrorEnabled()) {
// TODO, create message resource bundle key
LOG.error(Messages.get().getBundle().key(org.opencms.loader.Messages.ERR_UNKNOWN_RESTYPE_NAME_REQ_1), e);
}
}
return false;
}
/**
* Checks for new version of image code in faq module.<p>
*
* @return True, if new version of image code in faq module
*/
public boolean isNewImageCodeInFaqModule() {
CmsObject cmsObject = getCmsObject();
String imgUri = cmsObject.getRequestContext().getUri();
if (isUriChanged()) {
imgUri = getOriginalUri();
}
CmsXmlContent xmlContent = null;
Locale locale = cmsObject.getRequestContext().getLocale();
try {
CmsFile xmlFile = cmsObject.readFile(imgUri);
xmlContent = CmsXmlContentFactory.unmarshal(cmsObject, xmlFile);
Iterator<I_CmsXmlContentValue> iterParagraphs = xmlContent.getValues(NODE_FAQPARAGRAPH, locale).iterator();
while (iterParagraphs.hasNext()) {
// loop all paragraph nodes
I_CmsXmlContentValue valueParagraph = iterParagraphs.next();
String xPathParagraph = valueParagraph.getPath();
Iterator<I_CmsXmlContentValue> iterImages = xmlContent.getValues(
xPathParagraph + "/" + NODE_IMAGE,
locale).iterator();
while (iterImages.hasNext()) {
// loop all image nodes
I_CmsXmlContentValue valueImage = iterImages.next();
String xPath = valueImage.getPath() + "/";
xPath += NODE_DESCRIPTION;
if (!xmlContent.hasValue(xPath, locale)) {
return true;
}
}
}
} catch (CmsException e) {
if (LOG.isErrorEnabled()) {
// TODO, create message resource bundle key
LOG.error(Messages.get().getBundle().key(org.opencms.loader.Messages.ERR_UNKNOWN_RESTYPE_NAME_REQ_1), e);
}
}
return false;
}
/**
* Checks if two dates in the page context attributes have the same date and differ only from their time.<p>
*
* @param startDateAttrib the name of the page context attribute containing the start date string
* @param endDateAttrib the name of the page context attribute containing the end date string
* @return true if the two dates differ only in time, otherwise false
*/
public boolean isSameDate(String startDateAttrib, String endDateAttrib) {
String timeString = (String)getJspContext().getAttribute(startDateAttrib);
long timestamp = (new Long(timeString)).longValue();
Calendar calStart = new GregorianCalendar();
calStart.setTimeInMillis(timestamp);
timeString = (String)getJspContext().getAttribute(endDateAttrib);
timestamp = (new Long(timeString)).longValue();
Calendar calEnd = new GregorianCalendar();
calEnd.setTimeInMillis(timestamp);
return ((calStart.get(Calendar.DAY_OF_YEAR) == calEnd.get(Calendar.DAY_OF_YEAR)) && (calStart.get(Calendar.YEAR) == calEnd.get(Calendar.YEAR)));
}
/**
* Saves a {@link Date} object in the page context that was created from the value of
* a specified page context attribute.<p>
*
* @param dateAttrib the name of the page context attribute containing the date string
*/
public void setDate(String dateAttrib) {
String timeString = (String)getJspContext().getAttribute(dateAttrib);
long timestamp = 0;
try {
timestamp = (new Long(timeString)).longValue();
} catch (Exception e) {
// no valid date given
}
Date date = new Date(timestamp);
getJspContext().setAttribute("date", date);
}
/**
* Sets image alignment.<p>
*
* @param alignment Image alignment
*/
public void setImageAlignment(String alignment) {
m_imageAlignment = alignment;
}
/**
* Sets uri from first picture.<p>
*
* @param mainImageUri Image uri from first picture
*/
public void setMainImageUri(String mainImageUri) {
m_mainImageUri = mainImageUri;
}
/**
* Sets current paragraph number in faq module.<p>
*
* @param paragraphNumber Current paragraph number in faq module
*/
public void setParagraphNumber(int paragraphNumber) {
m_paragraphNumber = paragraphNumber;
}
/**
* Returns true if the bread crumb navigation should be shown.<p>
*
* This method has to be called after the method {@link CmsTemplateModules#buildHtmlNavList(int, String)}.<p>
*
* @return true if the bread crumb navigation should be shown
*/
public boolean showNavBreadCrumb() {
return hasCategoryFolders() || !getRequest().getParameter(PARAM_FOLDER).equals(getCategoryFolder());
}
/**
* Creates Html code in new format for one image.<p>
*
* @param cmsObject Current CmsObject
* @param xPath Path to current xml node
* @param xmlContent Current Xml content
* @param locale Current locale
* @param hide True, if current image is not to show
* @param textContent Text content
*
* @return Html code in new format for one image
*/
private StringBuffer createHtmlCodePerImage(
CmsObject cmsObject,
String xPath,
CmsXmlContent xmlContent,
Locale locale,
boolean hide,
String textContent) {
// process optional image
String imgDesc = "";
String paragraphType = "";
StringBuffer imgTagBuf = new StringBuffer(1024);
String imgUri = xmlContent.getStringValue(getCmsObject(), xPath, locale);
Map<String, String[]> imgParams = new HashMap<String, String[]>();
if (CmsStringUtil.isNotEmpty(imgUri)) {
int pos = imgUri.indexOf(CmsRequestUtil.URL_DELIMITER);
if (pos >= 0) {
imgParams = CmsRequestUtil.createParameterMap(imgUri.substring(pos + 1));
}
// remove eventual parameters
imgUri = CmsRequestUtil.getRequestLink(imgUri);
}
if (CmsStringUtil.isEmptyOrWhitespaceOnly(imgUri)) {
imgUri = "";
}
// main image uri for image group
if (!hide) {
setMainImageUri(imgUri);
}
String imgSize = null;
try {
imgSize = getCmsObject().readPropertyObject(imgUri, CmsPropertyDefinition.PROPERTY_IMAGE_SIZE, false).getValue();
} catch (CmsException e) {
// file property not found, ignore
}
if (imgSize != null) {
// image exists, create image tag to show
String crop = null;
// get description from parameter value
String[] descParam = imgParams.get(CmsXmlVfsImageValue.PARAM_DESCRIPTION);
if (descParam != null) {
imgDesc = CmsEncoder.unescape(descParam[0], CmsEncoder.ENCODING_UTF_8);
}
String[] typeParam = imgParams.get(CmsXmlVfsImageValue.PARAM_FORMAT);
if (typeParam != null) {
paragraphType = typeParam[0];
}
String[] cropParam = imgParams.get(CmsImageScaler.PARAM_SCALE);
if (cropParam != null) {
crop = cropParam[0];
}
// image alignment
setImageAlignment(paragraphType);
// get initialized image scaler for the image
CmsImageScaler scaler = getImageScaler(paragraphType, imgSize, crop);
scaler.setQuality(75);
scaler.setRenderMode(Simapi.RENDER_QUALITY);
// show image or image in photo gallery
imgTagBuf = createHtmlTagToShowImageInPhotoGallery(
cmsObject,
imgUri,
imgDesc,
scaler,
hide,
getMainImageUri(),
textContent);
}
return imgTagBuf;
}
/**
* Create single HTML tag to show image in photo gallery.<p>
*
* @param cmsResource Current resource
* @param imgDescr Image description
* @param imgUri Current image URI
* @param imgClass the image class
* @param scaler OpenCms scaler
* @param cmsObject Current CmsObject
*
* @return Single HTML tag to show image in photo gallery
*/
private StringBuffer createHtmlTagForNewImageInTopMessage(
CmsResource cmsResource,
String imgDescr,
String imgUri,
String imgClass,
CmsImageScaler scaler,
CmsObject cmsObject) {
StringBuffer htmlImgTagBuf = new StringBuffer(512);
String imgLinkWithScaleParams = OpenCms.getLinkManager().substituteLink(
cmsObject,
imgUri + scaler.toRequestParam());
if (CmsStringUtil.isEmpty(imgClass)) {
imgClass = "right";
}
//htmlImgTagBuf.append("<p>");
htmlImgTagBuf.append("<img class=\"").append(imgClass).append("\" src=\"").append(imgLinkWithScaleParams);
htmlImgTagBuf.append("\" alt=\"").append(imgDescr).append("\"");
htmlImgTagBuf.append("\" title=\"").append(imgDescr).append("\"");
htmlImgTagBuf.append(" border=\"0\" width=\"").append(scaler.getWidth()).append("\"");
htmlImgTagBuf.append(" height=\"").append(scaler.getHeight()).append("\"");
htmlImgTagBuf.append(" align=\"top\" /> \n");
return htmlImgTagBuf;
}
/**
* Create HTML tag to show image in photo gallery in event module.<p>
*
* @param cmsObject Current CmsObject
* @param imgUri Image uri
* @param imgDescr Image description
* @param scaler Image scaler
* @param hide True if hide current image
* @param mainImageUri Image uri from first picture
* @param textContent Text content
*
* @return HTML tag to show image in photo gallery
*/
private StringBuffer createHtmlTagToShowImageInPhotoGallery(
CmsObject cmsObject,
String imgUri,
String imgDescr,
CmsImageScaler scaler,
boolean hide,
String mainImageUri,
String textContent) {
StringBuffer htmlImgTagBuf = new StringBuffer(512);
try {
CmsResource cmsMainImageResource = cmsObject.readResource(imgUri);
//String imgName = cmsMainImageResource.getName();
StringBuffer singleHmtlTag = createSingleHtmlTagToShowImageInPhotoGallery(
cmsMainImageResource,
imgDescr,
mainImageUri,
imgUri,
scaler,
cmsObject,
hide,
textContent);
htmlImgTagBuf.append(singleHmtlTag);
} catch (CmsException e) {
// ignore
}
return htmlImgTagBuf;
}
/**
* Create single Html tag to show image in photo gallery.<p>
*
* @param cmsResource Current resource
* @param imgDescr Image description
* @param mainImgUri Main image URI
* @param imgUri Current image URI
* @param scaler OpenCms scaler
* @param cmsObject Current CmsObject
* @param hide True if to hide image
* @param textContent Text context
*
* @return Single Html tag to show image in photo gallery
*/
private StringBuffer createSingleHtmlTagToShowImageInPhotoGallery(
CmsResource cmsResource,
String imgDescr,
String mainImgUri,
String imgUri,
CmsImageScaler scaler,
CmsObject cmsObject,
boolean hide,
String textContent) {
StringBuffer htmlImgTagBuf = new StringBuffer(512);
String imgLink = OpenCms.getLinkManager().substituteLink(cmsObject, imgUri);
String imgLinkWithScaleParams = OpenCms.getLinkManager().substituteLink(
cmsObject,
imgUri + scaler.toRequestParam());
String imgPropertyTitle = ""; //getTitleFromImageToShowImageInPhotoGallery(cmsObject, cmsResource);
if (!hide) {
htmlImgTagBuf.append("<p> \n");
}
htmlImgTagBuf.append("<a href=\"").append(imgLink);
if (!CmsStringUtil.isEmpty(imgDescr)) {
htmlImgTagBuf.append("\" title=\"").append(imgDescr);
} else {
htmlImgTagBuf.append("\" title=\"").append(imgPropertyTitle);
}
htmlImgTagBuf.append("\" class=\"thickbox\" rel=\"").append(mainImgUri);
if (getImageAlignment().equals(CmsTemplateModules.IMAGE_RIGHT)) {
htmlImgTagBuf.append("\" ><img class=\"right\" src=\"").append(imgLinkWithScaleParams);
} else {
htmlImgTagBuf.append("\" ><img class=\"left\" src=\"").append(imgLinkWithScaleParams);
}
htmlImgTagBuf.append("\" alt=\"").append(imgDescr).append("\" title=\"").append(imgDescr).append("\"");
htmlImgTagBuf.append(" border=\"0\" width=\"").append(scaler.getWidth()).append("\"");
htmlImgTagBuf.append(" height=\"").append(scaler.getHeight()).append("\"");
if (hide) {
htmlImgTagBuf.append(" style=\"display:none;\"");
}
htmlImgTagBuf.append("/>").append("</a> \n");
if (CmsStringUtil.isNotEmpty(textContent)) {
htmlImgTagBuf.append(textContent);
}
return htmlImgTagBuf;
}
/**
* Creates HTML code in new format for one image in top message.<p>
*
* @param cmsObject Current CmsObject
* @param xPath Path to current xml node
* @param xmlContent Current Xml content
* @param locale Current locale
* @param imgWidth the image width
* @param imgHeight the image height
* @param imgClass the image class
*
* @return HTML code in new format for one image
*/
private StringBuffer getHtmlTagForNewImageInTopMessage(
CmsObject cmsObject,
String xPath,
CmsXmlContent xmlContent,
Locale locale,
int imgWidth,
int imgHeight,
String imgClass) {
// process optional image
String imgDesc = "";
String paragraphType = "";
StringBuffer imgTagBuf = new StringBuffer(1024);
String imgUri = xmlContent.getStringValue(getCmsObject(), xPath, locale);
Map<String, String[]> imgParams = new HashMap<String, String[]>();
if (CmsStringUtil.isNotEmpty(imgUri)) {
int pos = imgUri.indexOf(CmsRequestUtil.URL_DELIMITER);
if (pos >= 0) {
imgParams = CmsRequestUtil.createParameterMap(imgUri.substring(pos + 1));
}
// remove eventual parameters
imgUri = CmsRequestUtil.getRequestLink(imgUri);
}
if (CmsStringUtil.isEmptyOrWhitespaceOnly(imgUri)) {
imgUri = "";
}
String imgSize = null;
try {
imgSize = getCmsObject().readPropertyObject(imgUri, CmsPropertyDefinition.PROPERTY_IMAGE_SIZE, false).getValue();
} catch (CmsException e) {
// file property not found, ignore
}
if (imgSize != null) {
// image exists, create image tag to show
String crop = null;
// get description from parameter value
String[] descParam = imgParams.get(CmsXmlVfsImageValue.PARAM_DESCRIPTION);
if (descParam != null) {
imgDesc = CmsEncoder.unescape(descParam[0], CmsEncoder.ENCODING_UTF_8);
}
String[] typeParam = imgParams.get(CmsXmlVfsImageValue.PARAM_FORMAT);
if (typeParam != null) {
paragraphType = typeParam[0];
}
String[] cropParam = imgParams.get(CmsImageScaler.PARAM_SCALE);
if (cropParam != null) {
crop = cropParam[0];
}
// image alignment
setImageAlignment(paragraphType);
// get initialized image scaler for the image
CmsImageScaler scaler = getImageScalerForImagesInTopMessages(
paragraphType,
imgSize,
imgWidth,
imgHeight,
crop);
scaler.setQuality(75);
scaler.setRenderMode(Simapi.RENDER_QUALITY);
try {
CmsResource cmsMainImageResource = cmsObject.readResource(imgUri);
//String imgName = cmsMainImageResource.getName();
StringBuffer singleHmtlTag = createHtmlTagForNewImageInTopMessage(
cmsMainImageResource,
imgDesc,
imgUri,
imgClass,
scaler,
cmsObject);
imgTagBuf.append(singleHmtlTag);
} catch (CmsException e) {
// ignore
}
}
return imgTagBuf;
}
/**
* Returns an initialized image scaler depending on the image align to use.<p>
*
* @param paragraphType the paragraph type to show
* @param imgSize the image size property value containing the original image information
* @param crop the crop scale parameters
*
* @return an initialized image scaler depending on the image align to use
*/
private CmsImageScaler getImageScaler(String paragraphType, String imgSize, String crop) {
int imgWidth = 250;
// create scaler instance of original image
CmsImageScaler origImage = new CmsImageScaler(imgSize);
// create scaler with desired image width
CmsImageScaler scaler = new CmsImageScaler();
if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(crop)) {
origImage = new CmsImageScaler(crop);
scaler = new CmsImageScaler(crop);
}
scaler.setWidth(imgWidth);
scaler.setType(3);
// return scaler with result image width
return origImage.getWidthScaler(scaler);
}
/**
* Returns an initialized image scaler depending on the image align to use.<p>
*
* @param paragraphType the paragraph type to show
* @param imgSize the image size property value containing the original image information
* @param imgMaxWidth the image width
* @param imgMaxHeight the image height
* @param crop the crop scale parameters
*
* @return an initialized image scaler depending on the image align to use
*/
private CmsImageScaler getImageScalerForImagesInTopMessages(
String paragraphType,
String imgSize,
int imgMaxWidth,
int imgMaxHeight,
String crop) {
int imgWidth = 100;
if (imgMaxWidth > 0) {
imgWidth = imgMaxWidth;
}
int imgHeight = 75;
if (imgMaxHeight > 0) {
imgHeight = imgMaxHeight;
}
// create scaler instance of original image
CmsImageScaler origImage = new CmsImageScaler(imgSize);
// create scaler with desired image width
CmsImageScaler scaler = new CmsImageScaler();
if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(crop)) {
origImage = new CmsImageScaler(crop);
scaler = new CmsImageScaler(crop);
}
scaler.setType(3);
float factorWidth = (float)imgWidth / (float)origImage.getWidth();
float factorHeight = (float)imgHeight / (float)origImage.getHeight();
if ((factorWidth < 1) && (factorWidth <= factorHeight)) {
scaler.setWidth(imgWidth);
// return scaler with result image width
return origImage.getWidthScaler(scaler);
} else if ((factorHeight < 1) && (factorHeight < factorWidth)) {
// only image height is fixed
int width = 0;
int height = 0;
if (origImage.getHeight() > imgHeight) {
// height is too large, re-calculate height
float scale = (float)imgHeight / (float)origImage.getHeight();
width = Math.round(origImage.getWidth() * scale);
height = imgHeight;
} else {
// height is ok
width = origImage.getWidth();
height = origImage.getHeight();
}
scaler.setHeight(height);
scaler.setWidth(width);
return scaler;
} else {
scaler.setWidth(imgWidth);
return origImage.getWidthScaler(scaler);
}
}
}