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/04/07 10:40:36 UTC

[1/2] syncope git commit: [SYNCOPE-819] Delete confirmation now works everywhere

Repository: syncope
Updated Branches:
  refs/heads/master 7300ccdf3 -> 0016d10c9


[SYNCOPE-819] Delete confirmation now works everywhere


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

Branch: refs/heads/master
Commit: 27dae836f910977a640d9a1506dc0971dc1cb745
Parents: 7300ccd
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Thu Apr 7 10:08:03 2016 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Thu Apr 7 10:08:03 2016 +0200

----------------------------------------------------------------------
 .../console/topology/TopologyTogglePanel.java   | 50 ++++++--------
 .../confirmation/ConfirmationModalBehavior.java | 70 --------------------
 .../html/form/IndicatingOnConfirmAjaxLink.java  | 37 ++++++++++-
 .../syncope/client/console/pages/BasePage.html  |  4 ++
 4 files changed, 60 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/27dae836/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java
index 30df39b..22ec34b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyTogglePanel.java
@@ -33,8 +33,8 @@ import org.apache.syncope.client.console.tasks.PropagationTasks;
 import org.apache.syncope.client.console.tasks.PushTasks;
 import org.apache.syncope.client.console.tasks.SchedTasks;
 import org.apache.syncope.client.console.tasks.PullTasks;
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.confirmation.ConfirmationModalBehavior;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.console.wicket.markup.html.form.IndicatingOnConfirmAjaxLink;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
@@ -173,9 +173,9 @@ public class TopologyTogglePanel extends TogglePanel<Serializable> {
     }
 
     private Fragment getConnectorFragment(final TopologyNode node, final PageReference pageRef) {
-        final Fragment fragment = new Fragment("actions", "connectorActions", this);
+        Fragment fragment = new Fragment("actions", "connectorActions", this);
 
-        final AjaxLink<String> delete = new IndicatingAjaxLink<String>("delete") {
+        AjaxLink<String> delete = new IndicatingOnConfirmAjaxLink<String>("delete", true) {
 
             private static final long serialVersionUID = 3776750333491622263L;
 
@@ -186,19 +186,16 @@ public class TopologyTogglePanel extends TogglePanel<Serializable> {
                     target.appendJavaScript(String.format("jsPlumb.remove('%s');", node.getKey()));
                     info(getString(Constants.OPERATION_SUCCEEDED));
                 } catch (SyncopeClientException e) {
-                    error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
                     LOG.error("While deleting resource {}", node.getKey(), e);
+                    error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
                 }
                 SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
             }
         };
-
-        fragment.add(delete);
-        delete.add(new ConfirmationModalBehavior());
-
         MetaDataRoleAuthorizationStrategy.authorize(delete, ENABLE, StandardEntitlement.CONNECTOR_DELETE);
+        fragment.add(delete);
 
-        final AjaxLink<String> create = new IndicatingAjaxLink<String>("create") {
+        AjaxLink<String> create = new IndicatingAjaxLink<String>("create") {
 
             private static final long serialVersionUID = 3776750333491622263L;
 
@@ -221,11 +218,10 @@ public class TopologyTogglePanel extends TogglePanel<Serializable> {
                 resourceModal.show(true);
             }
         };
-        fragment.add(create);
-
         MetaDataRoleAuthorizationStrategy.authorize(create, ENABLE, StandardEntitlement.RESOURCE_CREATE);
+        fragment.add(create);
 
-        final AjaxLink<String> edit = new IndicatingAjaxLink<String>("edit") {
+        AjaxLink<String> edit = new IndicatingAjaxLink<String>("edit") {
 
             private static final long serialVersionUID = 3776750333491622263L;
 
@@ -246,17 +242,16 @@ public class TopologyTogglePanel extends TogglePanel<Serializable> {
                 resourceModal.show(true);
             }
         };
-        fragment.add(edit);
-
         MetaDataRoleAuthorizationStrategy.authorize(edit, ENABLE, StandardEntitlement.CONNECTOR_UPDATE);
+        fragment.add(edit);
 
         return fragment;
     }
 
     private Fragment getResurceFragment(final TopologyNode node, final PageReference pageRef) {
-        final Fragment fragment = new Fragment("actions", "resourceActions", this);
+        Fragment fragment = new Fragment("actions", "resourceActions", this);
 
-        final AjaxLink<String> delete = new IndicatingAjaxLink<String>("delete") {
+        AjaxLink<String> delete = new IndicatingOnConfirmAjaxLink<String>("delete", true) {
 
             private static final long serialVersionUID = 3776750333491622263L;
 
@@ -267,19 +262,16 @@ public class TopologyTogglePanel extends TogglePanel<Serializable> {
                     target.appendJavaScript(String.format("jsPlumb.remove('%s');", node.getKey()));
                     info(getString(Constants.OPERATION_SUCCEEDED));
                 } catch (SyncopeClientException e) {
-                    error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
                     LOG.error("While deleting resource {}", node.getKey(), e);
+                    error(StringUtils.isBlank(e.getMessage()) ? e.getClass().getName() : e.getMessage());
                 }
                 SyncopeConsoleSession.get().getNotificationPanel().refresh(target);
             }
         };
-        fragment.add(delete);
-
-        delete.add(new ConfirmationModalBehavior());
-
         MetaDataRoleAuthorizationStrategy.authorize(delete, ENABLE, StandardEntitlement.RESOURCE_DELETE);
+        fragment.add(delete);
 
-        final AjaxLink<String> edit = new IndicatingAjaxLink<String>("edit") {
+        AjaxLink<String> edit = new IndicatingAjaxLink<String>("edit") {
 
             private static final long serialVersionUID = 3776750333491622263L;
 
@@ -300,10 +292,10 @@ public class TopologyTogglePanel extends TogglePanel<Serializable> {
                 resourceModal.show(true);
             }
         };
-        fragment.add(edit);
         MetaDataRoleAuthorizationStrategy.authorize(edit, ENABLE, StandardEntitlement.RESOURCE_UPDATE);
+        fragment.add(edit);
 
-        final AjaxLink<String> propagation = new IndicatingAjaxLink<String>("propagation") {
+        AjaxLink<String> propagation = new IndicatingAjaxLink<String>("propagation") {
 
             private static final long serialVersionUID = 3776750333491622263L;
 
@@ -315,10 +307,10 @@ public class TopologyTogglePanel extends TogglePanel<Serializable> {
                 taskModal.show(true);
             }
         };
-        fragment.add(propagation);
         MetaDataRoleAuthorizationStrategy.authorize(propagation, ENABLE, StandardEntitlement.TASK_LIST);
+        fragment.add(propagation);
 
-        final AjaxLink<String> pull = new IndicatingAjaxLink<String>("pull") {
+        AjaxLink<String> pull = new IndicatingAjaxLink<String>("pull") {
 
             private static final long serialVersionUID = 3776750333491622263L;
 
@@ -329,10 +321,10 @@ public class TopologyTogglePanel extends TogglePanel<Serializable> {
                 taskModal.show(true);
             }
         };
-        fragment.add(pull);
         MetaDataRoleAuthorizationStrategy.authorize(pull, ENABLE, StandardEntitlement.TASK_LIST);
+        fragment.add(pull);
 
-        final AjaxLink<String> push = new IndicatingAjaxLink<String>("push") {
+        AjaxLink<String> push = new IndicatingAjaxLink<String>("push") {
 
             private static final long serialVersionUID = 3776750333491622263L;
 
@@ -343,8 +335,8 @@ public class TopologyTogglePanel extends TogglePanel<Serializable> {
                 taskModal.show(true);
             }
         };
-        fragment.add(push);
         MetaDataRoleAuthorizationStrategy.authorize(push, ENABLE, StandardEntitlement.TASK_LIST);
+        fragment.add(push);
 
         return fragment;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/27dae836/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/confirmation/ConfirmationModalBehavior.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/confirmation/ConfirmationModalBehavior.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/confirmation/ConfirmationModalBehavior.java
deleted file mode 100644
index 7996766..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/confirmation/ConfirmationModalBehavior.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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.client.console.wicket.markup.html.bootstrap.confirmation;
-
-import static de.agilecoders.wicket.jquery.JQuery.$;
-
-import de.agilecoders.wicket.jquery.function.JavaScriptInlineFunction;
-import org.apache.wicket.Component;
-import org.apache.wicket.behavior.Behavior;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.JavaScriptHeaderItem;
-import org.apache.wicket.model.ResourceModel;
-
-/**
- * A behavior that shows a modal with OK/Cancel buttons to confirm an action.
- *
- */
-public class ConfirmationModalBehavior extends Behavior {
-
-    private static final long serialVersionUID = 1741536820040325586L;
-
-    private final String message;
-
-    public ConfirmationModalBehavior() {
-        this("confirmDelete");
-    }
-
-    public ConfirmationModalBehavior(final String msg) {
-        message = new ResourceModel(msg, "Are you sure?").getObject();
-    }
-
-    @Override
-    public void renderHead(final Component component, final IHeaderResponse response) {
-        super.renderHead(component, response);
-
-        response.render(JavaScriptHeaderItem.forScript("var confirm = false;", null));
-        response.render($(component).on("click",
-                new JavaScriptInlineFunction(""
-                        + "var element = $(this);"
-                        + "evt.preventDefault();"
-                        + "if(confirm == false){"
-                        + "evt.stopImmediatePropagation();"
-                        + "bootbox.confirm(\"" + message + "\", function(result){"
-                        + "if(result == true){"
-                        + "confirm = true;"
-                        + "element.click();"
-                        + "}"
-                        + "else{confirm = false;}"
-                        + "return true;"
-                        + "})} "
-                        + "else {confirm = false;};"
-                )).asDomReadyScript());
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/27dae836/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/IndicatingOnConfirmAjaxLink.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/IndicatingOnConfirmAjaxLink.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/IndicatingOnConfirmAjaxLink.java
index 98b3541..53ab39c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/IndicatingOnConfirmAjaxLink.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/IndicatingOnConfirmAjaxLink.java
@@ -18,8 +18,13 @@
  */
 package org.apache.syncope.client.console.wicket.markup.html.form;
 
-import org.apache.syncope.client.console.wicket.markup.html.bootstrap.confirmation.ConfirmationModalBehavior;
+import static de.agilecoders.wicket.jquery.JQuery.$;
+
+import de.agilecoders.wicket.jquery.function.JavaScriptInlineFunction;
 import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
+import org.apache.wicket.model.ResourceModel;
 
 public abstract class IndicatingOnConfirmAjaxLink<T> extends IndicatingAjaxLink<T> {
 
@@ -27,6 +32,8 @@ public abstract class IndicatingOnConfirmAjaxLink<T> extends IndicatingAjaxLink<
 
     private final String msg;
 
+    private final boolean enabled;
+
     public IndicatingOnConfirmAjaxLink(final String id, final boolean enabled) {
         this(id, "confirmDelete", enabled);
     }
@@ -34,8 +41,34 @@ public abstract class IndicatingOnConfirmAjaxLink<T> extends IndicatingAjaxLink<
     public IndicatingOnConfirmAjaxLink(final String id, final String msg, final boolean enabled) {
         super(id);
         this.msg = msg;
+        this.enabled = enabled;
+    }
+
+    @Override
+    public void renderHead(final IHeaderResponse response) {
+        super.renderHead(response);
+
         if (enabled) {
-            this.add(new ConfirmationModalBehavior(msg));
+            response.render(JavaScriptHeaderItem.forScript("proceed = false;", null));
+            response.render($(this).on("click",
+                    new JavaScriptInlineFunction(""
+                            + "var element = $(this);"
+                            + "evt.preventDefault();"
+                            + "if (proceed == false) {"
+                            + "  evt.stopImmediatePropagation();"
+                            + "  bootbox.confirm('" + new ResourceModel(msg).getObject() + "', function(result) {"
+                            + "    if (result == true) {"
+                            + "      proceed = true;"
+                            + "      element.click();"
+                            + "    } else {"
+                            + "      proceed = false;"
+                            + "    }"
+                            + "  return true;"
+                            + "  })"
+                            + "} else {"
+                            + "  proceed = false;"
+                            + "};"
+                    )).asDomReadyScript());
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/27dae836/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
index c05cd68..39ab5ca 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
@@ -34,6 +34,10 @@ under the License.
 
     <script type="text/javascript" src="webjars/bootbox/${bootbox.version}/bootbox.js"></script>
     <script type="text/javascript" src="webjars/jQuery-slimScroll/${jquery-slimscroll.version}/jquery.slimscroll.min.js"></script>
+    <script type="text/javascript">
+      // global variable for IndicatingOnConfirmAjaxLink
+      var proceed = false;
+    </script>
   </head>
   <body class="skin-green-light hold-transition sidebar-mini" wicket:id="body">
 


[2/2] syncope git commit: Enhancing checks when deleting a realm containig users, groups or any objects

Posted by il...@apache.org.
Enhancing checks when deleting a realm containig users, groups or any objects


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

Branch: refs/heads/master
Commit: 0016d10c90659102986d9eb0405c56d6f1ee32f9
Parents: 27dae83
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Thu Apr 7 10:40:17 2016 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Thu Apr 7 10:40:17 2016 +0200

----------------------------------------------------------------------
 .../common/lib/types/ClientExceptionType.java   |  1 +
 .../syncope/core/logic/ConnectorLogic.java      | 20 +++++++-------
 .../apache/syncope/core/logic/RealmLogic.java   | 28 ++++++++++++++++++++
 .../apache/syncope/fit/core/RealmITCase.java    | 11 ++++++++
 4 files changed, 49 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/0016d10c/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 bceff27..951a4ca 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
@@ -22,6 +22,7 @@ import javax.ws.rs.core.Response;
 
 public enum ClientExceptionType {
 
+    AssociatedAnys(Response.Status.BAD_REQUEST),
     AssociatedResources(Response.Status.BAD_REQUEST),
     Composite(Response.Status.BAD_REQUEST),
     ConcurrentModification(Response.Status.PRECONDITION_FAILED),

http://git-wip-us.apache.org/repos/asf/syncope/blob/0016d10c/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
index 1d8f705..0546f8f 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
@@ -108,10 +108,10 @@ public class ConnectorLogic extends AbstractTransactionalLogic<ConnInstanceTO> {
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.CONNECTOR_DELETE + "')")
-    public ConnInstanceTO delete(final Long connInstanceKey) {
-        ConnInstance connInstance = connInstanceDAO.find(connInstanceKey);
+    public ConnInstanceTO delete(final Long key) {
+        ConnInstance connInstance = connInstanceDAO.find(key);
         if (connInstance == null) {
-            throw new NotFoundException("Connector '" + connInstanceKey + "'");
+            throw new NotFoundException("Connector '" + key + "'");
         }
 
         if (!connInstance.getResources().isEmpty()) {
@@ -123,11 +123,9 @@ public class ConnectorLogic extends AbstractTransactionalLogic<ConnInstanceTO> {
             throw associatedResources;
         }
 
-        ConnInstanceTO connToDelete = binder.getConnInstanceTO(connInstance);
-
-        connInstanceDAO.delete(connInstanceKey);
-
-        return connToDelete;
+        ConnInstanceTO deleted = binder.getConnInstanceTO(connInstance);
+        connInstanceDAO.delete(key);
+        return deleted;
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.CONNECTOR_LIST + "')")
@@ -157,12 +155,12 @@ public class ConnectorLogic extends AbstractTransactionalLogic<ConnInstanceTO> {
 
     @PreAuthorize("hasRole('" + StandardEntitlement.CONNECTOR_READ + "')")
     @Transactional(readOnly = true)
-    public ConnInstanceTO read(final Long connInstanceKey, final String lang) {
+    public ConnInstanceTO read(final Long key, final String lang) {
         CurrentLocale.set(StringUtils.isBlank(lang) ? Locale.ENGLISH : new Locale(lang));
 
-        ConnInstance connInstance = connInstanceDAO.find(connInstanceKey);
+        ConnInstance connInstance = connInstanceDAO.find(key);
         if (connInstance == null) {
-            throw new NotFoundException("Connector '" + connInstanceKey + "'");
+            throw new NotFoundException("Connector '" + key + "'");
         }
 
         return binder.getConnInstanceTO(connInstance);

http://git-wip-us.apache.org/repos/asf/syncope/blob/0016d10c/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 0b27a0f..c9822a5 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
@@ -20,14 +20,23 @@ package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.ArrayUtils;
+import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.RealmTO;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
+import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
+import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
+import org.apache.syncope.core.persistence.api.dao.search.AnyCond;
+import org.apache.syncope.core.persistence.api.dao.search.AttributeCond;
+import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
 import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.provisioning.api.data.RealmDataBinder;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -41,6 +50,9 @@ public class RealmLogic extends AbstractTransactionalLogic<RealmTO> {
     private RealmDAO realmDAO;
 
     @Autowired
+    private AnySearchDAO searchDAO;
+
+    @Autowired
     private RealmDataBinder binder;
 
     @PreAuthorize("hasRole('" + StandardEntitlement.REALM_LIST + "')")
@@ -90,6 +102,22 @@ public class RealmLogic extends AbstractTransactionalLogic<RealmTO> {
             throw new NotFoundException(fullPath);
         }
 
+        Set<String> adminRealms = Collections.singleton(realm.getFullPath());
+        AnyCond idCond = new AnyCond(AttributeCond.Type.ISNOTNULL);
+        idCond.setSchema("id");
+        SearchCond allMatchingCond = SearchCond.getLeafCond(idCond);
+        int users = searchDAO.count(adminRealms, allMatchingCond, AnyTypeKind.USER);
+        int groups = searchDAO.count(adminRealms, allMatchingCond, AnyTypeKind.GROUP);
+        int anyObjects = searchDAO.count(adminRealms, allMatchingCond, AnyTypeKind.ANY_OBJECT);
+
+        if (users + groups + anyObjects > 0) {
+            SyncopeClientException containedAnys = SyncopeClientException.build(ClientExceptionType.AssociatedAnys);
+            containedAnys.getElements().add(users + " user(s)");
+            containedAnys.getElements().add(groups + " group(s)");
+            containedAnys.getElements().add(anyObjects + " anyObject(s)");
+            throw containedAnys;
+        }
+
         RealmTO deleted = binder.getRealmTO(realm);
         realmDAO.delete(realm);
         return deleted;

http://git-wip-us.apache.org/repos/asf/syncope/blob/0016d10c/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RealmITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RealmITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RealmITCase.java
index c2b27df..4d3360f 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RealmITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RealmITCase.java
@@ -185,4 +185,15 @@ public class RealmITCase extends AbstractITCase {
             assertEquals(ClientExceptionType.NotFound, e.getType());
         }
     }
+
+    @Test
+    public void deleteNonEmpty() {
+        try {
+            realmService.delete("/even/two");
+            fail();
+        } catch (SyncopeClientException e) {
+            assertEquals(ClientExceptionType.AssociatedAnys, e.getType());
+            assertEquals(3, e.getElements().size());
+        }
+    }
 }