package models.origo.core; import org.apache.commons.lang.BooleanUtils; import play.db.jpa.Model; import javax.persistence.*; import java.util.HashMap; import java.util.Map; /** * Key/Value based store for system-wide settings. * * @see SettingsKeys */ @Entity public class Settings extends Model { @MapKeyColumn(name = "name") @ElementCollection @JoinTable(name = "settings_values") @Column(name = "value") private Map<String, String> values = new HashMap<String, String>(); public Map<String, String> getValues() { return values; } public void setValues(final Map<String, String> values) { this.values = values; } public boolean containsKey(final String key) { return getValues().containsKey(key); } public void setValue(final String key, final String value) { getValues().put(key, value); } public String getValue(final String key) { return getValues().get(key); } /* * Getting general settings based on name */ public Integer getValueAsInteger(final String name) { final String value = getValues().get(name); if (value != null) { return Integer.parseInt(value); } return null; } public Long getValueAsLong(final String name) { final String value = getValues().get(name); if (value != null) { return Long.parseLong(value); } return null; } public Boolean getValueAsBoolean(String name) { final String value = getValues().get(name); if (value != null) { return BooleanUtils.toBoolean(value); } return null; } public Double getValueAsDouble(final String name) { final String value = getValues().get(name); if (value != null) { return Double.parseDouble(value); } return null; } public Float getValueAsFloat(final String name) { final String value = getValues().get(name); if (value != null) { return Float.parseFloat(value); } return null; } private static boolean hasSettingsStored() { return loadQuery().first() != null; } private static JPAQuery loadQuery() { return Settings.find("select s from Settings s"); } private static Settings doSave(Settings settings) { return settings.save(); } public static Settings load() { if (hasSettingsStored()) { return loadQuery().first(); } else { return doSave(new Settings()); } } @SuppressWarnings("unchecked") public static Settings save(Settings settings) { return settings.save(); } @Override public Settings save() { if (hasSettingsStored()) { if (!load().getId().equals(getId())) { throw new RuntimeException("Only one instance of setting should be available in the system"); } } return super.save(); } @Override public boolean create() { return hasSettingsStored() || super.create(); } }