/** * The contents of this file are subject to the OpenMRS Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://license.openmrs.org * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. * * Copyright (C) OpenMRS, LLC. All Rights Reserved. */ package org.openmrs.messagesource.impl; import java.util.Collection; import java.util.HashSet; import java.util.Locale; import java.util.Properties; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openmrs.api.context.Context; import org.openmrs.messagesource.MessageSourceService; import org.openmrs.messagesource.MutableMessageSource; import org.openmrs.messagesource.PresentationMessage; import org.springframework.context.MessageSource; import org.springframework.context.MessageSourceResolvable; import org.springframework.context.NoSuchMessageException; /** * Extensible implementation of the MessageSourceService, which relies on injected implementations * of MutableMessageSource to actually provide the services. The sub-services are loaded by special * BeanPostProcessor handling, which looks for beans named For example: * ResourceBundleMessageSourceService can be specified in the applicationContext-service.xml file to * use the usual .properties files to provide messages. */ public class MessageSourceServiceImpl implements MessageSourceService { private Log log = LogFactory.getLog(getClass()); private Set<MutableMessageSource> availableMessageSources = new HashSet<MutableMessageSource>(); private MutableMessageSource activeMessageSource; /** * @see org.openmrs.messagesource.MessageSourceService#getMessage(java.lang.String) */ public String getMessage(String s) { return getMessage(s, null, Context.getLocale()); } /** * Gets the message source service which is currently providing services. * * @return the activeMessageSource */ public MutableMessageSource getActiveMessageSource() { return activeMessageSource; } /** * Sets the message source service which will actually provide services. * * @param activeMessageSource the activeMessageSourceService to set */ public void setActiveMessageSource(MutableMessageSource activeMessageSource) { log.debug("Setting activeMessageSource: " + activeMessageSource); this.activeMessageSource = activeMessageSource; if (!availableMessageSources.contains(activeMessageSource)) { availableMessageSources.add(activeMessageSource); } } /** * Gets the locales which are available from the current message source. * * @see org.openmrs.messagesource.MessageSourceService#getLocales() */ public Collection<Locale> getLocales() { return activeMessageSource.getLocales(); } /** * Presumes to append the messages to a message.properties file which is already being monitored * by the super ReloadableResourceBundleMessageSource. This is a blind, trusting hack. * * @see org.openmrs.messagesource.MessageSourceService#publishProperties(Properties, String, * String, String, String) * @deprecated use {@link #merge(MutableMessageSource, boolean)} instead */ public void publishProperties(Properties props, String locale, String namespace, String name, String version) { activeMessageSource.publishProperties(props, locale, namespace, name, version); } /** * Returns all available messages. * * @see org.openmrs.messagesource.MessageSourceService#getPresentations() */ public Collection<PresentationMessage> getPresentations() { return activeMessageSource.getPresentations(); } /** * @see org.springframework.context.MessageSource#getMessage(org.springframework.context.MessageSourceResolvable, * java.util.Locale) */ public String getMessage(MessageSourceResolvable resolvable, Locale locale) { return activeMessageSource.getMessage(resolvable, locale); } /** * @see org.springframework.context.MessageSource#getMessage(java.lang.String, * java.lang.Object[], java.util.Locale) */ public String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException { return activeMessageSource.getMessage(code, args, code, locale); } /** * @see org.springframework.context.MessageSource#getMessage(java.lang.String, * java.lang.Object[], java.lang.String, java.util.Locale) */ public String getMessage(String code, Object[] args, String defaultMessage, Locale locale) { return activeMessageSource.getMessage(code, args, defaultMessage, locale); } /** * @see org.openmrs.messagesource.MutableMessageSource#addPresentation(org.openmrs.messagesource.PresentationMessage) */ public void addPresentation(PresentationMessage message) { activeMessageSource.addPresentation(message); } /** * @see org.openmrs.messagesource.MutableMessageSource#addPresentation(org.openmrs.messagesource.PresentationMessage) */ public void removePresentation(PresentationMessage message) { activeMessageSource.removePresentation(message); } /** * @return the availableMessageSources */ public Set<MutableMessageSource> getMessageSources() { return availableMessageSources; } /** * @param availableMessageSources the availableMessageSources to set */ public void setMessageSources(Set<MutableMessageSource> availableMessageSources) { this.availableMessageSources.addAll(availableMessageSources); } /** * Merges messages from another message source into the active (current) message source. * * @see org.openmrs.messagesource.MutableMessageSource#merge(MutableMessageSource, boolean) */ public void merge(MutableMessageSource fromSource, boolean overwrite) { activeMessageSource.merge(fromSource, overwrite); } /** * @see org.openmrs.messagesource.MutableMessageSource#getPresentation(java.lang.String, * java.util.Locale) */ public PresentationMessage getPresentation(String key, Locale forLocale) { return activeMessageSource.getPresentation(key, forLocale); } /** * @see org.openmrs.messagesource.MutableMessageSource#getPresentationsInLocale(java.util.Locale) */ public Collection<PresentationMessage> getPresentationsInLocale(Locale locale) { return activeMessageSource.getPresentationsInLocale(locale); } /** * @see org.springframework.context.HierarchicalMessageSource#getParentMessageSource() */ public MessageSource getParentMessageSource() { return activeMessageSource.getParentMessageSource(); } /** * @see org.springframework.context.HierarchicalMessageSource#setParentMessageSource(org.springframework.context.MessageSource) */ public void setParentMessageSource(MessageSource parent) { activeMessageSource.setParentMessageSource(parent); } }