AbstractMessageAwareFiller.java
package fr.sii.ogham.core.filler;
import java.util.Map;
import fr.sii.ogham.core.builder.configuration.ConfigurationValueBuilderHelper;
import fr.sii.ogham.core.exception.filler.FillMessageException;
import fr.sii.ogham.core.message.Message;
/**
* Base class to help to fill a particular {@link Message} type.
*
* @author Aurélien Baudet
*
* @param <M>
* the type of the message that the filler is able to handle
*/
public abstract class AbstractMessageAwareFiller<M> implements MessageFiller {
protected final Map<String, ConfigurationValueBuilderHelper<?, ?>> defaultValues;
private final Class<M> messageType;
/**
* The list of properties is indexed by an alias that is known by the
* implementation. For example, if the keys is defined like this:
*
* <pre>
* Map<String, List<String>> keys = new HashMap<>();
* keys.put("to", valueBuilder.properties("ogham.email.to.default-value"));
* keys.put("from", valueBuilder.properties("ogham.email.from.default-value", "mail.smtp.from"));
* </pre>
*
* The implementation can then retrieve real property value using map key
* (alias):
*
* <pre>
* getProperty("from");
* // will return either the value of "ogham.email.from.default-value" or
* // "mail.smtp.from"
* </pre>
*
* @param defaultValues
* a list of property keys indexed by an alias
* @param messageType
* the class of the message that this implementation can handle
*/
protected AbstractMessageAwareFiller(Map<String, ConfigurationValueBuilderHelper<?, ?>> defaultValues, Class<M> messageType) {
super();
this.defaultValues = defaultValues;
this.messageType = messageType;
}
@SuppressWarnings("unchecked")
@Override
public void fill(Message message) throws FillMessageException {
if (messageType.isAssignableFrom(message.getClass())) {
fill((M) message);
}
}
protected abstract void fill(M message);
/**
* Return whether the given property alias has at least one property key
* that is available for resolution, i.e., the value for the given key is
* not {@code null}.
*
* @param alias
* the property alias to resolve
* @return true if property exists, false otherwise
*/
protected boolean containsProperty(String alias) {
ConfigurationValueBuilderHelper<?, ?> valueBuilder = defaultValues.get(alias);
return valueBuilder != null && valueBuilder.getValue() != null;
}
/**
* Returns the value of first property represented by the provided alias
* that has a value (not {@code null}).
*
* @param alias
* the property alias to resolve
* @param valueClass
* the class of the resulting value
* @param <T>
* the type of the resulting value
* @return the property value or null
*/
@SuppressWarnings("unchecked")
protected <T> T getProperty(String alias, Class<T> valueClass) {
ConfigurationValueBuilderHelper<?, T> valueBuilder = (ConfigurationValueBuilderHelper<?, T>) defaultValues.get(alias);
return valueBuilder == null ? null : valueBuilder.getValue();
}
}