/* =============================================================================== * * Part of the InfoGlue Content Management Platform (www.infoglue.org) * * =============================================================================== * * Copyright (C) * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 2, as published by the * Free Software Foundation. See the file LICENSE.html for more information. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY, including 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. / 59 Temple * Place, Suite 330 / Boston, MA 02111-1307 / USA. * * =============================================================================== */ package org.infoglue.deliver.taglib.management; /* =============================================================================== * * Part of the InfoGlue Content Management Platform (www.infoglue.org) * * =============================================================================== * * Copyright (C) * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 2, as published by the * Free Software Foundation. See the file LICENSE.html for more information. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY, including 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. / 59 Temple * Place, Suite 330 / Boston, MA 02111-1307 / USA. * * =============================================================================== */ import java.util.List; import java.util.Locale; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspTagException; import org.infoglue.cms.controllers.kernel.impl.simple.ContentController; import org.infoglue.cms.controllers.kernel.impl.simple.ContentTypeDefinitionController; import org.infoglue.cms.entities.management.ContentTypeAttribute; import org.infoglue.cms.entities.management.ContentTypeAttributeParameter; import org.infoglue.cms.entities.management.ContentTypeAttributeParameterValue; import org.infoglue.cms.entities.management.ContentTypeDefinitionVO; import org.infoglue.cms.exception.SystemException; import org.infoglue.deliver.controllers.kernel.impl.simple.TemplateController; import org.infoglue.deliver.taglib.TemplateControllerTag; /** * ContentTypeAttributeLabelTag is an InfoGlue JSP tag that fetches localized * labels of attributes or attribute values of content type definitions. * * @author Peter.Jaric@its.uu.se */ public class ContentTypeAttributeLabelTag extends TemplateControllerTag { /* Tag constants */ private static final String TAG_NAME = "contentTypeAttributeLabel"; private static final String PARAM_ATTRIBUTE_VALUE = "attributeValue"; private static final String PARAM_ATTRIBUTE = "attribute"; private static final String PARAM_CONTENT_ID = "contentId"; private static final String PARAM_CONTENT_TYPE_DEFINITION_NAME = "contentTypeDefinitionName"; /* Exception messages */ private static final String EXCEPTION_MSG_AT_LEAST_ONE_PARAM = "At least one of " + PARAM_CONTENT_ID + " or " + PARAM_CONTENT_TYPE_DEFINITION_NAME + " must be specified."; private static final String EXCEPTION_MSG_COULD_NOT_FIND_CTD = "Could not find ContentTypeDefinition with name "; private static final String EXCEPTION_MSG_OTHER_EXCEPTION = "Exception in " + TAG_NAME + ": "; private static final String CTD_VALUES_KEY = "values"; private static final String CTD_LABEL_KEY = "label"; private static final String CTD_TITLE_KEY = "title"; /* Tag parameters */ private String attribute; private ContentTypeDefinitionVO contentType; private Integer contentId; private String attributeValue; /** * Default constructor. */ public ContentTypeAttributeLabelTag() { super(); } /* * (non-Javadoc) * * @see javax.servlet.jsp.tagext.TagSupport#doStartTag() */ public int doStartTag() throws JspException { return EVAL_BODY_INCLUDE; } /* * (non-Javadoc) * * @see javax.servlet.jsp.tagext.TagSupport#doEndTag() */ public int doEndTag() throws JspException { try { ContentTypeDefinitionVO ctd; // Get the content type definition. if (contentType != null) { // If we have a content type already specified, use that ctd = contentType; } else if (contentId != null) { // otherwise get it from the content with contentId Integer ctdId = ContentController.getContentController().getContentVOWithId(contentId).getContentTypeDefinitionId(); ctd = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOWithId(ctdId); } else { // Neither was specified. Error! throw new JspTagException(EXCEPTION_MSG_AT_LEAST_ONE_PARAM); } String label; // Get the localized label if (attributeValue != null) { // If an attributeValue name was specified, we should retrieve // the localized label of that value label = getAttributeValueLabel(getController(), ctd, attribute, attributeValue); } else { // Otherwise just get localized label of the attribute label = getAttributeLabel(getController(), ctd, attribute); } // We have a label, give it to the page produceResult(label); } catch (SystemException e) { throw new JspTagException(EXCEPTION_MSG_OTHER_EXCEPTION + e.getMessage()); } // Make sure everything is reset for the next call to this tag resetParameters(); return EVAL_PAGE; } public void setContentId(final String contentId) throws JspException { this.contentId = evaluateInteger(TAG_NAME, PARAM_CONTENT_ID, contentId); } public void setContentTypeDefinitionName(final String contentTypeDefinitionName) throws JspException { ContentTypeDefinitionVO contentType; String evaluatedName = evaluateString(TAG_NAME, PARAM_CONTENT_TYPE_DEFINITION_NAME, contentTypeDefinitionName); // Try to fetch the content type matching contentTypeDefinitionName try { contentType = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOWithName(evaluatedName); } catch (Exception e) { contentType = null; } if (contentType != null) { // If we got a content type, use it this.contentType = contentType; } else { // Otherwise throw an exception that tells the caller that the // contentTypeDefinitionName was wrong throw new JspException(EXCEPTION_MSG_COULD_NOT_FIND_CTD + contentTypeDefinitionName); } } public void setAttribute(final String attribute) throws JspException { this.attribute = evaluateString(TAG_NAME, PARAM_ATTRIBUTE, attribute); } public void setAttributeValue(final String attributeValue) throws JspException { this.attributeValue = evaluateString(TAG_NAME, PARAM_ATTRIBUTE_VALUE, attributeValue); } private void resetParameters() { contentId = null; contentType = null; attribute = null; attributeValue = null; } /** * Returns the localized version of the label of a content type's attribute. * * @param pc * @param contentVO * @param attributeName * @return * @throws SystemException * @throws SystemException */ private static String getAttributeLabel(TemplateController pc, ContentTypeDefinitionVO ctd, String attributeName) throws SystemException { Locale currentLocale = pc.getLocale(); ContentTypeAttribute attr = getContentTypeDefinitionAttribute(ctd, attributeName); if (attr != null) { return attr.getContentTypeAttribute(CTD_TITLE_KEY).getContentTypeAttributeParameterValue().getLocalizedValue(CTD_LABEL_KEY, currentLocale); } else { return null; } } /** * Returns the localized version of the label of a value of a content type's * attribute. * * @param pc * @param contentVO * @param attributeName * @return * @throws SystemException */ private static String getAttributeValueLabel(TemplateController pc, ContentTypeDefinitionVO ctd, String attributeName, String attributeValueName) throws SystemException { Locale currentLocale = pc.getLocale(); ContentTypeAttribute attr = getContentTypeDefinitionAttribute(ctd, attributeName); if (attr != null) { ContentTypeAttributeParameter valuesParameter = // This method actually gets a ContentTypeAttributeParameter attr.getContentTypeAttribute(CTD_VALUES_KEY); if (valuesParameter != null) { ContentTypeAttributeParameterValue value = valuesParameter.getContentTypeAttributeParameterValue(attributeValueName); if (value != null) { return value.getLocalizedValue(CTD_LABEL_KEY, currentLocale); } } } return null; } /** * Returns an attribute from the specified schema. * * @param contentVO * @param attributeName * @param schema * @return * @throws SystemException */ private static ContentTypeAttribute getContentTypeDefinitionAttribute(ContentTypeDefinitionVO ctd, String attributeName) throws SystemException { List<ContentTypeAttribute> attrs = ContentTypeDefinitionController.getController().getContentTypeAttributes(ctd, true); for (ContentTypeAttribute attr : attrs) { if (attr.getName().equals(attributeName)) { return attr; } } // The attribute name was not found. return null; } }