Repository: incubator-unomi Updated Branches: refs/heads/master c97f92274 -> 6832aae60
UNOMI-46 : Avoid NPE when asking for the definition of a missing tag + Return 404 Project: http://git-wip-us.apache.org/repos/asf/incubator-unomi/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-unomi/commit/6832aae6 Tree: http://git-wip-us.apache.org/repos/asf/incubator-unomi/tree/6832aae6 Diff: http://git-wip-us.apache.org/repos/asf/incubator-unomi/diff/6832aae6 Branch: refs/heads/master Commit: 6832aae60fec56022a2de9ba7a5811c7fbf05934 Parents: c97f922 Author: Quentin Lamerand <[email protected]> Authored: Tue Jul 26 18:22:58 2016 +0200 Committer: Quentin Lamerand <[email protected]> Committed: Tue Jul 26 18:22:58 2016 +0200 ---------------------------------------------------------------------- .../unomi/rest/DefinitionsServiceEndPoint.java | 26 +++++++++++++++----- .../apache/unomi/rest/LocalizationHelper.java | 2 +- .../services/DefinitionsServiceImpl.java | 3 --- .../services/services/ProfileServiceImpl.java | 13 ++++++---- 4 files changed, 29 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/6832aae6/rest/src/main/java/org/apache/unomi/rest/DefinitionsServiceEndPoint.java ---------------------------------------------------------------------- diff --git a/rest/src/main/java/org/apache/unomi/rest/DefinitionsServiceEndPoint.java b/rest/src/main/java/org/apache/unomi/rest/DefinitionsServiceEndPoint.java index 365124c..e9754a8 100644 --- a/rest/src/main/java/org/apache/unomi/rest/DefinitionsServiceEndPoint.java +++ b/rest/src/main/java/org/apache/unomi/rest/DefinitionsServiceEndPoint.java @@ -20,6 +20,7 @@ package org.apache.unomi.rest; import org.apache.cxf.rs.security.cors.CrossOriginResourceSharing; import org.apache.unomi.api.PluginType; import org.apache.unomi.api.PropertyMergeStrategyType; +import org.apache.unomi.api.Tag; import org.apache.unomi.api.ValueType; import org.apache.unomi.api.actions.ActionType; import org.apache.unomi.api.conditions.ConditionType; @@ -86,14 +87,18 @@ public class DefinitionsServiceEndPoint { * Retrieves the tag with the specified identifier localized using the specified language. * * @param language the language to use to localize. - * @param tag the identifier of the tag to retrieve + * @param tagId the identifier of the tag to retrieve * @param filterHidden {@code true} if hidden sub-tags should be filtered out, {@code false} otherwise * @return the tag with the specified identifier */ @GET @Path("/tags/{tagId}") - public RESTTag getTag(@PathParam("tagId") String tag, @QueryParam("filterHidden") @DefaultValue("false") boolean filterHidden, @HeaderParam("Accept-Language") String language) { - return localizationHelper.generateTag(definitionsService.getTag(tag), language, filterHidden); + public RESTTag getTag(@PathParam("tagId") String tagId, @QueryParam("filterHidden") @DefaultValue("false") boolean filterHidden, @HeaderParam("Accept-Language") String language) { + Tag tag = definitionsService.getTag(tagId); + if (tag == null) { + throw new NotFoundException(new NoSuchElementException(tagId)); // return 404 when tag is not found + } + return localizationHelper.generateTag(tag, language, filterHidden); } /** @@ -123,7 +128,10 @@ public class DefinitionsServiceEndPoint { String[] tagsArray = tags.split(","); Set<ConditionType> results = new LinkedHashSet<>(); for (String s : tagsArray) { - results.addAll(definitionsService.getConditionTypesByTag(definitionsService.getTag(s), recursive)); + Tag tag = definitionsService.getTag(s); + if (tag != null) { + results.addAll(definitionsService.getConditionTypesByTag(tag, recursive)); + } } return localizationHelper.generateConditions(results, language); } @@ -191,7 +199,10 @@ public class DefinitionsServiceEndPoint { String[] tagsArray = tags.split(","); Set<ActionType> results = new LinkedHashSet<>(); for (String s : tagsArray) { - results.addAll(definitionsService.getActionTypeByTag(definitionsService.getTag(s), recursive)); + Tag tag = definitionsService.getTag(s); + if (tag != null) { + results.addAll(definitionsService.getActionTypeByTag(tag, recursive)); + } } return localizationHelper.generateActions(results, language); } @@ -258,7 +269,10 @@ public class DefinitionsServiceEndPoint { String[] tagsArray = tags.split(","); Set<ValueType> results = new LinkedHashSet<>(); for (String s : tagsArray) { - results.addAll(definitionsService.getValueTypeByTag(definitionsService.getTag(s), recursive)); + Tag tag = definitionsService.getTag(s); + if (tag != null) { + results.addAll(definitionsService.getValueTypeByTag(tag, recursive)); + } } return localizationHelper.generateValueTypes(results, language); } http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/6832aae6/rest/src/main/java/org/apache/unomi/rest/LocalizationHelper.java ---------------------------------------------------------------------- diff --git a/rest/src/main/java/org/apache/unomi/rest/LocalizationHelper.java b/rest/src/main/java/org/apache/unomi/rest/LocalizationHelper.java index 884ac8d..6cb5d89 100644 --- a/rest/src/main/java/org/apache/unomi/rest/LocalizationHelper.java +++ b/rest/src/main/java/org/apache/unomi/rest/LocalizationHelper.java @@ -219,7 +219,7 @@ public class LocalizationHelper { * @return a {@link RESTTag} based on the specified {@link Tag} and localized using the specified language */ public RESTTag generateTag(Tag tag, String language, boolean filterHidden) { - if (filterHidden && tag.isHidden()) { + if (tag == null || (filterHidden && tag.isHidden())) { return null; } RESTTag result = new RESTTag(); http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/6832aae6/services/src/main/java/org/apache/unomi/services/services/DefinitionsServiceImpl.java ---------------------------------------------------------------------- diff --git a/services/src/main/java/org/apache/unomi/services/services/DefinitionsServiceImpl.java b/services/src/main/java/org/apache/unomi/services/services/DefinitionsServiceImpl.java index 7744652..b1a38a2 100644 --- a/services/src/main/java/org/apache/unomi/services/services/DefinitionsServiceImpl.java +++ b/services/src/main/java/org/apache/unomi/services/services/DefinitionsServiceImpl.java @@ -237,9 +237,6 @@ public class DefinitionsServiceImpl implements DefinitionsService, SynchronousBu public Tag getTag(String tagId) { Tag completeTag = tags.get(tagId); - if (completeTag == null) { - return null; - } return completeTag; } http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/6832aae6/services/src/main/java/org/apache/unomi/services/services/ProfileServiceImpl.java ---------------------------------------------------------------------- diff --git a/services/src/main/java/org/apache/unomi/services/services/ProfileServiceImpl.java b/services/src/main/java/org/apache/unomi/services/services/ProfileServiceImpl.java index aa756b6..432e1f6 100644 --- a/services/src/main/java/org/apache/unomi/services/services/ProfileServiceImpl.java +++ b/services/src/main/java/org/apache/unomi/services/services/ProfileServiceImpl.java @@ -610,17 +610,20 @@ public class ProfileServiceImpl implements ProfileService, SynchronousBundleList return propertyTypes; } - public Set<PropertyType> getPropertyTypeByTag(String tag, boolean includeFromSubtags) { + public Set<PropertyType> getPropertyTypeByTag(String tagId, boolean includeFromSubtags) { Set<PropertyType> propertyTypes = new LinkedHashSet<PropertyType>(); - Collection<PropertyType> directPropertyTypes = persistenceService.query("tags", tag, "rank", PropertyType.class); + Collection<PropertyType> directPropertyTypes = persistenceService.query("tags", tagId, "rank", PropertyType.class); if (directPropertyTypes != null) { propertyTypes.addAll(directPropertyTypes); } if (includeFromSubtags) { - for (Tag subTag : definitionsService.getTag(tag).getSubTags()) { - Set<PropertyType> childPropertyTypes = getPropertyTypeByTag(subTag.getId(), true); - propertyTypes.addAll(childPropertyTypes); + Tag tag = definitionsService.getTag(tagId); + if (tag != null) { + for (Tag subTag : tag.getSubTags()) { + Set<PropertyType> childPropertyTypes = getPropertyTypeByTag(subTag.getId(), true); + propertyTypes.addAll(childPropertyTypes); + } } } return propertyTypes;
