[2/2] syncope git commit: Ensure the Admin Console correctly provides details to fetch ConnId object classes info

2017-11-02 Thread ilgrosso
Ensure the Admin Console correctly provides details to fetch ConnId object 
classes info


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

Branch: refs/heads/master
Commit: 3a9d872f17e180784a52b2f0fa28649b2d02d3af
Parents: 68ab1fb
Author: Francesco Chicchiriccò 
Authored: Thu Nov 2 14:03:43 2017 +0100
Committer: Francesco Chicchiriccò 
Committed: Thu Nov 2 14:05:25 2017 +0100

--
 .../syncope/client/console/rest/ConnectorRestClient.java | 6 +-
 .../console/wizards/resources/ProvisionWizardBuilder.java| 8 ++--
 .../console/wizards/resources/ResourceMappingPanel.java  | 2 ++
 .../console/wizards/resources/ResourceProvisionPanel.java| 2 +-
 4 files changed, 14 insertions(+), 4 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/syncope/blob/3a9d872f/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
--
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
index 729ea53..d8b3fdf 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
@@ -77,9 +77,13 @@ public class ConnectorRestClient extends BaseRestClient {
 }
 
 public List getExtAttrNames(
-final String objectClass, final String connectorKey, final 
Collection conf) {
+final String adminRealm,
+final String objectClass,
+final String connectorKey,
+final Collection conf) {
 
 ConnInstanceTO connInstanceTO = new ConnInstanceTO();
+connInstanceTO.setAdminRealm(adminRealm);
 connInstanceTO.setKey(connectorKey);
 connInstanceTO.getConf().addAll(conf);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/3a9d872f/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
--
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
index ce29438..5d7c62b 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
@@ -53,6 +53,8 @@ public class ProvisionWizardBuilder extends 
AjaxWizardBuilder
 
 private final ResourceTO resourceTO;
 
+private final String adminRealm;
+
 protected AjaxTextFieldPanel clazz;
 
 /**
@@ -183,11 +185,13 @@ public class ProvisionWizardBuilder extends 
AjaxWizardBuilder
  * Construct.
  *
  * @param resourceTO external resource to be updated.
+ * @param adminRealm admin realm
  * @param pageRef Caller page reference.
  */
-public ProvisionWizardBuilder(final ResourceTO resourceTO, final 
PageReference pageRef) {
+public ProvisionWizardBuilder(final ResourceTO resourceTO, final String 
adminRealm, final PageReference pageRef) {
 super(new ResourceProvision(), pageRef);
 this.resourceTO = resourceTO;
+this.adminRealm = adminRealm;
 }
 
 @Override
@@ -206,7 +210,7 @@ public class ProvisionWizardBuilder extends 
AjaxWizardBuilder
 modelObject.getProvisionTO().setMapping(new MappingTO());
 }
 mapping.add(new ResourceMappingPanel(
-"mapping", resourceTO, modelObject, itemTransformers, 
jexlTransformers));
+"mapping", resourceTO, adminRealm, modelObject, 
itemTransformers, jexlTransformers));
 
 wizardModel.add(mapping);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/3a9d872f/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java
--
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java
index 02ae10f..94f011a 100644
--- 

[1/2] syncope git commit: Ensure the Admin Console correctly provides details to fetch ConnId object classes info

2017-11-02 Thread ilgrosso
Repository: syncope
Updated Branches:
  refs/heads/2_0_X 781ae9367 -> f9aed7b8d
  refs/heads/master 68ab1fbed -> 3a9d872f1


Ensure the Admin Console correctly provides details to fetch ConnId object 
classes info


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

Branch: refs/heads/2_0_X
Commit: f9aed7b8d2e044041e2c82a8471988d33b302aaf
Parents: 781ae93
Author: Francesco Chicchiriccò 
Authored: Thu Nov 2 14:03:43 2017 +0100
Committer: Francesco Chicchiriccò 
Committed: Thu Nov 2 14:03:43 2017 +0100

--
 .../syncope/client/console/rest/ConnectorRestClient.java | 6 +-
 .../console/wizards/resources/ProvisionWizardBuilder.java| 8 ++--
 .../console/wizards/resources/ResourceMappingPanel.java  | 2 ++
 .../console/wizards/resources/ResourceProvisionPanel.java| 2 +-
 4 files changed, 14 insertions(+), 4 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/syncope/blob/f9aed7b8/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
--
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
index 5f1d41b..fb84ef3 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
@@ -85,9 +85,13 @@ public class ConnectorRestClient extends BaseRestClient {
 }
 
 public List getExtAttrNames(
-final String objectClass, final String connectorKey, final 
Collection conf) {
+final String adminRealm,
+final String objectClass,
+final String connectorKey,
+final Collection conf) {
 
 ConnInstanceTO connInstanceTO = new ConnInstanceTO();
+connInstanceTO.setAdminRealm(adminRealm);
 connInstanceTO.setKey(connectorKey);
 connInstanceTO.getConf().addAll(conf);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9aed7b8/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
--
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
index 2ade6cf..5b297e6 100644
--- 
a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
+++ 
b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
@@ -53,6 +53,8 @@ public class ProvisionWizardBuilder extends 
AjaxWizardBuilder
 
 private final ResourceTO resourceTO;
 
+private final String adminRealm;
+
 protected AjaxTextFieldPanel clazz;
 
 /**
@@ -183,11 +185,13 @@ public class ProvisionWizardBuilder extends 
AjaxWizardBuilder
  * Construct.
  *
  * @param resourceTO external resource to be updated.
+ * @param adminRealm admin realm
  * @param pageRef Caller page reference.
  */
-public ProvisionWizardBuilder(final ResourceTO resourceTO, final 
PageReference pageRef) {
+public ProvisionWizardBuilder(final ResourceTO resourceTO, final String 
adminRealm, final PageReference pageRef) {
 super(new ResourceProvision(), pageRef);
 this.resourceTO = resourceTO;
+this.adminRealm = adminRealm;
 }
 
 @Override
@@ -206,7 +210,7 @@ public class ProvisionWizardBuilder extends 
AjaxWizardBuilder
 modelObject.getProvisionTO().setMapping(new MappingTO());
 }
 mapping.add(new ResourceMappingPanel(
-"mapping", resourceTO, modelObject, itemTransformers, 
jexlTransformers));
+"mapping", resourceTO, adminRealm, modelObject, 
itemTransformers, jexlTransformers));
 
 wizardModel.add(mapping);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/f9aed7b8/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java
--
diff --git 
a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java
 
b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceMappingPanel.java

[3/4] syncope git commit: [SYNCOPE-1232] Prevent AnyType removal if AnyObject instances are found

2017-11-02 Thread ilgrosso
[SYNCOPE-1232] Prevent AnyType removal if AnyObject instances are found


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

Branch: refs/heads/master
Commit: cd731aa1b81664539bc7f818d6e111ad4e697d1a
Parents: 3a9d872
Author: Francesco Chicchiriccò 
Authored: Thu Nov 2 14:33:47 2017 +0100
Committer: Francesco Chicchiriccò 
Committed: Thu Nov 2 15:36:21 2017 +0100

--
 .../org/apache/syncope/core/logic/AnyTypeLogic.java | 12 
 1 file changed, 12 insertions(+)
--


http://git-wip-us.apache.org/repos/asf/syncope/blob/cd731aa1/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 783d356..a0c70d0 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
@@ -27,6 +27,7 @@ import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 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;
@@ -46,6 +47,9 @@ public class AnyTypeLogic extends 
AbstractTransactionalLogic {
 @Autowired
 private AnyTypeDAO anyTypeDAO;
 
+@Autowired
+private AnyObjectDAO anyObjectDAO;
+
 @PreAuthorize("hasRole('" + StandardEntitlement.ANYTYPE_READ + "')")
 @Transactional(readOnly = true)
 public AnyTypeTO read(final String key) {
@@ -84,6 +88,7 @@ public class AnyTypeLogic extends 
AbstractTransactionalLogic {
 AnyType anyType = anyTypeDAO.find(anyTypeTO.getKey());
 if (anyType == null) {
 LOG.error("Could not find anyType '" + anyTypeTO.getKey() + "'");
+
 throw new NotFoundException(anyTypeTO.getKey());
 }
 
@@ -103,6 +108,13 @@ public class AnyTypeLogic extends 
AbstractTransactionalLogic {
 }
 
 try {
+Integer anyObjects = anyObjectDAO.countByType().get(anyType);
+if (anyObjects != null && anyObjects > 0) {
+LOG.error("{} AnyObject instances found for {}, aborting", 
anyObjects, anyType);
+
+throw new IllegalArgumentException("AnyObject instances found 
for " + key);
+}
+
 return binder.delete(anyType);
 } catch (IllegalArgumentException e) {
 SyncopeClientException sce = 
SyncopeClientException.build(ClientExceptionType.InvalidAnyType);



[1/4] syncope git commit: [SYNCOPE-1232] Prevent AnyType removal if AnyObject instances are found

2017-11-02 Thread ilgrosso
Repository: syncope
Updated Branches:
  refs/heads/2_0_X f9aed7b8d -> edb004d8d
  refs/heads/master 3a9d872f1 -> 81a030bd7


[SYNCOPE-1232] Prevent AnyType removal if AnyObject instances are found


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

Branch: refs/heads/2_0_X
Commit: c3acdc3e57699af236c915bd2c8fb05bca7bcd92
Parents: f9aed7b
Author: Francesco Chicchiriccò 
Authored: Thu Nov 2 14:33:47 2017 +0100
Committer: Francesco Chicchiriccò 
Committed: Thu Nov 2 14:33:47 2017 +0100

--
 .../org/apache/syncope/core/logic/AnyTypeLogic.java | 12 
 1 file changed, 12 insertions(+)
--


http://git-wip-us.apache.org/repos/asf/syncope/blob/c3acdc3e/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 f967da8..a7a41ff 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
@@ -29,6 +29,7 @@ import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 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;
@@ -48,6 +49,9 @@ public class AnyTypeLogic extends 
AbstractTransactionalLogic {
 @Autowired
 private AnyTypeDAO anyTypeDAO;
 
+@Autowired
+private AnyObjectDAO anyObjectDAO;
+
 @PreAuthorize("hasRole('" + StandardEntitlement.ANYTYPE_READ + "')")
 @Transactional(readOnly = true)
 public AnyTypeTO read(final String key) {
@@ -92,6 +96,7 @@ public class AnyTypeLogic extends 
AbstractTransactionalLogic {
 AnyType anyType = anyTypeDAO.find(anyTypeTO.getKey());
 if (anyType == null) {
 LOG.error("Could not find anyType '" + anyTypeTO.getKey() + "'");
+
 throw new NotFoundException(anyTypeTO.getKey());
 }
 
@@ -111,6 +116,13 @@ public class AnyTypeLogic extends 
AbstractTransactionalLogic {
 }
 
 try {
+Integer anyObjects = anyObjectDAO.countByType().get(anyType);
+if (anyObjects != null && anyObjects > 0) {
+LOG.error("{} AnyObject instances found for {}, aborting", 
anyObjects, anyType);
+
+throw new IllegalArgumentException("AnyObject instances found 
for " + key);
+}
+
 return binder.delete(anyType);
 } catch (IllegalArgumentException e) {
 SyncopeClientException sce = 
SyncopeClientException.build(ClientExceptionType.InvalidAnyType);



[4/4] syncope git commit: [SYNCOPE-1228] Graceful handling of parent info for create

2017-11-02 Thread ilgrosso
[SYNCOPE-1228] Graceful handling of parent info for create


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

Branch: refs/heads/master
Commit: 81a030bd7196a54205deaadea12df3f8c8703b9c
Parents: cd731aa
Author: Francesco Chicchiriccò 
Authored: Thu Nov 2 15:36:11 2017 +0100
Committer: Francesco Chicchiriccò 
Committed: Thu Nov 2 15:36:25 2017 +0100

--
 .../apache/syncope/core/logic/RealmLogic.java   | 29 ++--
 .../provisioning/api/data/RealmDataBinder.java  |  2 +-
 .../java/data/RealmDataBinderImpl.java  |  4 +--
 .../pushpull/DefaultRealmPullResultHandler.java |  2 +-
 4 files changed, 31 insertions(+), 6 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/syncope/blob/81a030bd/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java
--
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java 
b/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java
index 03cfe0f..a0e888f 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java
@@ -85,12 +85,37 @@ public class RealmLogic extends 
AbstractTransactionalLogic {
 
 @PreAuthorize("hasRole('" + StandardEntitlement.REALM_CREATE + "')")
 public ProvisioningResult create(final String parentPath, final 
RealmTO realmTO) {
-String fullPath = StringUtils.appendIfMissing(parentPath, "/") + 
realmTO.getName();
+Realm parent;
+if (StringUtils.isBlank(realmTO.getParent())) {
+parent = realmDAO.findByFullPath(parentPath);
+if (parent == null) {
+LOG.error("Could not find parent realm " + parentPath);
+
+throw new NotFoundException(parentPath);
+}
+
+realmTO.setParent(parent.getFullPath());
+} else {
+parent = realmDAO.find(realmTO.getParent());
+if (parent == null) {
+LOG.error("Could not find parent realm " + 
realmTO.getParent());
+
+throw new NotFoundException(realmTO.getParent());
+}
+
+if (!parent.getFullPath().equals(parentPath)) {
+SyncopeClientException sce = 
SyncopeClientException.build(ClientExceptionType.InvalidPath);
+sce.getElements().add("Mismatching parent realm: " + 
parentPath + " Vs " + parent.getFullPath());
+throw sce;
+}
+}
+
+String fullPath = StringUtils.appendIfMissing(parent.getFullPath(), 
"/") + realmTO.getName();
 if (realmDAO.findByFullPath(fullPath) != null) {
 throw new DuplicateException(fullPath);
 }
 
-Realm realm = realmDAO.save(binder.create(parentPath, realmTO));
+Realm realm = realmDAO.save(binder.create(parent, realmTO));
 
 PropagationByResource propByRes = new PropagationByResource();
 realm.getResourceKeys().forEach(resource -> {

http://git-wip-us.apache.org/repos/asf/syncope/blob/81a030bd/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RealmDataBinder.java
--
diff --git 
a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RealmDataBinder.java
 
b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RealmDataBinder.java
index 44e00fc..1e3183c 100644
--- 
a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RealmDataBinder.java
+++ 
b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RealmDataBinder.java
@@ -24,7 +24,7 @@ import org.apache.syncope.core.persistence.api.entity.Realm;
 
 public interface RealmDataBinder {
 
-Realm create(String parentPath, RealmTO realmTO);
+Realm create(Realm parent, RealmTO realmTO);
 
 PropagationByResource update(Realm realm, RealmTO realmTO);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/81a030bd/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java
--
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java
index 08bd787..8537331 100644
--- 

[2/4] syncope git commit: [SYNCOPE-1228] Graceful handling of parent info for create

2017-11-02 Thread ilgrosso
[SYNCOPE-1228] Graceful handling of parent info for create


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

Branch: refs/heads/2_0_X
Commit: edb004d8da264aae453ef3b46ca37cd9d5d4d3e9
Parents: c3acdc3
Author: Francesco Chicchiriccò 
Authored: Thu Nov 2 15:36:11 2017 +0100
Committer: Francesco Chicchiriccò 
Committed: Thu Nov 2 15:36:11 2017 +0100

--
 .../apache/syncope/core/logic/RealmLogic.java   | 29 ++--
 .../provisioning/api/data/RealmDataBinder.java  |  2 +-
 .../java/data/RealmDataBinderImpl.java  |  4 +--
 .../pushpull/DefaultRealmPullResultHandler.java |  2 +-
 4 files changed, 31 insertions(+), 6 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/syncope/blob/edb004d8/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java
--
diff --git 
a/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java 
b/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java
index e82e495..261cb42 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java
@@ -92,12 +92,37 @@ public class RealmLogic extends 
AbstractTransactionalLogic {
 
 @PreAuthorize("hasRole('" + StandardEntitlement.REALM_CREATE + "')")
 public ProvisioningResult create(final String parentPath, final 
RealmTO realmTO) {
-String fullPath = StringUtils.appendIfMissing(parentPath, "/") + 
realmTO.getName();
+Realm parent;
+if (StringUtils.isBlank(realmTO.getParent())) {
+parent = realmDAO.findByFullPath(parentPath);
+if (parent == null) {
+LOG.error("Could not find parent realm " + parentPath);
+
+throw new NotFoundException(parentPath);
+}
+
+realmTO.setParent(parent.getFullPath());
+} else {
+parent = realmDAO.find(realmTO.getParent());
+if (parent == null) {
+LOG.error("Could not find parent realm " + 
realmTO.getParent());
+
+throw new NotFoundException(realmTO.getParent());
+}
+
+if (!parent.getFullPath().equals(parentPath)) {
+SyncopeClientException sce = 
SyncopeClientException.build(ClientExceptionType.InvalidPath);
+sce.getElements().add("Mismatching parent realm: " + 
parentPath + " Vs " + parent.getFullPath());
+throw sce;
+}
+}
+
+String fullPath = StringUtils.appendIfMissing(parent.getFullPath(), 
"/") + realmTO.getName();
 if (realmDAO.findByFullPath(fullPath) != null) {
 throw new DuplicateException(fullPath);
 }
 
-Realm realm = realmDAO.save(binder.create(parentPath, realmTO));
+Realm realm = realmDAO.save(binder.create(parent, realmTO));
 
 PropagationByResource propByRes = new PropagationByResource();
 for (String resource : realm.getResourceKeys()) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/edb004d8/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RealmDataBinder.java
--
diff --git 
a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RealmDataBinder.java
 
b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RealmDataBinder.java
index 44e00fc..1e3183c 100644
--- 
a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RealmDataBinder.java
+++ 
b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RealmDataBinder.java
@@ -24,7 +24,7 @@ import org.apache.syncope.core.persistence.api.entity.Realm;
 
 public interface RealmDataBinder {
 
-Realm create(String parentPath, RealmTO realmTO);
+Realm create(Realm parent, RealmTO realmTO);
 
 PropagationByResource update(Realm realm, RealmTO realmTO);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/edb004d8/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java
--
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java
index 32678cc..4f7eda9 100644
---