com.github.fge.msgsimple.provider.StaticMessageSourceProvider Maven / Gradle / Ivy
/*
* Copyright (c) 2013, Francis Galiegue
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Lesser GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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
* Lesser 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, see .
*/
package com.github.fge.msgsimple.provider;
import com.github.fge.msgsimple.InternalBundle;
import com.github.fge.msgsimple.source.MessageSource;
import javax.annotation.concurrent.Immutable;
import javax.annotation.concurrent.NotThreadSafe;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
/**
* Static message source provider
*
* The simplest form of such a provider is one which only has a default
* message source. You can define specific message sources for specific
* locales too.
*
* Convenience static factory methods exist for building a message source
* provider from a single message source; for more elaborage scenarios, you need
* to use a {@link Builder} (using the {@link #newBuilder()} method).
*
* @see Builder
*/
@Immutable
public final class StaticMessageSourceProvider
implements MessageSourceProvider
{
private static final InternalBundle BUNDLE
= InternalBundle.getInstance();
private final MessageSource defaultSource;
private final Map sources;
/**
* Create a new static source builder
*
* @return a builder
*/
public static Builder newBuilder()
{
return new Builder();
}
/**
* Convenience method to create a provider with a single source
*
* This source will be used for all locales.
*
* @param source the message source
* @return a message provider
* @see Builder#setDefaultSource(MessageSource)
*/
public static MessageSourceProvider withSingleSource(
final MessageSource source)
{
return new Builder().setDefaultSource(source).build();
}
/**
* Convenience method to create a provider with a single source for a
* specific locale
*
* @param locale the locale
* @param source the message source
* @return a message provider
* @see Builder#addSource(Locale, MessageSource)
*/
public static MessageSourceProvider withSingleSource(final Locale locale,
final MessageSource source)
{
return new Builder().addSource(locale, source).build();
}
private StaticMessageSourceProvider(final Builder builder)
{
defaultSource = builder.defaultSource;
sources = new HashMap(builder.sources);
}
@Override
public MessageSource getMessageSource(final Locale locale)
{
return sources.containsKey(locale) ? sources.get(locale)
: defaultSource;
}
/**
* Builder for a {@link StaticMessageSourceProvider}
*/
@NotThreadSafe
public static final class Builder
{
private MessageSource defaultSource;
private final Map sources
= new HashMap();
private Builder()
{
}
/**
* Add a message source for a given locale
*
* @param locale the locale
* @param source the message source
* @throws NullPointerException either the locale or the source is null
* @return this
*/
public Builder addSource(final Locale locale,
final MessageSource source)
{
BUNDLE.checkNotNull(locale, "cfg.nullKey");
BUNDLE.checkNotNull(source, "cfg.nullSource");
sources.put(locale, source);
return this;
}
/**
* Set a default message source
*
* @param source the message source
* @throws NullPointerException source is null
* @return this
*/
public Builder setDefaultSource(final MessageSource source)
{
BUNDLE.checkNotNull(source, "cfg.nullDefaultSource");
defaultSource = source;
return this;
}
/**
* Build the message source provider
*
* @return a {@link StaticMessageSourceProvider}
*/
public MessageSourceProvider build()
{
return new StaticMessageSourceProvider(this);
}
}
}