From 5d891c2c6db05c4e09ae83e97983db929a258584 Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Sun, 21 Jun 2020 10:44:00 +0200 Subject: [PATCH] Improved paths for Configuration RESTful API Former-commit-id: 11867e6fa288899ace4bc3045d9f8b282cefe0c2 --- .../configuration/BigDecimalConverter.java | 6 + .../admin/configuration/BooleanConverter.java | 21 ++- .../admin/configuration/ConfigurationApi.java | 136 +++++++++++++++++- .../admin/configuration/DoubleConverter.java | 6 + .../admin/configuration/EnumConverter.java | 6 + .../LocalizedStringConverter.java | 19 +++ .../admin/configuration/LongConverter.java | 6 + .../configuration/SettingValueConverter.java | 2 + .../admin/configuration/StringConverter.java | 6 + .../configuration/StringListConverter.java | 6 + .../configuration/SettingManager.java | 13 +- 11 files changed, 217 insertions(+), 10 deletions(-) diff --git a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/BigDecimalConverter.java b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/BigDecimalConverter.java index 2f6aa10f9..1a15f55cf 100644 --- a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/BigDecimalConverter.java +++ b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/BigDecimalConverter.java @@ -20,6 +20,7 @@ package org.libreccm.api.admin.configuration; import java.math.BigDecimal; +import javax.json.Json; import javax.json.JsonNumber; import javax.json.JsonValue; import javax.ws.rs.WebApplicationException; @@ -43,4 +44,9 @@ class BigDecimalConverter implements SettingValueConverter { } } + @Override + public JsonValue convertSettingValue(final BigDecimal value) { + return Json.createValue(value); + } + } diff --git a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/BooleanConverter.java b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/BooleanConverter.java index f103cace7..1b58609d0 100644 --- a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/BooleanConverter.java +++ b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/BooleanConverter.java @@ -18,6 +18,7 @@ */ package org.libreccm.api.admin.configuration; +import javax.json.Json; import javax.json.JsonValue; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; @@ -30,16 +31,28 @@ class BooleanConverter implements SettingValueConverter { @Override public Boolean convertSettingValue(final JsonValue value) { - switch(value.getValueType()) { + switch (value.getValueType()) { case FALSE: return false; case TRUE: return true; default: throw new WebApplicationException( - "The provided value is not a boolean.", - Response.Status.BAD_REQUEST - ); + "The provided value is not a boolean.", + Response.Status.BAD_REQUEST + ); } } + + @Override + public JsonValue convertSettingValue(final Boolean value) { + if (value == null) { + return JsonValue.NULL; + } else if (value) { + return JsonValue.TRUE; + } else { + return JsonValue.FALSE; + } + } + } diff --git a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/ConfigurationApi.java b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/ConfigurationApi.java index 644493523..f0f876535 100644 --- a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/ConfigurationApi.java +++ b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/ConfigurationApi.java @@ -20,11 +20,22 @@ package org.libreccm.api.admin.configuration; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.libreccm.configuration.AbstractSetting; +import org.libreccm.configuration.BigDecimalSetting; +import org.libreccm.configuration.BooleanSetting; import org.libreccm.configuration.ConfigurationInfo; import org.libreccm.configuration.ConfigurationManager; +import org.libreccm.configuration.DoubleSetting; +import org.libreccm.configuration.EnumSetting; +import org.libreccm.configuration.LocalizedStringSetting; +import org.libreccm.configuration.LongSetting; import org.libreccm.configuration.SettingInfo; +import org.libreccm.configuration.SettingManager; +import org.libreccm.configuration.StringListSetting; +import org.libreccm.configuration.StringSetting; import org.libreccm.core.CoreConstants; import org.libreccm.l10n.LocalizedString; +import org.libreccm.security.AuthorizationRequired; import org.libreccm.security.RequiresPrivilege; import java.lang.reflect.Field; @@ -33,10 +44,14 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; import javax.json.JsonValue; import javax.transaction.Transactional; import javax.ws.rs.Consumes; @@ -54,7 +69,7 @@ import javax.ws.rs.core.Response; * @author Jens Pelzetter */ @RequestScoped -@Path("/configuration") +@Path("/configurations") public class ConfigurationApi { private static final Logger LOGGER = LogManager.getLogger( @@ -64,6 +79,9 @@ public class ConfigurationApi { @Inject private ConfigurationManager confManager; + @Inject + private SettingManager settingManager; + private final Map> converters; public ConfigurationApi() { @@ -71,7 +89,7 @@ public class ConfigurationApi { converters.put(BigDecimal.class.getName(), new BigDecimalConverter()); converters.put(Boolean.class.getName(), new BooleanConverter()); converters.put(Double.class.getName(), new DoubleConverter()); - converters.put(EnumConverter.class.getName(), new EnumConverter()); + converters.put(Set.class.getName(), new EnumConverter()); converters.put( LocalizedString.class.getName(), new LocalizedStringConverter() ); @@ -83,6 +101,7 @@ public class ConfigurationApi { @GET @Path("/") @Produces(MediaType.APPLICATION_JSON) + @AuthorizationRequired @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) @Transactional(Transactional.TxType.REQUIRED) public List getConfigurations() { @@ -96,6 +115,7 @@ public class ConfigurationApi { @GET @Path("/{confName}") @Produces(MediaType.APPLICATION_JSON) + @AuthorizationRequired @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) @Transactional(Transactional.TxType.REQUIRED) public ConfigurationInfo getConfiguration( @@ -123,8 +143,115 @@ public class ConfigurationApi { } @GET - @Path("/{confName}/{setting}") + @Path("/{confName}/settings") @Produces(MediaType.APPLICATION_JSON) + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional(Transactional.TxType.REQUIRED) + public JsonObject getSettings(@PathParam("confName") final String confName) { + // Check if class exists. + try { + Class.forName(confName); + } catch (ClassNotFoundException ex) { + throw new WebApplicationException( + String.format("No configuration %s available.", confName), + Response.Status.NOT_FOUND + ); + } + + final List settings = settingManager + .retrieveAllSettings(confName); + final JsonObjectBuilder builder = Json.createObjectBuilder(); + + settings + .stream() + .forEach( + setting -> builder.add( + setting.getName(), + convertSettingValue(setting))); + + return builder.build(); + } + + private JsonValue convertSettingValue(final AbstractSetting setting) { + final String settingType = setting.getClass().getName(); + + if (BigDecimalSetting.class.getName().equals(settingType)) { + final BigDecimalConverter converter + = (BigDecimalConverter) converters.get( + BigDecimal.class.getName() + ); + return converter.convertSettingValue( + ((BigDecimalSetting) setting).getValue() + ); + } else if (BooleanSetting.class.getName().equals(settingType)) { + final BooleanConverter converter = (BooleanConverter) converters + .get(Boolean.class.getName()); + return converter.convertSettingValue( + ((BooleanSetting) setting).getValue() + ); + } else if (DoubleSetting.class.getName().equals(settingType)) { + final DoubleConverter converter = (DoubleConverter) converters.get( + Double.class.getName() + ); + return converter.convertSettingValue( + ((DoubleSetting) setting).getValue() + ); + } else if (EnumSetting.class.getName().equals(settingType)) { + final EnumConverter converter = (EnumConverter) converters.get( + Set.class.getName() + ); + return converter.convertSettingValue( + ((EnumSetting) setting).getValue() + ); + } else if (LocalizedStringSetting.class.getName().equals(settingType)) { + final LocalizedStringConverter converter + = (LocalizedStringConverter) converters.get( + LocalizedString.class.getName() + ); + return converter.convertSettingValue( + ((LocalizedStringSetting) setting).getValue() + ); + } else if (LongSetting.class.getName().equals(settingType)) { + final LongConverter converter = (LongConverter) converters.get( + Long.class.getName() + ); + return converter.convertSettingValue( + ((LongSetting) setting).getValue() + ); + } else if (StringSetting.class.getName().equals(settingType)) { + final StringConverter converter = (StringConverter) converters.get( + Set.class.getName() + ); + return converter.convertSettingValue( + ((StringSetting) setting).getValue() + ); + } else if (StringListSetting.class.getName().equals(settingType)) { + final StringListConverter converter + = (StringListConverter) converters.get( + Set.class.getName() + ); + return converter.convertSettingValue( + ((StringListSetting) setting).getValue() + ); + } else { + throw new WebApplicationException( + String.format( + "The type \"%s\" of setting \"%s\" of configuration \"%s\" " + + "is unknown.", + settingType, + setting.getName(), + setting.getConfigurationClass() + ) + ); + } + + } + + @GET + @Path("/{confName}/settings/{setting}") + @Produces(MediaType.APPLICATION_JSON) + @AuthorizationRequired @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) @Transactional(Transactional.TxType.REQUIRED) public Object getSetting( @@ -184,9 +311,10 @@ public class ConfigurationApi { } @PUT - @Path("/{confName}/{setting}") + @Path("/{confName}/settings/{setting}") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) + @AuthorizationRequired @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) @Transactional(Transactional.TxType.REQUIRED) public Response updateSetting( diff --git a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/DoubleConverter.java b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/DoubleConverter.java index c88251188..c2e5f0d64 100644 --- a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/DoubleConverter.java +++ b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/DoubleConverter.java @@ -18,6 +18,7 @@ */ package org.libreccm.api.admin.configuration; +import javax.json.Json; import javax.json.JsonNumber; import javax.json.JsonValue; import javax.ws.rs.WebApplicationException; @@ -41,4 +42,9 @@ class DoubleConverter implements SettingValueConverter { } } + @Override + public JsonValue convertSettingValue(final Double value) { + return Json.createValue(value); + } + } diff --git a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/EnumConverter.java b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/EnumConverter.java index 3385e36a6..501644ef4 100644 --- a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/EnumConverter.java +++ b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/EnumConverter.java @@ -21,6 +21,7 @@ package org.libreccm.api.admin.configuration; import java.util.Set; import java.util.stream.Collectors; +import javax.json.Json; import javax.json.JsonArray; import javax.json.JsonString; import javax.json.JsonValue; @@ -50,6 +51,11 @@ class EnumConverter } } + @Override + public JsonValue convertSettingValue(final Set value) { + return Json.createArrayBuilder(value).build(); + } + private String convertEnumValue(final JsonValue value) { if (value.getValueType() == JsonValue.ValueType.STRING) { return ((JsonString) value).getString(); diff --git a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/LocalizedStringConverter.java b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/LocalizedStringConverter.java index a38dde1de..3e553a682 100644 --- a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/LocalizedStringConverter.java +++ b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/LocalizedStringConverter.java @@ -24,7 +24,9 @@ import java.util.IllformedLocaleException; import java.util.Locale; import java.util.Map; +import javax.json.Json; import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; import javax.json.JsonString; import javax.json.JsonValue; import javax.ws.rs.WebApplicationException; @@ -61,6 +63,23 @@ public class LocalizedStringConverter } } + @Override + public JsonValue convertSettingValue(final LocalizedString value) { + final JsonObjectBuilder builder = Json.createObjectBuilder(); + + value + .getValues() + .entrySet() + .stream() + .forEach( + entry -> builder.add( + entry.getKey().toString(), entry.getValue() + ) + ); + + return builder.build(); + } + private LocalizedValue buildLocalizedValue( final Map.Entry entry ) { diff --git a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/LongConverter.java b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/LongConverter.java index b72de2e16..c555c16de 100644 --- a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/LongConverter.java +++ b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/LongConverter.java @@ -18,6 +18,7 @@ */ package org.libreccm.api.admin.configuration; +import javax.json.Json; import javax.json.JsonNumber; import javax.json.JsonValue; import javax.ws.rs.WebApplicationException; @@ -40,4 +41,9 @@ public class LongConverter implements SettingValueConverter { ); } } + + @Override + public JsonValue convertSettingValue(final Long value) { + return Json.createValue(value); + } } diff --git a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/SettingValueConverter.java b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/SettingValueConverter.java index a90d8a3e5..64e3d18b2 100644 --- a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/SettingValueConverter.java +++ b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/SettingValueConverter.java @@ -30,4 +30,6 @@ interface SettingValueConverter { T convertSettingValue(JsonValue value); + JsonValue convertSettingValue(T value); + } diff --git a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/StringConverter.java b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/StringConverter.java index cd44800e7..d8ca1f621 100644 --- a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/StringConverter.java +++ b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/StringConverter.java @@ -18,6 +18,7 @@ */ package org.libreccm.api.admin.configuration; +import javax.json.Json; import javax.json.JsonString; import javax.json.JsonValue; import javax.ws.rs.WebApplicationException; @@ -41,4 +42,9 @@ class StringConverter implements SettingValueConverter { } } + @Override + public JsonValue convertSettingValue(String value) { + return Json.createValue(value); + } + } diff --git a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/StringListConverter.java b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/StringListConverter.java index 703fa1295..86dd47efb 100644 --- a/ccm-core/src/main/java/org/libreccm/api/admin/configuration/StringListConverter.java +++ b/ccm-core/src/main/java/org/libreccm/api/admin/configuration/StringListConverter.java @@ -21,6 +21,7 @@ package org.libreccm.api.admin.configuration; import java.util.List; import java.util.stream.Collectors; +import javax.json.Json; import javax.json.JsonString; import javax.json.JsonValue; import javax.ws.rs.WebApplicationException; @@ -47,6 +48,11 @@ public class StringListConverter implements SettingValueConverter>{ ); } } + + @Override + public JsonValue convertSettingValue(final List value) { + return Json.createArrayBuilder(value).build(); + } private String convertValue(final JsonValue value) { if (value.getValueType() == JsonValue.ValueType.STRING) { diff --git a/ccm-core/src/main/java/org/libreccm/configuration/SettingManager.java b/ccm-core/src/main/java/org/libreccm/configuration/SettingManager.java index a237ed80a..e4c8a8701 100644 --- a/ccm-core/src/main/java/org/libreccm/configuration/SettingManager.java +++ b/ccm-core/src/main/java/org/libreccm/configuration/SettingManager.java @@ -92,12 +92,21 @@ public class SettingManager { return settings; } + /** + * Retrieves all settings for a configuration + * + * @param confName The name of the configuration + * + * @return All settings of the configuration. If not configuration with + * the provided name exists the list will be empty. + */ public List retrieveAllSettings(final String confName) { Objects.requireNonNull(confName); final TypedQuery query = entityManager - .createNamedQuery("AbstractSetting.findAllForClass", - AbstractSetting.class); + .createNamedQuery( + "AbstractSetting.findAllForClass", AbstractSetting.class + ); query.setParameter("class", confName); return query.getResultList();