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 2016/01/22 17:44:40 UTC

[1/5] syncope git commit: Reverting changes for SYNCOPE-755 as SYNCOPE-754 has proven to be invalid

Repository: syncope
Updated Branches:
  refs/heads/master 8b5bfca8e -> 95709c9bd


Reverting changes for SYNCOPE-755 as SYNCOPE-754 has proven to be invalid


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/e684e61d
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/e684e61d
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/e684e61d

Branch: refs/heads/master
Commit: e684e61d6b9ef7a8be5971b23d043c6deec885d6
Parents: 537da29
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri Jan 22 16:43:59 2016 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Fri Jan 22 16:44:04 2016 +0100

----------------------------------------------------------------------
 .../console/panels/AnyTypeDetailsPanel.java     | 18 ++--------
 .../syncope/common/lib/to/AnyTypeClassTO.java   |  9 +++++
 .../common/lib/types/ClientExceptionType.java   |  1 +
 .../persistence/api/entity/AnyTypeClass.java    |  2 ++
 .../core/persistence/jpa/dao/JPAAnyTypeDAO.java |  9 +++--
 .../core/persistence/jpa/entity/JPAAnyType.java |  4 +--
 .../persistence/jpa/entity/JPAAnyTypeClass.java | 10 ++++++
 .../persistence/jpa/outer/AnyTypeClassTest.java |  1 -
 .../core/persistence/jpa/outer/AnyTypeTest.java | 36 +++++++++++++++-----
 .../java/data/AnyTypeClassDataBinderImpl.java   | 28 +++++++++++++++
 .../java/data/AnyTypeDataBinderImpl.java        |  3 +-
 .../fit/core/reference/AnyTypeITCase.java       | 33 ++++++++++++++++++
 12 files changed, 120 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/e684e61d/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeDetailsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeDetailsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeDetailsPanel.java
index 8f99675..c83da38 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeDetailsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeDetailsPanel.java
@@ -23,15 +23,13 @@ import java.util.Arrays;
 import java.util.List;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Transformer;
-import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.rest.AnyTypeClassRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.rest.api.service.AnyTypeClassService;
-import org.apache.syncope.common.rest.api.service.AnyTypeService;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.panel.Panel;
@@ -43,11 +41,8 @@ public class AnyTypeDetailsPanel extends Panel {
 
     private static final long serialVersionUID = 8131650329622035501L;
 
-    private final AnyTypeTO anyTypeTO;
-
     public AnyTypeDetailsPanel(final String id, final AnyTypeTO anyTypeTO) {
         super(id);
-        this.anyTypeTO = anyTypeTO;
 
         final WebMarkupContainer container = new WebMarkupContainer("container");
         container.setOutputMarkupId(true);
@@ -79,21 +74,12 @@ public class AnyTypeDetailsPanel extends Panel {
     }
 
     private List<String> getAvailableAnyTypeClasses() {
-        final List<String> availableAnyTypeClasses = CollectionUtils.collect(
-                SyncopeConsoleSession.get().getService(AnyTypeClassService.class).list(),
-                new Transformer<AnyTypeClassTO, String>() {
+        return CollectionUtils.collect(new AnyTypeClassRestClient().list(), new Transformer<AnyTypeClassTO, String>() {
 
             @Override
             public String transform(final AnyTypeClassTO input) {
                 return input.getKey();
             }
         }, new ArrayList<String>());
-
-        for (AnyTypeTO itemTO : SyncopeConsoleSession.get().getService(AnyTypeService.class).list()) {
-            if (anyTypeTO.getKey() == null || !anyTypeTO.getKey().equals(itemTO.getKey())) {
-                availableAnyTypeClasses.removeAll(itemTO.getClasses());
-            }
-        }
-        return availableAnyTypeClasses;
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/e684e61d/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeClassTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeClassTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeClassTO.java
index 508d2cb..8e515a8 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeClassTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTypeClassTO.java
@@ -36,6 +36,8 @@ public class AnyTypeClassTO extends AbstractBaseBean {
 
     private String key;
 
+    private final List<String> types = new ArrayList<>();
+
     private final List<String> plainSchemas = new ArrayList<>();
 
     private final List<String> derSchemas = new ArrayList<>();
@@ -51,6 +53,13 @@ public class AnyTypeClassTO extends AbstractBaseBean {
         this.key = key;
     }
 
+    @XmlElementWrapper(name = "types")
+    @XmlElement(name = "type")
+    @JsonProperty("types")
+    public List<String> getTypes() {
+        return types;
+    }
+
     @XmlElementWrapper(name = "plainSchemas")
     @XmlElement(name = "schema")
     @JsonProperty("plainSchemas")

http://git-wip-us.apache.org/repos/asf/syncope/blob/e684e61d/common/lib/src/main/java/org/apache/syncope/common/lib/types/ClientExceptionType.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/types/ClientExceptionType.java b/common/lib/src/main/java/org/apache/syncope/common/lib/types/ClientExceptionType.java
index dfc5fe2..d72d3d2 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/types/ClientExceptionType.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/types/ClientExceptionType.java
@@ -43,6 +43,7 @@ public enum ClientExceptionType {
     InvalidRelationship(Response.Status.BAD_REQUEST),
     InvalidRelationshipType(Response.Status.BAD_REQUEST),
     InvalidAnyType(Response.Status.BAD_REQUEST),
+    InvalidAnyTypeClass(Response.Status.BAD_REQUEST),
     InvalidAnyObject(Response.Status.BAD_REQUEST),
     InvalidGroup(Response.Status.BAD_REQUEST),
     InvalidSchemaDefinition(Response.Status.BAD_REQUEST),

http://git-wip-us.apache.org/repos/asf/syncope/blob/e684e61d/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyTypeClass.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyTypeClass.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyTypeClass.java
index fdd00bb..e1e5411 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyTypeClass.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/AnyTypeClass.java
@@ -24,6 +24,8 @@ public interface AnyTypeClass extends Entity<String> {
 
     void setKey(String key);
 
+    List<? extends AnyType> getTypes();
+
     boolean add(PlainSchema schema);
 
     boolean remove(PlainSchema schema);

http://git-wip-us.apache.org/repos/asf/syncope/blob/e684e61d/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeDAO.java
index c4837ae..a980209 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyTypeDAO.java
@@ -49,12 +49,11 @@ public class JPAAnyTypeDAO extends AbstractDAO<AnyType, String> implements AnyTy
         return find(AnyTypeKind.GROUP.name());
     }
 
+    @Override
     public List<AnyType> findByTypeClass(final AnyTypeClass anyTypeClass) {
-        StringBuilder queryString = new StringBuilder("SELECT e FROM ").
-                append(JPAAnyType.class.getSimpleName()).
-                append(" e WHERE :anyTypeClass MEMBER OF e.classes");
-
-        TypedQuery<AnyType> query = entityManager().createQuery(queryString.toString(), AnyType.class);
+        TypedQuery<AnyType> query = entityManager().createQuery(
+                "SELECT e FROM " + JPAAnyType.class.getSimpleName() + " e WHERE :anyTypeClass MEMBER OF e.classes",
+                AnyType.class);
         query.setParameter("anyTypeClass", anyTypeClass);
 
         return query.getResultList();

http://git-wip-us.apache.org/repos/asf/syncope/blob/e684e61d/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyType.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyType.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyType.java
index d50cdba..8f99efc 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyType.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyType.java
@@ -55,9 +55,9 @@ public class JPAAnyType extends AbstractEntity<String> implements AnyType {
 
     @ManyToMany(fetch = FetchType.EAGER)
     @JoinTable(joinColumns =
-            @JoinColumn(name = "anyType_name"),
+            @JoinColumn(name = "anyType_name", referencedColumnName = "name"),
             inverseJoinColumns =
-            @JoinColumn(name = "anyTypeClass_name"))
+            @JoinColumn(name = "anyTypeClass_name", referencedColumnName = "name"))
     private List<JPAAnyTypeClass> classes = new ArrayList<>();
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/e684e61d/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTypeClass.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTypeClass.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTypeClass.java
index 6fba644..6a5e03e 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTypeClass.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAAnyTypeClass.java
@@ -24,8 +24,10 @@ import javax.persistence.Cacheable;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.Id;
+import javax.persistence.ManyToMany;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
+import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
@@ -43,6 +45,9 @@ public class JPAAnyTypeClass extends AbstractEntity<String> implements AnyTypeCl
     @Id
     private String name;
 
+    @ManyToMany(fetch = FetchType.EAGER, mappedBy = "classes")
+    private List<JPAAnyType> types = new ArrayList<>();
+
     @OneToMany(fetch = FetchType.EAGER, mappedBy = "anyTypeClass")
     private List<JPAPlainSchema> plainSchemas = new ArrayList<>();
 
@@ -63,6 +68,11 @@ public class JPAAnyTypeClass extends AbstractEntity<String> implements AnyTypeCl
     }
 
     @Override
+    public List<? extends AnyType> getTypes() {
+        return types;
+    }
+
+    @Override
     public boolean add(final PlainSchema schema) {
         checkType(schema, JPAPlainSchema.class);
         return this.plainSchemas.add((JPAPlainSchema) schema);

http://git-wip-us.apache.org/repos/asf/syncope/blob/e684e61d/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java
index cef688b..c120757 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeClassTest.java
@@ -20,7 +20,6 @@ package org.apache.syncope.core.persistence.jpa.outer;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-
 import static org.junit.Assert.assertTrue;
 
 import org.apache.syncope.common.lib.types.AttrSchemaType;

http://git-wip-us.apache.org/repos/asf/syncope/blob/e684e61d/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeTest.java
index 0f25f20..d86b4b9 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnyTypeTest.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.persistence.jpa.outer;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
@@ -41,21 +42,38 @@ public class AnyTypeTest extends AbstractTest {
     private AnyTypeClassDAO anyTypeClassDAO;
 
     @Test
-    public void delete() {
-        AnyType userType = anyTypeDAO.findUser();
-        assertNotNull(userType);
-
+    public void manyToMany() {
         AnyTypeClass other = anyTypeClassDAO.find("other");
         assertNotNull(other);
-        assertTrue(userType.getClasses().contains(other));
-        int before = userType.getClasses().size();
+
+        AnyType user = anyTypeDAO.findUser();
+        assertTrue(user.getClasses().contains(other));
+
+        AnyType group = anyTypeDAO.findGroup();
+        assertFalse(group.getClasses().contains(other));
+
+        group.add(other);
+        anyTypeDAO.save(group);
+
+        anyTypeDAO.flush();
+
+        user = anyTypeDAO.findUser();
+        assertTrue(user.getClasses().contains(other));
+        int userClassesBefore = user.getClasses().size();
+
+        group = anyTypeDAO.findGroup();
+        assertTrue(group.getClasses().contains(other));
+        int groupClassesBefore = group.getClasses().size();
 
         anyTypeClassDAO.delete("other");
 
         anyTypeDAO.flush();
 
-        userType = anyTypeDAO.findUser();
-        assertNotNull(userType);
-        assertEquals(before, userType.getClasses().size() + 1);
+        user = anyTypeDAO.findUser();
+        assertEquals(userClassesBefore, user.getClasses().size() + 1);
+
+        group = anyTypeDAO.findGroup();
+        assertEquals(groupClassesBefore, group.getClasses().size() + 1);
     }
+
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/e684e61d/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java
index 047633d..b5bc11a 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeClassDataBinderImpl.java
@@ -19,10 +19,16 @@
 package org.apache.syncope.core.provisioning.java.data;
 
 import java.util.Collections;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.Transformer;
+import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
+import org.apache.syncope.common.lib.types.ClientExceptionType;
+import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
+import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
@@ -49,6 +55,9 @@ public class AnyTypeClassDataBinderImpl implements AnyTypeClassDataBinder {
     private VirSchemaDAO virSchemaDAO;
 
     @Autowired
+    private AnyTypeDAO anyTypeDAO;
+
+    @Autowired
     private EntityFactory entityFactory;
 
     @Override
@@ -64,6 +73,20 @@ public class AnyTypeClassDataBinderImpl implements AnyTypeClassDataBinder {
             anyTypeClass.setKey(anyTypeClassTO.getKey());
         }
 
+        if (!CollectionUtils.disjunction(
+                CollectionUtils.collect(anyTypeClass.getTypes(), new Transformer<AnyType, String>() {
+
+                    @Override
+                    public String transform(final AnyType anyType) {
+                        return anyType.getKey();
+                    }
+                }), anyTypeClassTO.getTypes()).isEmpty()) {
+
+            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidAnyTypeClass);
+            sce.getElements().add("Cannot update types from classes, do the other way round");
+            throw sce;
+        }
+
         for (PlainSchema schema : plainSchemaDAO.findByAnyTypeClasses(Collections.singletonList(anyTypeClass))) {
             schema.setAnyTypeClass(null);
         }
@@ -115,6 +138,11 @@ public class AnyTypeClassDataBinderImpl implements AnyTypeClassDataBinder {
         AnyTypeClassTO anyTypeClassTO = new AnyTypeClassTO();
 
         anyTypeClassTO.setKey(anyTypeClass.getKey());
+
+        for (AnyType anyType : anyTypeDAO.findByTypeClass(anyTypeClass)) {
+            anyTypeClassTO.getTypes().add(anyType.getKey());
+        }
+
         for (PlainSchema schema : anyTypeClass.getPlainSchemas()) {
             anyTypeClassTO.getPlainSchemas().add(schema.getKey());
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/e684e61d/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeDataBinderImpl.java
index 0e85d3a..f74efbc 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeDataBinderImpl.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.provisioning.java.data;
 
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
@@ -59,7 +60,7 @@ public class AnyTypeDataBinderImpl implements AnyTypeDataBinder {
         }
         if (anyType.getKind() != anyTypeTO.getKind()) {
             SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidAnyType);
-            sce.getElements().add("AnyTypeKind cannot be changed");
+            sce.getElements().add(AnyTypeKind.class.getSimpleName() + " cannot be changed");
             throw sce;
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/e684e61d/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeITCase.java
index 58b1004..b82aabd 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeITCase.java
@@ -165,4 +165,37 @@ public class AnyTypeITCase extends AbstractITCase {
         assertNotNull(other);
         assertFalse(other.getClasses().contains(newClass.getKey()));
     }
+
+    @Test
+    public void issueSYNCOPE754() {
+        AnyTypeClassTO other = anyTypeClassService.read("other");
+        assertNotNull(other);
+
+        AnyTypeTO group = anyTypeService.read(AnyTypeKind.GROUP.name());
+        try {
+            assertFalse(group.getClasses().contains("other"));
+            group.getClasses().add("other");
+
+            anyTypeService.update(group);
+
+            group = anyTypeService.read(AnyTypeKind.GROUP.name());
+            assertTrue(group.getClasses().contains("other"));
+
+            other = anyTypeClassService.read("other");
+            assertEquals(2, other.getTypes().size());
+            assertTrue(other.getTypes().contains(AnyTypeKind.USER.name()));
+            assertTrue(other.getTypes().contains(AnyTypeKind.GROUP.name()));
+
+            other.getTypes().remove(AnyTypeKind.GROUP.name());
+            try {
+                anyTypeClassService.update(other);
+                fail();
+            } catch (SyncopeClientException e) {
+                assertEquals(ClientExceptionType.InvalidAnyTypeClass, e.getType());
+            }
+        } finally {
+            group.getClasses().remove("other");
+            anyTypeService.update(group);
+        }
+    }
 }


[4/5] syncope git commit: [SYNCOPE-756] Fix

Posted by il...@apache.org.
[SYNCOPE-756] Fix


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/02abafa8
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/02abafa8
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/02abafa8

Branch: refs/heads/master
Commit: 02abafa83422c5b657129dd587610556a0d8623a
Parents: e684e61
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri Jan 22 17:16:30 2016 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Fri Jan 22 17:16:30 2016 +0100

----------------------------------------------------------------------
 .../java/data/AnyObjectDataBinderImpl.java      | 97 ++++++++++++--------
 .../fit/core/reference/AnyObjectITCase.java     | 15 +++
 2 files changed, 75 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/02abafa8/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
index 19684b2..fbd090c 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
@@ -26,6 +26,7 @@ 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;
 import org.apache.syncope.common.lib.SyncopeClientCompositeException;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.patch.AnyObjectPatch;
@@ -152,28 +153,39 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
                     searchDAO.search(SearchCond.getLeafCond(assignableCond), AnyTypeKind.ANY_OBJECT);
 
             for (RelationshipTO relationshipTO : anyObjectTO.getRelationships()) {
-                AnyObject otherEnd = anyObjectDAO.find(relationshipTO.getRightKey());
-                if (otherEnd == null) {
-                    LOG.debug("Ignoring invalid anyObject " + relationshipTO.getRightKey());
-                } else if (assignableAnyObjects.contains(otherEnd)) {
-                    RelationshipType relationshipType = relationshipTypeDAO.find(relationshipTO.getType());
-                    if (relationshipType == null) {
-                        LOG.debug("Ignoring invalid relationship type {}", relationshipTO.getType());
+                if (StringUtils.isBlank(relationshipTO.getRightType())
+                        || AnyTypeKind.USER.name().equals(relationshipTO.getRightType())
+                        || AnyTypeKind.GROUP.name().equals(relationshipTO.getRightType())) {
+
+                    SyncopeClientException invalidAnyType =
+                            SyncopeClientException.build(ClientExceptionType.InvalidAnyType);
+                    invalidAnyType.getElements().add(AnyType.class.getSimpleName()
+                            + " not allowed for relationship: " + relationshipTO.getRightType());
+                    scce.addException(invalidAnyType);
+                } else {
+                    AnyObject otherEnd = anyObjectDAO.find(relationshipTO.getRightKey());
+                    if (otherEnd == null) {
+                        LOG.debug("Ignoring invalid anyObject " + relationshipTO.getRightKey());
+                    } else if (assignableAnyObjects.contains(otherEnd)) {
+                        RelationshipType relationshipType = relationshipTypeDAO.find(relationshipTO.getType());
+                        if (relationshipType == null) {
+                            LOG.debug("Ignoring invalid relationship type {}", relationshipTO.getType());
+                        } else {
+                            ARelationship relationship = entityFactory.newEntity(ARelationship.class);
+                            relationship.setType(relationshipType);
+                            relationship.setRightEnd(anyObject);
+                            relationship.setLeftEnd(anyObject);
+
+                            anyObject.add(relationship);
+                        }
                     } else {
-                        ARelationship relationship = entityFactory.newEntity(ARelationship.class);
-                        relationship.setType(relationshipType);
-                        relationship.setRightEnd(anyObject);
-                        relationship.setLeftEnd(anyObject);
+                        LOG.error("{} cannot be assigned to {}", otherEnd, anyObject);
 
-                        anyObject.add(relationship);
+                        SyncopeClientException unassignabled =
+                                SyncopeClientException.build(ClientExceptionType.InvalidRelationship);
+                        unassignabled.getElements().add("Cannot be assigned: " + otherEnd);
+                        scce.addException(unassignabled);
                     }
-                } else {
-                    LOG.error("{} cannot be assigned to {}", otherEnd, anyObject);
-
-                    SyncopeClientException unassignabled =
-                            SyncopeClientException.build(ClientExceptionType.InvalidRelationship);
-                    unassignabled.getElements().add("Cannot be assigned: " + otherEnd);
-                    scce.addException(unassignabled);
                 }
             }
 
@@ -249,25 +261,36 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
                     }
 
                     if (patch.getOperation() == PatchOperation.ADD_REPLACE) {
-                        AnyObject otherEnd = anyObjectDAO.find(patch.getRelationshipTO().getRightKey());
-                        if (otherEnd == null) {
-                            LOG.debug("Ignoring invalid any object {}", patch.getRelationshipTO().getRightKey());
-                        } else if (assignableAnyObjects.contains(otherEnd)) {
-                            relationship = entityFactory.newEntity(ARelationship.class);
-                            relationship.setType(relationshipType);
-                            relationship.setRightEnd(otherEnd);
-                            relationship.setLeftEnd(anyObject);
-
-                            anyObject.add(relationship);
-
-                            toBeProvisioned.addAll(otherEnd.getResourceNames());
+                        if (StringUtils.isBlank(patch.getRelationshipTO().getRightType())
+                                || AnyTypeKind.USER.name().equals(patch.getRelationshipTO().getRightType())
+                                || AnyTypeKind.GROUP.name().equals(patch.getRelationshipTO().getRightType())) {
+
+                            SyncopeClientException invalidAnyType =
+                                    SyncopeClientException.build(ClientExceptionType.InvalidAnyType);
+                            invalidAnyType.getElements().add(AnyType.class.getSimpleName()
+                                    + " not allowed for relationship: " + patch.getRelationshipTO().getRightType());
+                            scce.addException(invalidAnyType);
                         } else {
-                            LOG.error("{} cannot be assigned to {}", otherEnd, anyObject);
-
-                            SyncopeClientException unassignabled =
-                                    SyncopeClientException.build(ClientExceptionType.InvalidRelationship);
-                            unassignabled.getElements().add("Cannot be assigned: " + otherEnd);
-                            scce.addException(unassignabled);
+                            AnyObject otherEnd = anyObjectDAO.find(patch.getRelationshipTO().getRightKey());
+                            if (otherEnd == null) {
+                                LOG.debug("Ignoring invalid any object {}", patch.getRelationshipTO().getRightKey());
+                            } else if (assignableAnyObjects.contains(otherEnd)) {
+                                relationship = entityFactory.newEntity(ARelationship.class);
+                                relationship.setType(relationshipType);
+                                relationship.setRightEnd(otherEnd);
+                                relationship.setLeftEnd(anyObject);
+
+                                anyObject.add(relationship);
+
+                                toBeProvisioned.addAll(otherEnd.getResourceNames());
+                            } else {
+                                LOG.error("{} cannot be assigned to {}", otherEnd, anyObject);
+
+                                SyncopeClientException unassignabled =
+                                        SyncopeClientException.build(ClientExceptionType.InvalidRelationship);
+                                unassignabled.getElements().add("Cannot be assigned: " + otherEnd);
+                                scce.addException(unassignabled);
+                            }
                         }
                     }
                 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/02abafa8/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyObjectITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyObjectITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyObjectITCase.java
index 192fa76..6cbcf39 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyObjectITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyObjectITCase.java
@@ -34,6 +34,8 @@ import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
 import org.apache.syncope.common.lib.to.PagedResult;
+import org.apache.syncope.common.lib.to.RelationshipTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.SchemaType;
 import org.apache.syncope.common.rest.api.beans.AnyListQuery;
@@ -191,4 +193,17 @@ public class AnyObjectITCase extends AbstractITCase {
             assertEquals(ClientExceptionType.NotFound, e.getType());
         }
     }
+
+    @Test
+    public void issueSYNCOPE756() {
+        AnyObjectTO anyObjectTO = getSampleTO("issueSYNCOPE756");
+        anyObjectTO.getRelationships().add(new RelationshipTO.Builder().right(AnyTypeKind.USER.name(), 1).build());
+
+        try {
+            createAnyObject(anyObjectTO).getAny();
+            fail();
+        } catch (SyncopeClientException e) {
+            assertEquals(ClientExceptionType.InvalidAnyType, e.getType());
+        }
+    }
 }


[5/5] syncope git commit: [SYNCOPE-759] Fix

Posted by il...@apache.org.
[SYNCOPE-759] Fix


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/95709c9b
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/95709c9b
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/95709c9b

Branch: refs/heads/master
Commit: 95709c9bd23e28e0564f93d663de313c4c35caf1
Parents: 02abafa
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri Jan 22 17:44:25 2016 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Fri Jan 22 17:44:25 2016 +0100

----------------------------------------------------------------------
 .../syncope/core/logic/AnyTypeClassLogic.java       | 11 +++++++++++
 .../org/apache/syncope/core/logic/AnyTypeLogic.java | 10 ++++++++++
 .../persistence/api/dao/DuplicateException.java     |  2 +-
 .../fit/core/reference/AnyTypeClassITCase.java      | 16 ++++++++++++++++
 .../fit/core/reference/ExceptionMapperITCase.java   |  2 +-
 5 files changed, 39 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/95709c9b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java
index daaaf56..180035f 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java
@@ -25,10 +25,13 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
+import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
+import org.apache.syncope.core.persistence.api.dao.DuplicateException;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.provisioning.api.data.AnyTypeClassDataBinder;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -69,6 +72,14 @@ public class AnyTypeClassLogic extends AbstractTransactionalLogic<AnyTypeClassTO
 
     @PreAuthorize("hasRole('" + StandardEntitlement.ANYTYPECLASS_CREATE + "')")
     public AnyTypeClassTO create(final AnyTypeClassTO anyTypeClassTO) {
+        if (StringUtils.isBlank(anyTypeClassTO.getKey())) {
+            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.RequiredValuesMissing);
+            sce.getElements().add(AnyTypeClass.class.getSimpleName() + " name");
+            throw sce;
+        }
+        if (anyTypeClassDAO.find(anyTypeClassTO.getKey()) != null) {
+            throw new DuplicateException(anyTypeClassTO.getKey());
+        }
         return binder.getAnyTypeClassTO(anyTypeClassDAO.save(binder.create(anyTypeClassTO)));
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/95709c9b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
index 3116ae8..697fb07 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
@@ -32,6 +32,7 @@ import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.core.misc.EntitlementsHolder;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
+import org.apache.syncope.core.persistence.api.dao.DuplicateException;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.provisioning.api.data.AnyTypeDataBinder;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -72,6 +73,15 @@ public class AnyTypeLogic extends AbstractTransactionalLogic<AnyTypeTO> {
 
     @PreAuthorize("hasRole('" + StandardEntitlement.ANYTYPE_CREATE + "')")
     public AnyTypeTO create(final AnyTypeTO anyTypeTO) {
+        if (StringUtils.isBlank(anyTypeTO.getKey())) {
+            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.RequiredValuesMissing);
+            sce.getElements().add(AnyType.class.getSimpleName() + " name");
+            throw sce;
+        }
+        if (anyTypeDAO.find(anyTypeTO.getKey()) != null) {
+            throw new DuplicateException(anyTypeTO.getKey());
+        }
+
         AnyTypeTO result = binder.getAnyTypeTO(anyTypeDAO.save(binder.create(anyTypeTO)));
         EntitlementsHolder.getInstance().addFor(result.getKey());
         return result;

http://git-wip-us.apache.org/repos/asf/syncope/blob/95709c9b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/DuplicateException.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/DuplicateException.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/DuplicateException.java
index 5cd1da0..40c09f1 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/DuplicateException.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/DuplicateException.java
@@ -19,7 +19,7 @@
 package org.apache.syncope.core.persistence.api.dao;
 
 /**
- * Thrown when something is not found.
+ * Thrown when someone is attempting to create an entity with the same key of another existing entity.
  */
 public class DuplicateException extends RuntimeException {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/95709c9b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeClassITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeClassITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeClassITCase.java
index 6e88c71..7bc9349 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeClassITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/AnyTypeClassITCase.java
@@ -134,4 +134,20 @@ public class AnyTypeClassITCase extends AbstractITCase {
         assertNotNull(newClass);
         assertFalse(newClass.getPlainSchemas().contains(newSchema.getKey()));
     }
+
+    @Test
+    public void issueSYNCOPE759() {
+        AnyTypeClassTO minimalGroup = anyTypeClassService.read("minimal group");
+        assertNotNull(minimalGroup);
+
+        AnyTypeClassTO newAnyTypeClass = new AnyTypeClassTO();
+        newAnyTypeClass.setKey(minimalGroup.getKey());
+
+        try {
+            anyTypeClassService.create(newAnyTypeClass);
+            fail();
+        } catch (SyncopeClientException e) {
+            assertEquals(ClientExceptionType.EntityExists, e.getType());
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/95709c9b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ExceptionMapperITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ExceptionMapperITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ExceptionMapperITCase.java
index da0295c..2679196 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ExceptionMapperITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ExceptionMapperITCase.java
@@ -67,7 +67,7 @@ public class ExceptionMapperITCase extends AbstractITCase {
         createSchema(SchemaType.PLAIN, schemaTO);
 
         AnyTypeClassTO typeClass = new AnyTypeClassTO();
-        typeClass.setKey("camelAttribute");
+        typeClass.setKey("camelAttribute" + getUUIDString());
         typeClass.getPlainSchemas().add(schemaTO.getKey());
         anyTypeClassService.create(typeClass);
 


[2/5] syncope git commit: Aligning property version label

Posted by il...@apache.org.
Aligning property version label


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/537da29e
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/537da29e
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/537da29e

Branch: refs/heads/master
Commit: 537da29eb8b71536f063f8c72c2e49d92a0a7b5c
Parents: 29726bb
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri Jan 22 16:43:29 2016 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Fri Jan 22 16:44:04 2016 +0100

----------------------------------------------------------------------
 pom.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/537da29e/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 279071b..b4e7f37 100644
--- a/pom.xml
+++ b/pom.xml
@@ -404,7 +404,7 @@ under the License.
     <angular-ui-bootstrap.version>1.0.3</angular-ui-bootstrap.version>
     <angular-ui-select.version>0.13.1</angular-ui-select.version>
     <angular-sanitize.version>1.4.8</angular-sanitize.version>
-    <angular-treasure-overlay-spinner>1.1.0</angular-treasure-overlay-spinner>
+    <angular-treasure-overlay-spinner.version>1.1.0</angular-treasure-overlay-spinner.version>
     <ng-password-strength>0.2.1</ng-password-strength>
     <lodash>4.0.0</lodash>
     <kendo-ui-core.version>2014.2.716</kendo-ui-core.version>
@@ -1082,7 +1082,7 @@ under the License.
       <dependency>
         <groupId>org.webjars.bower</groupId>
         <artifactId>angular-treasure-overlay-spinner</artifactId>
-        <version>${angular-treasure-overlay-spinner}</version>
+        <version>${angular-treasure-overlay-spinner.version}</version>
       </dependency>
       <dependency>
         <groupId>org.webjars.bower</groupId>


[3/5] syncope git commit: Fixing configuration set for mandatory schema

Posted by il...@apache.org.
Fixing configuration set for mandatory schema


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/29726bb6
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/29726bb6
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/29726bb6

Branch: refs/heads/master
Commit: 29726bb6b8fc7d4e2564599e0f2d6ef2d99356ab
Parents: 8b5bfca
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri Jan 22 16:42:27 2016 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Fri Jan 22 16:44:04 2016 +0100

----------------------------------------------------------------------
 .../syncope/core/logic/ConfigurationLogic.java  |  2 +-
 .../api/data/ConfigurationDataBinder.java       |  3 +-
 .../java/data/ConfigurationDataBinderImpl.java  | 29 ++++++++++++++++++--
 .../fit/core/reference/ConfigurationITCase.java | 27 ++++++++++++++++--
 4 files changed, 52 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/29726bb6/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
index 4a7d4ca..5f2ef24 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
@@ -74,7 +74,7 @@ public class ConfigurationLogic extends AbstractTransactionalLogic<AttrTO> {
 
     @PreAuthorize("hasRole('" + StandardEntitlement.CONFIGURATION_LIST + "')")
     public List<AttrTO> list() {
-        return binder.getConfTO(confDAO.get());
+        return binder.getConfTO();
     }
 
     @PreAuthorize("isAuthenticated()")

http://git-wip-us.apache.org/repos/asf/syncope/blob/29726bb6/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConfigurationDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConfigurationDataBinder.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConfigurationDataBinder.java
index 020a6ae..e62407f 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConfigurationDataBinder.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConfigurationDataBinder.java
@@ -21,13 +21,12 @@ package org.apache.syncope.core.provisioning.api.data;
 import java.util.List;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.core.persistence.api.entity.conf.CPlainAttr;
-import org.apache.syncope.core.persistence.api.entity.conf.Conf;
 
 public interface ConfigurationDataBinder {
 
     AttrTO getAttrTO(CPlainAttr attr);
 
-    List<AttrTO> getConfTO(Conf conf);
+    List<AttrTO> getConfTO();
 
     CPlainAttr getAttribute(AttrTO attributeTO);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/29726bb6/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConfigurationDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConfigurationDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConfigurationDataBinderImpl.java
index c0f0485..00935f7 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConfigurationDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConfigurationDataBinderImpl.java
@@ -22,10 +22,14 @@ import java.util.ArrayList;
 import org.apache.syncope.core.provisioning.api.data.ConfigurationDataBinder;
 import java.util.Collections;
 import java.util.List;
+import org.apache.commons.jexl3.JexlContext;
+import org.apache.commons.jexl3.MapContext;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
+import org.apache.syncope.core.misc.jexl.JexlUtils;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidPlainAttrValueException;
+import org.apache.syncope.core.persistence.api.dao.ConfDAO;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
@@ -33,16 +37,19 @@ import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.conf.CPlainAttr;
 import org.apache.syncope.core.persistence.api.entity.conf.CPlainAttrUniqueValue;
 import org.apache.syncope.core.persistence.api.entity.conf.CPlainAttrValue;
-import org.apache.syncope.core.persistence.api.entity.conf.Conf;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class ConfigurationDataBinderImpl extends AbstractAnyDataBinder implements ConfigurationDataBinder {
 
+    @Autowired
+    private ConfDAO confDAO;
+
     @Override
-    public List<AttrTO> getConfTO(final Conf conf) {
+    public List<AttrTO> getConfTO() {
         final List<AttrTO> attrTOs = new ArrayList<>();
-        for (final CPlainAttr plainAttr : conf.getPlainAttrs()) {
+        for (final CPlainAttr plainAttr : confDAO.get().getPlainAttrs()) {
             final AttrTO attrTO = new AttrTO();
             attrTO.setSchema(plainAttr.getSchema().getKey());
             attrTO.getValues().addAll(plainAttr.getValuesAsStrings());
@@ -73,6 +80,22 @@ public class ConfigurationDataBinderImpl extends AbstractAnyDataBinder implement
                         ? Collections.<String>emptyList()
                         : Collections.singletonList(values.iterator().next()));
 
+        if (valuesProvided.isEmpty()) {
+            JexlContext jexlContext = new MapContext();
+            JexlUtils.addPlainAttrsToContext(confDAO.get().getPlainAttrs(), jexlContext);
+
+            if (!schema.isReadonly()
+                    && Boolean.parseBoolean(JexlUtils.evaluate(schema.getMandatoryCondition(), jexlContext))) {
+
+                LOG.error("Mandatory schema " + schema.getKey() + " not provided with values");
+
+                SyncopeClientException reqValMissing = SyncopeClientException.build(
+                        ClientExceptionType.RequiredValuesMissing);
+                reqValMissing.getElements().add(schema.getKey());
+                throw reqValMissing;
+            }
+        }
+
         for (String value : valuesProvided) {
             if (value == null || value.isEmpty()) {
                 LOG.debug("Null value for {}, ignoring", schema.getKey());

http://git-wip-us.apache.org/repos/asf/syncope/blob/29726bb6/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConfigurationITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConfigurationITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConfigurationITCase.java
index 6bc000e..1fb3221 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConfigurationITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/ConfigurationITCase.java
@@ -55,10 +55,31 @@ public class ConfigurationITCase extends AbstractITCase {
         testKey.setType(AttrSchemaType.String);
         createSchema(SchemaType.PLAIN, testKey);
 
-        AttrTO conf = new AttrTO();
-        conf.setSchema(testKey.getKey());
-        conf.getValues().add("testValue");
+        AttrTO conf = new AttrTO.Builder().schema(testKey.getKey()).value("testValue").build();
+
+        configurationService.set(conf);
+
+        AttrTO actual = configurationService.get(conf.getSchema());
+        assertEquals(actual, conf);
+    }
 
+    @Test
+    public void createRequired() {
+        PlainSchemaTO testKey = new PlainSchemaTO();
+        testKey.setKey("testKey" + getUUIDString());
+        testKey.setType(AttrSchemaType.String);
+        testKey.setMandatoryCondition("true");
+        createSchema(SchemaType.PLAIN, testKey);
+
+        AttrTO conf = new AttrTO.Builder().schema(testKey.getKey()).build();
+        try {
+            configurationService.set(conf);
+            fail();
+        } catch (SyncopeClientException e) {
+            assertEquals(ClientExceptionType.RequiredValuesMissing, e.getType());
+        }
+
+        conf.getValues().add("testValue");
         configurationService.set(conf);
 
         AttrTO actual = configurationService.get(conf.getSchema());