[SYNCOPE-666] Adjusting TypeExtension for JAXB
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/07451e4c Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/07451e4c Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/07451e4c Branch: refs/heads/master Commit: 07451e4cc978a56b0e958fb59608b7e431e6f7e7 Parents: c3e4c38 Author: Francesco Chicchiriccò <[email protected]> Authored: Mon Nov 23 13:22:27 2015 +0100 Committer: Francesco Chicchiriccò <[email protected]> Committed: Mon Nov 23 13:22:27 2015 +0100 ---------------------------------------------------------------------- .../syncope/common/lib/patch/GroupPatch.java | 33 ++++++++---- .../apache/syncope/common/lib/to/GroupTO.java | 42 +++++++-------- .../syncope/common/lib/to/TypeExtensionTO.java | 55 ++++++++++++++++++++ .../java/data/GroupDataBinderImpl.java | 42 ++++++++------- .../syncope/fit/core/reference/GroupITCase.java | 27 ++++++---- 5 files changed, 138 insertions(+), 61 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/07451e4c/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java ---------------------------------------------------------------------- diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java index c6347c1..209b33e 100644 --- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java +++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java @@ -20,13 +20,15 @@ package org.apache.syncope.common.lib.patch; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; -import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.Predicate; +import org.apache.syncope.common.lib.to.TypeExtensionTO; @XmlRootElement(name = "groupPatch") @XmlType @@ -44,9 +46,7 @@ public class GroupPatch extends AnyPatch { private StringReplacePatchItem udynMembershipCond; - @XmlJavaTypeAdapter(XmlGenericMapAdapter.class) - @JsonIgnore - private final Map<String, Set<String>> typeExtensions = new HashMap<>(); + private final List<TypeExtensionTO> typeExtensions = new ArrayList<>(); public StringReplacePatchItem getName() { return name; @@ -88,8 +88,21 @@ public class GroupPatch extends AnyPatch { this.udynMembershipCond = udynMembershipCond; } - @JsonProperty - public Map<String, Set<String>> getTypeExtensions() { + @JsonIgnore + public TypeExtensionTO getTypeExtension(final String anyType) { + return CollectionUtils.find(typeExtensions, new Predicate<TypeExtensionTO>() { + + @Override + public boolean evaluate(final TypeExtensionTO typeExtension) { + return anyType != null && anyType.equals(typeExtension.getAnyType()); + } + }); + } + + @XmlElementWrapper(name = "typeExtensions") + @XmlElement(name = "typeExtension") + @JsonProperty("typeExtensions") + public List<TypeExtensionTO> getTypeExtensions() { return typeExtensions; } http://git-wip-us.apache.org/repos/asf/syncope/blob/07451e4c/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java ---------------------------------------------------------------------- diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java index 9c375c8..c304b9e 100644 --- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java +++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java @@ -20,13 +20,14 @@ package org.apache.syncope.common.lib.to; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; -import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; -import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.Predicate; import org.apache.syncope.common.lib.types.AnyTypeKind; @XmlRootElement(name = "group") @@ -45,9 +46,7 @@ public class GroupTO extends AnyTO { private String udynMembershipCond; - @XmlJavaTypeAdapter(XmlGenericMapAdapter.class) - @JsonIgnore - private final Map<String, Set<String>> typeExtensions = new HashMap<>(); + private final List<TypeExtensionTO> typeExtensions = new ArrayList<>(); @Override public String getType() { @@ -99,21 +98,22 @@ public class GroupTO extends AnyTO { this.udynMembershipCond = uDynMembershipCond; } - @JsonProperty - public Map<String, Set<String>> getTypeExtensions() { - return typeExtensions; - } + @JsonIgnore + public TypeExtensionTO getTypeExtension(final String anyType) { + return CollectionUtils.find(typeExtensions, new Predicate<TypeExtensionTO>() { - public static long fromDisplayName(final String displayName) { - long result = 0; - if (displayName != null && !displayName.isEmpty() && displayName.indexOf(' ') != -1) { - try { - result = Long.valueOf(displayName.split(" ")[0]); - } catch (NumberFormatException e) { - // ignore + @Override + public boolean evaluate(final TypeExtensionTO typeExtension) { + return anyType != null && anyType.equals(typeExtension.getAnyType()); } - } + }); + } - return result; + @XmlElementWrapper(name = "typeExtensions") + @XmlElement(name = "typeExtension") + @JsonProperty("typeExtensions") + public List<TypeExtensionTO> getTypeExtensions() { + return typeExtensions; } + } http://git-wip-us.apache.org/repos/asf/syncope/blob/07451e4c/common/lib/src/main/java/org/apache/syncope/common/lib/to/TypeExtensionTO.java ---------------------------------------------------------------------- diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/TypeExtensionTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/TypeExtensionTO.java new file mode 100644 index 0000000..f8dea41 --- /dev/null +++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/TypeExtensionTO.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.common.lib.to; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; +import org.apache.syncope.common.lib.AbstractBaseBean; + +@XmlRootElement(name = "typeExtension") +@XmlType +public class TypeExtensionTO extends AbstractBaseBean { + + private static final long serialVersionUID = -5422809645030924811L; + + private String anyType; + + private final List<String> auxClasses = new ArrayList<>(); + + public String getAnyType() { + return anyType; + } + + public void setAnyType(final String anyType) { + this.anyType = anyType; + } + + @XmlElementWrapper(name = "auxClasses") + @XmlElement(name = "class") + @JsonProperty("auxClasses") + public List<String> getAuxClasses() { + return auxClasses; + } + +} http://git-wip-us.apache.org/repos/asf/syncope/blob/07451e4c/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java index 1f8655f..9562ff7 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java @@ -19,11 +19,9 @@ package org.apache.syncope.core.provisioning.java.data; import java.util.Collections; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Set; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Transformer; import org.apache.commons.lang3.StringUtils; @@ -31,6 +29,7 @@ import org.apache.syncope.common.lib.SyncopeClientCompositeException; import org.apache.syncope.common.lib.SyncopeClientException; import org.apache.syncope.common.lib.patch.GroupPatch; import org.apache.syncope.common.lib.to.GroupTO; +import org.apache.syncope.common.lib.to.TypeExtensionTO; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.ClientExceptionType; import org.apache.syncope.common.lib.types.ResourceOperation; @@ -128,17 +127,17 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD } // type extensions - for (Map.Entry<String, Set<String>> entry : groupTO.getTypeExtensions().entrySet()) { - AnyType anyType = anyTypeDAO.find(entry.getKey()); + for (TypeExtensionTO typeExtTO : groupTO.getTypeExtensions()) { + AnyType anyType = anyTypeDAO.find(typeExtTO.getAnyType()); if (anyType == null) { - LOG.warn("Ignoring invalid {}: {}", AnyType.class.getSimpleName(), entry.getKey()); + LOG.warn("Ignoring invalid {}: {}", AnyType.class.getSimpleName(), typeExtTO.getAnyType()); } else { TypeExtension typeExt = entityFactory.newEntity(TypeExtension.class); typeExt.setAnyType(anyType); typeExt.setGroup(group); group.add(typeExt); - for (String name : entry.getValue()) { + for (String name : typeExtTO.getAuxClasses()) { AnyTypeClass anyTypeClass = anyTypeClassDAO.find(name); if (anyTypeClass == null) { LOG.warn("Ignoring invalid {}: {}", AnyTypeClass.class.getSimpleName(), name); @@ -224,10 +223,10 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD } // type extensions - for (Map.Entry<String, Set<String>> entry : groupPatch.getTypeExtensions().entrySet()) { - AnyType anyType = anyTypeDAO.find(entry.getKey()); + for (TypeExtensionTO typeExtTO : groupPatch.getTypeExtensions()) { + AnyType anyType = anyTypeDAO.find(typeExtTO.getAnyType()); if (anyType == null) { - LOG.warn("Ignoring invalid {}: {}", AnyType.class.getSimpleName(), entry.getKey()); + LOG.warn("Ignoring invalid {}: {}", AnyType.class.getSimpleName(), typeExtTO.getAnyType()); } else { TypeExtension typeExt = group.getTypeExtension(anyType); if (typeExt == null) { @@ -238,7 +237,7 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD } // add all classes contained in the TO - for (String name : entry.getValue()) { + for (String name : typeExtTO.getAuxClasses()) { AnyTypeClass anyTypeClass = anyTypeClassDAO.find(name); if (anyTypeClass == null) { LOG.warn("Ignoring invalid {}: {}", AnyTypeClass.class.getSimpleName(), name); @@ -249,7 +248,7 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD // remove all classes not contained in the TO for (Iterator<? extends AnyTypeClass> itor = typeExt.getAuxClasses().iterator(); itor.hasNext();) { AnyTypeClass anyTypeClass = itor.next(); - if (!entry.getValue().contains(anyTypeClass.getKey())) { + if (!typeExtTO.getAuxClasses().contains(anyTypeClass.getKey())) { itor.remove(); } } @@ -264,7 +263,7 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD // remove all type extensions not contained in the TO for (Iterator<? extends TypeExtension> itor = group.getTypeExtensions().iterator(); itor.hasNext();) { TypeExtension typeExt = itor.next(); - if (!groupPatch.getTypeExtensions().containsKey(typeExt.getAnyType().getKey())) { + if (groupPatch.getTypeExtension(typeExt.getAnyType().getKey()) == null) { itor.remove(); } } @@ -308,14 +307,17 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD } for (TypeExtension typeExt : group.getTypeExtensions()) { - groupTO.getTypeExtensions().put(typeExt.getAnyType().getKey(), - CollectionUtils.collect(typeExt.getAuxClasses(), new Transformer<AnyTypeClass, String>() { - - @Override - public String transform(final AnyTypeClass clazz) { - return clazz.getKey(); - } - }, new HashSet<String>())); + TypeExtensionTO typeExtTO = new TypeExtensionTO(); + typeExtTO.setAnyType(typeExt.getAnyType().getKey()); + typeExtTO.getAuxClasses().addAll(CollectionUtils.collect(typeExt.getAuxClasses(), + new Transformer<AnyTypeClass, String>() { + + @Override + public String transform(final AnyTypeClass clazz) { + return clazz.getKey(); + } + })); + groupTO.getTypeExtensions().add(typeExtTO); } return groupTO; http://git-wip-us.apache.org/repos/asf/syncope/blob/07451e4c/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/GroupITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/GroupITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/GroupITCase.java index 502b832..052262c 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/GroupITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/GroupITCase.java @@ -28,9 +28,6 @@ import static org.junit.Assert.fail; import java.io.IOException; import java.io.InputStream; import java.security.AccessControlException; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; import java.util.List; import javax.naming.NamingEnumeration; import javax.naming.NamingException; @@ -65,6 +62,7 @@ import org.apache.syncope.common.lib.to.GroupTO; import org.apache.syncope.common.lib.to.MappingTO; import org.apache.syncope.common.lib.to.ProvisionTO; import org.apache.syncope.common.lib.to.ProvisioningResult; +import org.apache.syncope.common.lib.to.TypeExtensionTO; import org.apache.syncope.common.lib.to.UserTO; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.AttrSchemaType; @@ -692,25 +690,34 @@ public class GroupITCase extends AbstractITCase { @Test public void typeExtensions() { + TypeExtensionTO typeExtension = new TypeExtensionTO(); + typeExtension.setAnyType(AnyTypeKind.USER.name()); + typeExtension.getAuxClasses().add("csv"); + GroupTO groupTO = getBasicSampleTO("typeExtensions"); - groupTO.getTypeExtensions().put(AnyTypeKind.USER.name(), Collections.singleton("csv")); + groupTO.getTypeExtensions().add(typeExtension); groupTO = createGroup(groupTO).getAny(); assertNotNull(groupTO); assertEquals(1, groupTO.getTypeExtensions().size()); - assertEquals(1, groupTO.getTypeExtensions().get(AnyTypeKind.USER.name()).size()); - assertEquals(Collections.singleton("csv"), groupTO.getTypeExtensions().get(AnyTypeKind.USER.name())); + assertEquals(1, groupTO.getTypeExtension(AnyTypeKind.USER.name()).getAuxClasses().size()); + assertTrue(groupTO.getTypeExtension(AnyTypeKind.USER.name()).getAuxClasses().contains("csv")); + + typeExtension = new TypeExtensionTO(); + typeExtension.setAnyType(AnyTypeKind.USER.name()); + typeExtension.getAuxClasses().add("csv"); + typeExtension.getAuxClasses().add("other"); GroupPatch groupPatch = new GroupPatch(); groupPatch.setKey(groupTO.getKey()); - groupPatch.getTypeExtensions().put(AnyTypeKind.USER.name(), new HashSet<>(Arrays.asList("csv", "other"))); + groupPatch.getTypeExtensions().add(typeExtension); groupTO = updateGroup(groupPatch).getAny(); assertNotNull(groupTO); assertEquals(1, groupTO.getTypeExtensions().size()); - assertEquals(2, groupTO.getTypeExtensions().get(AnyTypeKind.USER.name()).size()); - assertTrue(groupTO.getTypeExtensions().get(AnyTypeKind.USER.name()).contains("csv")); - assertTrue(groupTO.getTypeExtensions().get(AnyTypeKind.USER.name()).contains("other")); + assertEquals(2, groupTO.getTypeExtension(AnyTypeKind.USER.name()).getAuxClasses().size()); + assertTrue(groupTO.getTypeExtension(AnyTypeKind.USER.name()).getAuxClasses().contains("csv")); + assertTrue(groupTO.getTypeExtension(AnyTypeKind.USER.name()).getAuxClasses().contains("other")); } @Test
