/**
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
* the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
*
* Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
* graphic logo is a trademark of OpenMRS Inc.
*/
package org.openmrs.messagesource.impl;
import java.text.MessageFormat;
import java.util.Collection;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Vector;
import org.openmrs.messagesource.MutableMessageSource;
import org.openmrs.messagesource.PresentationMessage;
import org.openmrs.messagesource.PresentationMessageMap;
import org.springframework.context.support.AbstractMessageSource;
/**
* A MutableMessageSource backed by a localized map of PresentationMessageCollections, providing
* in-memory storage of PresentationMessages. Useful for temporary storage, as a cache for other
* sources, and for testing.
*/
public class CachedMessageSource extends AbstractMessageSource implements MutableMessageSource {
Map<Locale, PresentationMessageMap> localizedMap = new HashMap<Locale, PresentationMessageMap>();
/* (non-Javadoc)
* @see org.openmrs.messagesource.MutableMessageSource#addPresentation(org.openmrs.api.PresentationMessage)
*/
@Override
public void addPresentation(PresentationMessage message) {
PresentationMessageMap codeMessageMap = localizedMap.get(message.getLocale());
if (codeMessageMap == null) {
codeMessageMap = new PresentationMessageMap(message.getLocale());
localizedMap.put(message.getLocale(), codeMessageMap);
}
codeMessageMap.put(message.getCode(), message);
}
/**
* @see org.openmrs.messagesource.MutableMessageSource#getLocales()
* @should should be able to contain multiple locales
*/
@Override
public Collection<Locale> getLocales() {
return localizedMap.keySet();
}
/* (non-Javadoc)
* @see org.openmrs.messagesource.MutableMessageSource#getPresentations()
*/
@Override
public Collection<PresentationMessage> getPresentations() {
Collection<PresentationMessage> allMessages = new Vector<PresentationMessage>();
for (Locale locale : localizedMap.keySet()) {
PresentationMessageMap codeMessageMap = localizedMap.get(locale);
allMessages.addAll(codeMessageMap.values());
}
return allMessages;
}
/* (non-Javadoc)
* @see org.openmrs.messagesource.MutableMessageSource#removePresentation(org.openmrs.api.PresentationMessage)
*/
@Override
public void removePresentation(PresentationMessage message) {
PresentationMessageMap codeMessageMap = localizedMap.get(message.getLocale());
if ((codeMessageMap != null) && codeMessageMap.containsKey(message.getCode())) {
codeMessageMap.remove(message.getCode());
}
}
@Override
public void merge(MutableMessageSource fromSource, boolean overwrite) {
for (PresentationMessage message : fromSource.getPresentations()) {
addPresentation(message);
}
}
/**
* @see org.openmrs.messagesource.MutableMessageSource#getPresentation(java.lang.String,
* java.util.Locale)
* @should match get message with presentation message
*/
@Override
public PresentationMessage getPresentation(String key, Locale forLocale) {
PresentationMessage foundPM = null;
PresentationMessageMap codeMessageMap = localizedMap.get(forLocale);
if ((codeMessageMap != null) && codeMessageMap.containsKey(key)) {
foundPM = codeMessageMap.get(key);
}
return foundPM;
}
/**
* @see org.openmrs.messagesource.MutableMessageSource#getPresentationsInLocale(java.util.Locale)
*/
@Override
public Collection<PresentationMessage> getPresentationsInLocale(Locale locale) {
Collection<PresentationMessage> foundPresentations = null;
PresentationMessageMap codeMessageMap = localizedMap.get(locale);
if (codeMessageMap != null) {
foundPresentations = codeMessageMap.values();
}
return foundPresentations;
}
/**
* @see org.springframework.context.support.AbstractMessageSource#resolveCode(java.lang.String,
* java.util.Locale)
*/
@Override
protected MessageFormat resolveCode(String code, Locale locale) {
MessageFormat resolvedMessageFormatForCode = null;
PresentationMessage pmForCode = getPresentation(code, locale);
if (pmForCode != null) {
resolvedMessageFormatForCode = new MessageFormat(pmForCode.getMessage());
}
return resolvedMessageFormatForCode;
}
}