/* This file is part of Cyclos (www.cyclos.org). A project of the Social Trade Organisation (www.socialtrade.org). Cyclos 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. Cyclos 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 Cyclos; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package nl.strohalm.cyclos.utils; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.servlet.ServletContext; import nl.strohalm.cyclos.entities.settings.LocalSettings.DatePattern; import nl.strohalm.cyclos.entities.settings.LocalSettings.TimePattern; import nl.strohalm.cyclos.struts.CyclosMessageResources; import nl.strohalm.cyclos.utils.conversion.BooleanConverter; import nl.strohalm.cyclos.utils.conversion.MessageConverter; import nl.strohalm.cyclos.utils.validation.ValidationError; import nl.strohalm.cyclos.utils.validation.ValidationException; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; /** * Helper class for resource bundle access * @author luis */ public final class MessageHelper { private CyclosMessageResources messageResources; private MessageResolver messageResolver; public void addMessageResourcesLoadedListener(final MessageResourcesLoadedListener listener) { messageResources.addMessagesLoadedListener(listener); } /** * Retrieve a message for the first error on the validation exception */ public String firstErrorMessage(final ValidationException e) { if (e == null || !e.hasErrors()) { return ""; } final Collection<ValidationError> generalErrors = e.getGeneralErrors(); ValidationError error; Object[] args; if (generalErrors != null && !generalErrors.isEmpty()) { error = generalErrors.iterator().next(); args = error.getArguments().toArray(); } else { final Map<String, Collection<ValidationError>> errorsByProperty = e.getErrorsByProperty(); final Entry<String, Collection<ValidationError>> entry = errorsByProperty.entrySet().iterator().next(); final String property = entry.getKey(); final String propertyKey = e.getPropertyKey(property); error = entry.getValue().iterator().next(); final List<Object> arguments = new ArrayList<Object>(); arguments.add(StringUtils.isEmpty(propertyKey) ? property : message(propertyKey)); if (error.getArguments() != null && !error.getArguments().isEmpty()) { arguments.addAll(error.getArguments()); } args = arguments.toArray(); } return message(error.getKey(), args); } public BooleanConverter getBooleanConverter(final ServletContext context) { return new BooleanConverter(message("global.yes"), message("global.no")); } public String getDatePatternDescription(final DatePattern datePattern) { final String day = message("global.datePattern.day"); final String month = message("global.datePattern.month"); final String year = message("global.datePattern.year"); String[] parts = null; switch (datePattern) { case DD_MM_YYYY_SLASH: case DD_MM_YYYY_PERIOD: case DD_MM_YYYY_DASH: parts = new String[] { day, month, year }; break; case MM_DD_YYYY_SLASH: case MM_DD_YYYY_DASH: case MM_DD_YYYY_PERIOD: parts = new String[] { month, day, year }; break; case YYYY_MM_DD_SLASH: case YYYY_MM_DD_DASH: case YYYY_MM_DD_PERIOD: parts = new String[] { year, month, day }; break; } return StringUtils.join(parts, datePattern.getSeparator()); } public MessageConverter getMessageConverter(final ServletContext context, final String prefix) { return new MessageConverter(messageResolver, prefix); } public String getTimePatternDescription(final TimePattern timePattern) { final String hour = message("global.datePattern.hour"); final String minute = message("global.datePattern.minute"); final String second = message("global.datePattern.second"); String[] parts = null; switch (timePattern) { case HH12_MM: case HH24_MM: parts = new String[] { hour, minute }; break; case HH12_MM_SS: case HH24_MM_SS: parts = new String[] { hour, minute, second }; break; } return StringUtils.join(parts, ":"); } /** * Retrieve a message from the servlet context */ public String message(final String key, final List<Object> args) { return message(key, CollectionUtils.isEmpty(args) ? null : args.toArray()); } /** * Retrieve a message from the servlet context */ public String message(final String key, final Object... args) { try { return messageResources.getMessage(key, args); } catch (final Exception e) { return "???" + key + "???"; } } public void setMessageResolver(final MessageResolver messageResolver) { this.messageResolver = messageResolver; } public void setMessageResources(final CyclosMessageResources messageResources) { this.messageResources = messageResources; } }