You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2015/11/23 13:22:39 UTC

[2/2] syncope git commit: [SYNCOPE-666] Adjusting TypeExtension for JAXB

[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ò <il...@apache.org>
Authored: Mon Nov 23 13:22:27 2015 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
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