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 2019/11/29 07:50:33 UTC

[syncope] branch master updated (33e3629 -> 5df443c)

This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git.


    from 33e3629  SYNCOPE-1511: Enhance audit queries with additional params
     new 599b090  [SYNCOPE-1511] Use AuditDAO.TABLE_NAME
     new af43767  [SYNCOPE-1515] Realm selector
     new 5df443c  [SYNCOPE-1519]: use hasAttrs instead of findAttrs in SchemaDataBinderImpl.java (#142)

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../resources/ui-commons/css/syncopeUI.scss        |  19 +-
 .../client/console/panels/RealmChoicePanel.java    | 320 +++++++++++++--------
 .../client/console/panels/RealmChoicePanel.html    |  15 +-
 .../syncope/core/logic/init/LoggerLoader.java      |   9 +-
 .../core/persistence/api/dao/PlainSchemaDAO.java   |   2 +
 .../persistence/jpa/dao/JPAJSONPlainSchemaDAO.java |   6 +
 .../persistence/jpa/dao/JPAPlainSchemaDAO.java     |  29 ++
 .../java/data/SchemaDataBinderImpl.java            |   2 +-
 .../java/job/report/AuditReportlet.java            |   5 +-
 .../apache/syncope/fit/console/RealmsITCase.java   |  21 +-
 10 files changed, 294 insertions(+), 134 deletions(-)


[syncope] 02/03: [SYNCOPE-1515] Realm selector

Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git

commit af43767bfe1b0fa840abc0a58986350b69e2f719
Author: Marco Di Sabatino Di Diodoro <ma...@tirasa.net>
AuthorDate: Fri Nov 29 07:58:04 2019 +0100

    [SYNCOPE-1515] Realm selector
---
 .../resources/ui-commons/css/syncopeUI.scss        |  19 +-
 .../client/console/panels/RealmChoicePanel.java    | 320 +++++++++++++--------
 .../client/console/panels/RealmChoicePanel.html    |  15 +-
 .../apache/syncope/fit/console/RealmsITCase.java   |  21 +-
 4 files changed, 248 insertions(+), 127 deletions(-)

diff --git a/client/idrepo/common-ui/src/main/resources/META-INF/resources/ui-commons/css/syncopeUI.scss b/client/idrepo/common-ui/src/main/resources/META-INF/resources/ui-commons/css/syncopeUI.scss
index 656965f..a2623c3 100644
--- a/client/idrepo/common-ui/src/main/resources/META-INF/resources/ui-commons/css/syncopeUI.scss
+++ b/client/idrepo/common-ui/src/main/resources/META-INF/resources/ui-commons/css/syncopeUI.scss
@@ -1112,9 +1112,24 @@ div#tablehandling ul.menu li a {
   padding: 0px !important;
 }
 
+.realm-live-search .dropdown-menu li a {
+  height: 22px;
+}
 
+.realm-live-search #bs-select-1-0 {
+  display: none;
+}
 
-
+.realm-live-search.dropdown.bootstrap-select .bs-caret {
+    display: none;
+}
+.realm-live-search.bootstrap-select>.dropdown-toggle {
+    width: 50px;
+    background: transparent;
+    border: none;
+    color: #3c8dbc;
+    float: right;
+}
 
 /* Form wrappers
 ============================================================================= */
@@ -1139,4 +1154,4 @@ div#tablehandling ul.menu li a {
 
 .max_height {
   height: 100% !important;
-}
\ No newline at end of file
+}
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmChoicePanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmChoicePanel.java
index 8743ff8..738fafb 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmChoicePanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmChoicePanel.java
@@ -25,6 +25,9 @@ import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
 import de.agilecoders.wicket.core.markup.html.bootstrap.button.dropdown.DropDownButton;
 import de.agilecoders.wicket.core.markup.html.bootstrap.image.GlyphIconType;
 import de.agilecoders.wicket.core.markup.html.bootstrap.image.IconType;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.select.BootstrapSelect;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.select.BootstrapSelectConfig;
+import de.agilecoders.wicket.jquery.Key;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Comparator;
@@ -32,23 +35,31 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import org.apache.commons.collections4.IterableUtils;
+import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.rest.RealmRestClient;
+import org.apache.syncope.client.ui.commons.Constants;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.DynRealmTO;
 import org.apache.syncope.common.lib.to.RealmTO;
 import org.apache.syncope.common.lib.types.IdRepoEntitlement;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
 import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.IChoiceRenderer;
 import org.apache.wicket.markup.html.link.AbstractLink;
+import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.LoadableDetachableModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
@@ -57,6 +68,8 @@ public class RealmChoicePanel extends Panel {
 
     private static final long serialVersionUID = -1100228004207271270L;
 
+    private static final int REALMS_VIEW_SIZE = 15;
+
     private final PageReference pageRef;
 
     private final LoadableDetachableModel<List<Pair<String, RealmTO>>> realmTree;
@@ -65,14 +78,14 @@ public class RealmChoicePanel extends Panel {
 
     private final WebMarkupContainer container;
 
+    private Model<RealmTO> model;
+
     private final Collection<String> availableRealms;
 
     private final Map<String, Pair<RealmTO, List<RealmTO>>> tree;
 
     private final List<AbstractLink> links = new ArrayList<>();
 
-    private Model<RealmTO> model;
-
     public RealmChoicePanel(final String id, final PageReference pageRef) {
         super(id);
         this.pageRef = pageRef;
@@ -159,135 +172,218 @@ public class RealmChoicePanel extends Panel {
         label.setOutputMarkupId(true);
         container.addOrReplace(label);
 
-        final DropDownButton realms = new DropDownButton(
-                "realms", new ResourceModel("select", ""), new Model<IconType>(GlyphIconType.folderopen)) {
+        if ((realmTree.getObject().size() + dynRealmTree.getObject().size()) > REALMS_VIEW_SIZE) {
+            List<Pair<String, RealmTO>> realms = Stream.of(
+                    realmTree.getObject(),
+                    dynRealmTree.getObject().stream().map(
+                            item -> {
+                                final RealmTO realmTO = new RealmTO();
+                                realmTO.setKey(item.getKey());
+                                realmTO.setName(item.getKey());
+                                realmTO.setFullPath(item.getKey());
+                                return Pair.of(item.getKey(), realmTO);
+                            }).collect(Collectors.toList())).flatMap(Collection::stream).collect(Collectors.toList());
+
+            BootstrapSelectConfig config = new BootstrapSelectConfig().withLiveSearch(true);
+            config.put(new Key<>("styleBase", "btn"), "btn glyphicon glyphicon-folder-open");
+            BootstrapSelect<Pair<String, RealmTO>> select =
+                    new BootstrapSelect<Pair<String, RealmTO>>("realmsLiveSearch", new Model<>(), realms) {
+
+                private static final long serialVersionUID = -12358873583862012L;
+
+                @Override
+                protected boolean isDisabled(
+                        final Pair<String, RealmTO> object,
+                        final int index,
+                        final String selected) {
+                    return availableRealms.stream().anyMatch(availableRealm -> {
+                        return !SyncopeConstants.ROOT_REALM.equals(availableRealm)
+                                && !object.getValue().getFullPath().equals(availableRealm);
+                    });
+                }
+            };
 
-            private static final long serialVersionUID = -5560086780455361131L;
+            select.with(config);
+            select.setOutputMarkupId(true);
+            select.setChoiceRenderer(new IChoiceRenderer<Pair<String, RealmTO>>() {
 
-            @Override
-            protected List<AbstractLink> newSubMenuButtons(final String buttonMarkupId) {
-                RealmChoicePanel.this.links.clear();
+                private static final long serialVersionUID = 5978544741356774985L;
 
-                RealmChoicePanel.this.links.add(new BootstrapAjaxLink<RealmTO>(
-                        ButtonList.getButtonMarkupId(),
-                        new Model<RealmTO>(),
-                        Buttons.Type.Link,
-                        new ResourceModel("realms", "Realms")) {
+                @Override
+                public Object getDisplayValue(final Pair<String, RealmTO> object) {
+                    return object.getKey();
+                }
 
-                    private static final long serialVersionUID = -7978723352517770744L;
+                @Override
+                public String getIdValue(final Pair<String, RealmTO> object, final int index) {
+                    return object.getKey();
+                }
 
-                    @Override
-                    public void onClick(final AjaxRequestTarget target) {
-                    }
+                @Override
+                public Pair<String, RealmTO> getObject(final String id,
+                        final IModel<? extends List<? extends Pair<String, RealmTO>>> choices) {
+                    return IterableUtils.find(choices.getObject(), new Predicate<Pair<String, RealmTO>>() {
 
-                    @Override
-                    public boolean isEnabled() {
-                        return false;
-                    }
+                        @Override
+                        public boolean evaluate(final Pair<String, RealmTO> object) {
+                            return object.getKey().equals(id);
+                        }
+                    });
+                }
+            });
+            select.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+                private static final long serialVersionUID = -6139318907146065915L;
+
+                @Override
+                protected void onUpdate(final AjaxRequestTarget target) {
+                    model.setObject(select.getModelObject().getValue());
+                    label.setDefaultModelObject(model.getObject().getFullPath());
+                    realmLabel.setDefaultModel(new ResourceModel("realmLabel", "Realm"));
+                    target.add(label);
+                    send(pageRef.getPage(), Broadcast.EXACT,
+                            new ChosenRealm<>(select.getModelObject().getValue(), target));
+                }
+            });
+            buildRealmLinks(label, realmLabel);
+            Fragment fragment = new Fragment("realmsFragment", "realmsSearchFragment", container);
+            fragment.addOrReplace(select);
+            container.addOrReplace(fragment);
+        } else {
+            final DropDownButton realms = new DropDownButton(
+                    "realms", new ResourceModel("select", ""), new Model<IconType>(GlyphIconType.folderopen)) {
 
-                    @Override
-                    protected void onComponentTag(final ComponentTag tag) {
-                        tag.put("class", "panel box box-primary box-header with-border");
-                        tag.put("style", "margin: 20px 5px 0px 5px; width: 90%");
-                    }
-                });
+                private static final long serialVersionUID = -5560086780455361131L;
 
-                for (Pair<String, RealmTO> link : realmTree.getObject()) {
-                    final RealmTO realmTO = link.getValue();
-                    RealmChoicePanel.this.links.add(new BootstrapAjaxLink<RealmTO>(
-                            ButtonList.getButtonMarkupId(),
-                            Model.of(realmTO),
-                            Buttons.Type.Link,
-                            new Model<>(link.getKey())) {
+                @Override
+                protected List<AbstractLink> newSubMenuButtons(final String buttonMarkupId) {
+                    buildRealmLinks(label, realmLabel);
+                    return RealmChoicePanel.this.links;
+                }
+            };
+            realms.setOutputMarkupId(true);
+            realms.setAlignment(AlignmentBehavior.Alignment.RIGHT);
+            realms.setType(Buttons.Type.Menu);
+
+            MetaDataRoleAuthorizationStrategy.authorize(realms, ENABLE, IdRepoEntitlement.REALM_LIST);
+            Fragment fragment = new Fragment("realmsFragment", "realmsListFragment", container);
+            fragment.addOrReplace(realms);
+            container.addOrReplace(fragment);
+        }
+    }
 
-                        private static final long serialVersionUID = -7978723352517770644L;
+    private void buildRealmLinks(final Label label, final Label realmLabel) {
+        RealmChoicePanel.this.links.clear();
+        RealmChoicePanel.this.links.add(new BootstrapAjaxLink<RealmTO>(
+                ButtonList.getButtonMarkupId(),
+                new Model<RealmTO>(),
+                Buttons.Type.Link,
+                new ResourceModel("realms", "Realms")) {
 
-                        @Override
-                        public void onClick(final AjaxRequestTarget target) {
-                            model.setObject(realmTO);
-                            label.setDefaultModelObject(model.getObject().getFullPath());
-                            realmLabel.setDefaultModel(new ResourceModel("realmLabel", "Realm"));
-                            target.add(label);
-                            send(pageRef.getPage(), Broadcast.EXACT, new ChosenRealm<>(realmTO, target));
-                        }
+            private static final long serialVersionUID = -7978723352517770744L;
 
-                        @Override
-                        public boolean isEnabled() {
-                            return availableRealms.stream().
-                                    anyMatch(availableRealm -> realmTO.getFullPath().startsWith(availableRealm));
-                        }
-                    });
+            @Override
+            public void onClick(final AjaxRequestTarget target) {
+            }
+
+            @Override
+            public boolean isEnabled() {
+                return false;
+            }
+
+            @Override
+            protected void onComponentTag(final ComponentTag tag) {
+                tag.put("class", "panel box box-primary box-header with-border");
+                tag.put("style", "margin: 20px 5px 0px 5px; width: 90%");
+            }
+        });
+
+        for (Pair<String, RealmTO> link : realmTree.getObject()) {
+            final RealmTO realmTO = link.getValue();
+            RealmChoicePanel.this.links.add(new BootstrapAjaxLink<RealmTO>(
+                    ButtonList.getButtonMarkupId(),
+                    Model.of(realmTO),
+                    Buttons.Type.Link,
+                    new Model<>(link.getKey())) {
+
+                private static final long serialVersionUID = -7978723352517770644L;
+
+                @Override
+                public void onClick(final AjaxRequestTarget target) {
+                    model.setObject(realmTO);
+                    label.setDefaultModelObject(model.getObject().getFullPath());
+                    realmLabel.setDefaultModel(new ResourceModel("realmLabel", "Realm"));
+                    target.add(label);
+                    send(pageRef.getPage(), Broadcast.EXACT, new ChosenRealm<>(realmTO, target));
                 }
 
-                if (!dynRealmTree.getObject().isEmpty()) {
-                    RealmChoicePanel.this.links.add(new BootstrapAjaxLink<RealmTO>(
-                            ButtonList.getButtonMarkupId(),
-                            new Model<RealmTO>(),
-                            Buttons.Type.Link,
-                            new ResourceModel("dynrealms", "Dynamic Realms")) {
+                @Override
+                public boolean isEnabled() {
+                    return availableRealms.stream().
+                            anyMatch(availableRealm -> realmTO.getFullPath().startsWith(availableRealm));
+                }
+            });
+        }
 
-                        private static final long serialVersionUID = -7978723352517770744L;
+        if (!dynRealmTree.getObject().isEmpty()) {
+            RealmChoicePanel.this.links.add(new BootstrapAjaxLink<RealmTO>(
+                    ButtonList.getButtonMarkupId(),
+                    new Model<RealmTO>(),
+                    Buttons.Type.Link,
+                    new ResourceModel("dynrealms", "Dynamic Realms")) {
 
-                        @Override
-                        public void onClick(final AjaxRequestTarget target) {
+                private static final long serialVersionUID = -7978723352517770744L;
 
-                        }
+                @Override
+                public void onClick(final AjaxRequestTarget target) {
 
-                        @Override
-                        public boolean isEnabled() {
-                            return false;
-                        }
+                }
 
-                        @Override
-                        protected void onComponentTag(final ComponentTag tag) {
-                            tag.put("class", "panel box box-primary box-header with-border");
-                            tag.put("style", "margin: 20px 5px 0px 5px; width: 90%");
-                        }
-                    });
+                @Override
+                public boolean isEnabled() {
+                    return false;
+                }
 
-                    for (DynRealmTO dynRealmTO : dynRealmTree.getObject()) {
-                        final RealmTO realmTO = new RealmTO();
-                        realmTO.setKey(dynRealmTO.getKey());
-                        realmTO.setName(dynRealmTO.getKey());
-                        realmTO.setFullPath(dynRealmTO.getKey());
-
-                        RealmChoicePanel.this.links.add(new BootstrapAjaxLink<RealmTO>(
-                                ButtonList.getButtonMarkupId(),
-                                new Model<RealmTO>(),
-                                Buttons.Type.Link,
-                                new Model<>(realmTO.getKey())) {
-
-                            private static final long serialVersionUID = -7978723352517770644L;
-
-                            @Override
-                            public void onClick(final AjaxRequestTarget target) {
-                                model.setObject(realmTO);
-                                label.setDefaultModelObject(realmTO.getKey());
-                                realmLabel.setDefaultModel(new ResourceModel("dynRealmLabel", "Dynamic Realm"));
-                                target.add(label);
-                                send(pageRef.getPage(), Broadcast.EXACT, new ChosenRealm<>(realmTO, target));
-                            }
-
-                            @Override
-                            public boolean isEnabled() {
-                                return availableRealms.stream()
-                                        .anyMatch(availableRealm -> SyncopeConstants.ROOT_REALM.equals(availableRealm)
-                                        || realmTO.getKey().equals(availableRealm));
-                            }
-                        });
-                    }
+                @Override
+                protected void onComponentTag(final ComponentTag tag) {
+                    tag.put("class", "panel box box-primary box-header with-border");
+                    tag.put("style", "margin: 20px 5px 0px 5px; width: 90%");
                 }
+            });
 
-                return RealmChoicePanel.this.links;
-            }
-        };
-        realms.setOutputMarkupId(true);
-        realms.setAlignment(AlignmentBehavior.Alignment.RIGHT);
-        realms.setType(Buttons.Type.Menu);
+            for (DynRealmTO dynRealmTO : dynRealmTree.getObject()) {
+                final RealmTO realmTO = new RealmTO();
+                realmTO.setKey(dynRealmTO.getKey());
+                realmTO.setName(dynRealmTO.getKey());
+                realmTO.setFullPath(dynRealmTO.getKey());
 
-        MetaDataRoleAuthorizationStrategy.authorize(realms, ENABLE, IdRepoEntitlement.REALM_LIST);
+                RealmChoicePanel.this.links.add(new BootstrapAjaxLink<RealmTO>(
+                        ButtonList.getButtonMarkupId(),
+                        new Model<RealmTO>(),
+                        Buttons.Type.Link,
+                        new Model<>(realmTO.getKey())) {
+
+                    private static final long serialVersionUID = -7978723352517770644L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target) {
+                        model.setObject(realmTO);
+                        label.setDefaultModelObject(realmTO.getKey());
+                        realmLabel.setDefaultModel(new ResourceModel("dynRealmLabel", "Dynamic Realm"));
+                        target.add(label);
+                        send(pageRef.getPage(), Broadcast.EXACT, new ChosenRealm<>(realmTO, target));
+                    }
 
-        container.addOrReplace(realms);
+                    @Override
+                    public boolean isEnabled() {
+                        return availableRealms.stream().anyMatch(availableRealm -> {
+                            return SyncopeConstants.ROOT_REALM.equals(availableRealm)
+                                    || realmTO.getKey().equals(availableRealm);
+                        });
+                    }
+                });
+            }
+        }
     }
 
     public final RealmChoicePanel reloadRealmTree(final AjaxRequestTarget target) {
@@ -360,10 +456,6 @@ public class RealmChoicePanel extends Panel {
         return null;
     }
 
-    public List<AbstractLink> getLinks() {
-        return links;
-    }
-
     public static class ChosenRealm<T> {
 
         private final AjaxRequestTarget target;
@@ -383,4 +475,8 @@ public class RealmChoicePanel extends Panel {
             return target;
         }
     }
+
+    public List<AbstractLink> getLinks() {
+        return links;
+    }
 }
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RealmChoicePanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RealmChoicePanel.html
index 9933477..a6271bb 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RealmChoicePanel.html
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RealmChoicePanel.html
@@ -22,9 +22,18 @@ under the License.
       <div class="realm-label">
         <label wicket:id="realmLabel"/>: <label wicket:id="realm"/>
       </div>
-      <div class="realm-choice">
-        <button wicket:id="realms"></button>
-      </div>
+      <span wicket:id="realmsFragment"></span>
+
+      <wicket:fragment wicket:id="realmsSearchFragment">
+        <div class="realm-choice">
+          <select wicket:id="realmsLiveSearch" class="realm-live-search"></select> 
+        </div>
+      </wicket:fragment>
+      <wicket:fragment wicket:id="realmsListFragment">
+        <div class="realm-choice">
+          <button wicket:id="realms"></button>
+        </div>
+      </wicket:fragment>
     </div>
   </wicket:panel>
 </html>
\ No newline at end of file
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RealmsITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RealmsITCase.java
index 16b7068..ebdec1d 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RealmsITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RealmsITCase.java
@@ -67,10 +67,10 @@ public class RealmsITCase extends AbstractConsoleITCase {
         // remove the new realm just created
         UTILITY_UI.getTester().clickLink("body:realmsLI:realms");
 
-        UTILITY_UI.getTester().
-                executeAjaxEvent("body:content:realmChoicePanel:container:realms:btn", Constants.ON_CLICK);
         UTILITY_UI.getTester().executeAjaxEvent(
-                "body:content:realmChoicePanel:container:realms:dropdown-menu:buttons:5:button",
+                "body:content:realmChoicePanel:container:realmsFragment:realms:btn", Constants.ON_CLICK);
+        UTILITY_UI.getTester().executeAjaxEvent(
+                "body:content:realmChoicePanel:container:realmsFragment:realms:dropdown-menu:buttons:5:button",
                 Constants.ON_CLICK);
 
         UTILITY_UI.getTester().assertLabel("body:content:realmChoicePanel:container:realm", "/testRealm");
@@ -109,10 +109,11 @@ public class RealmsITCase extends AbstractConsoleITCase {
 
     @Test
     public void addUserTemplate() {
-        UTILITY_UI.getTester().
-                executeAjaxEvent("body:content:realmChoicePanel:container:realms:btn", Constants.ON_CLICK);
         UTILITY_UI.getTester().executeAjaxEvent(
-                "body:content:realmChoicePanel:container:realms:dropdown-menu:buttons:4:button",
+                "body:content:realmChoicePanel:container:realmsFragment:realms:btn",
+                Constants.ON_CLICK);
+        UTILITY_UI.getTester().executeAjaxEvent(
+                "body:content:realmChoicePanel:container:realmsFragment:realms:dropdown-menu:buttons:4:button",
                 Constants.ON_CLICK);
 
         UTILITY_UI.getTester().assertLabel("body:content:realmChoicePanel:container:realm", "/odd");
@@ -161,10 +162,10 @@ public class RealmsITCase extends AbstractConsoleITCase {
 
     @Test
     public void verifyPropagation() {
-        UTILITY_UI.getTester().
-                executeAjaxEvent("body:content:realmChoicePanel:container:realms:btn", Constants.ON_CLICK);
-        UTILITY_UI.getTester().executeAjaxEvent(
-                "body:content:realmChoicePanel:container:realms:dropdown-menu:buttons:2:button",
+        UTILITY_UI.getTester().executeAjaxEvent("body:content:realmChoicePanel:container"
+                + ":realmsFragment:realms:btn", Constants.ON_CLICK);
+        UTILITY_UI.getTester().executeAjaxEvent("body:content:realmChoicePanel:container"
+                + ":realmsFragment:realms:dropdown-menu:buttons:2:button",
                 Constants.ON_CLICK);
 
         UTILITY_UI.getTester().clickLink(


[syncope] 03/03: [SYNCOPE-1519]: use hasAttrs instead of findAttrs in SchemaDataBinderImpl.java (#142)

Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git

commit 5df443c0be57273ad2b3d34e1df9f1f26c59b7ea
Author: DmitriyBrashevets <47...@users.noreply.github.com>
AuthorDate: Fri Nov 29 10:17:05 2019 +0300

    [SYNCOPE-1519]: use hasAttrs instead of findAttrs in SchemaDataBinderImpl.java (#142)
---
 .../core/persistence/api/dao/PlainSchemaDAO.java   |  2 ++
 .../persistence/jpa/dao/JPAJSONPlainSchemaDAO.java |  6 +++++
 .../persistence/jpa/dao/JPAPlainSchemaDAO.java     | 29 ++++++++++++++++++++++
 .../java/data/SchemaDataBinderImpl.java            |  2 +-
 4 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/PlainSchemaDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/PlainSchemaDAO.java
index 7f066ac..1554876 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/PlainSchemaDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/PlainSchemaDAO.java
@@ -27,5 +27,7 @@ public interface PlainSchemaDAO extends SchemaDAO<PlainSchema> {
 
     <T extends PlainAttr<?>> List<T> findAttrs(PlainSchema schema, Class<T> reference);
 
+    <T extends PlainAttr<?>> boolean hasAttrs(PlainSchema schema, Class<T> reference);
+
     List<PlainSchema> findByValidator(Implementation validator);
 }
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONPlainSchemaDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONPlainSchemaDAO.java
index cea2564..44aea82 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONPlainSchemaDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJSONPlainSchemaDAO.java
@@ -31,6 +31,12 @@ public class JPAJSONPlainSchemaDAO extends JPAPlainSchemaDAO {
     }
 
     @Override
+    public <T extends PlainAttr<?>> boolean hasAttrs(final PlainSchema schema, final Class<T> plainAttrTable) {
+        // not possible
+        return false;
+    }
+
+    @Override
     protected void deleteAttrs(final PlainSchema schema) {
         // nothing to do
     }
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
index 81dee85..50f6f4e 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.jpa.dao;
 
 import java.util.Collection;
 import java.util.List;
+import javax.persistence.Query;
 import javax.persistence.TypedQuery;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
@@ -32,6 +33,9 @@ import org.apache.syncope.core.persistence.api.entity.Implementation;
 import org.apache.syncope.core.persistence.api.entity.PlainAttr;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.jpa.entity.JPAPlainSchema;
+import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAPlainAttr;
+import org.apache.syncope.core.persistence.jpa.entity.group.JPAGPlainAttr;
+import org.apache.syncope.core.persistence.jpa.entity.user.JPAUPlainAttr;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 
@@ -104,6 +108,18 @@ public class JPAPlainSchemaDAO extends AbstractDAO<PlainSchema> implements Plain
     }
 
     @Override
+    public <T extends PlainAttr<?>> boolean hasAttrs(final PlainSchema schema, final Class<T> reference) {
+        String plainAttrTable = getPlainAttrTable(reference);
+        Query query = entityManager()
+                .createNativeQuery("SELECT COUNT(" + plainAttrTable + ".id) FROM " + JPAPlainSchema.TABLE
+                        + " JOIN " + plainAttrTable + " ON " + JPAPlainSchema.TABLE + ".id = " + plainAttrTable
+                        + ".schema_id WHERE " + JPAPlainSchema.TABLE + ".id = ?1");
+        query.setParameter(1, schema.getKey());
+
+        return (long) query.getSingleResult() > 0;
+    }
+
+    @Override
     public PlainSchema save(final PlainSchema schema) {
         return entityManager().merge(schema);
     }
@@ -135,4 +151,17 @@ public class JPAPlainSchemaDAO extends AbstractDAO<PlainSchema> implements Plain
 
         entityManager().remove(schema);
     }
+
+    private <T extends PlainAttr<?>> String getPlainAttrTable(final Class<T> plainAttrClass) {
+        if (plainAttrClass.equals(JPAGPlainAttr.class)) {
+            return JPAGPlainAttr.TABLE;
+        }
+        if (plainAttrClass.equals(JPAAPlainAttr.class)) {
+            return JPAAPlainAttr.TABLE;
+        }
+        if (plainAttrClass.equals(JPAUPlainAttr.class)) {
+            return JPAUPlainAttr.TABLE;
+        }
+        return JPAUPlainAttr.TABLE;
+    }
 }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
index db4156b..38350c4 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
@@ -177,7 +177,7 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
         boolean hasAttrs = false;
         for (AnyTypeKind anyTypeKind : AnyTypeKind.values()) {
             AnyUtils anyUtils = anyUtilsFactory.getInstance(anyTypeKind);
-            hasAttrs |= plainSchemaDAO.findAttrs(schema, anyUtils.plainAttrClass()).isEmpty();
+            hasAttrs |= plainSchemaDAO.hasAttrs(schema, anyUtils.plainAttrClass());
         }
 
         if (hasAttrs) {


[syncope] 01/03: [SYNCOPE-1511] Use AuditDAO.TABLE_NAME

Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git

commit 599b090ad5714a21d443cfe1409c9d14881a3431
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Thu Nov 28 10:50:11 2019 +0100

    [SYNCOPE-1511] Use AuditDAO.TABLE_NAME
---
 .../java/org/apache/syncope/core/logic/init/LoggerLoader.java    | 9 +++++----
 .../core/provisioning/java/job/report/AuditReportlet.java        | 5 +++--
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java
index f3eddbc..17e357c 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/init/LoggerLoader.java
@@ -41,6 +41,7 @@ import org.apache.syncope.core.logic.MemoryAppender;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.apache.syncope.core.persistence.api.ImplementationLookup;
 import org.apache.syncope.core.persistence.api.SyncopeCoreLoader;
+import org.apache.syncope.core.persistence.api.dao.AuditDAO;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -97,7 +98,7 @@ public class LoggerLoader implements SyncopeCoreLoader {
                     setIgnoreExceptions(false).
                     setConnectionSource(new DataSourceConnectionSource(domain, datasource)).
                     setBufferSize(0).
-                    setTableName("SYNCOPEAUDIT").
+                    setTableName(AuditDAO.TABLE_NAME).
                     setColumnConfigs(buildColumnConfigs(ctx)).
                     setColumnMappings(new ColumnMapping[0]).
                     build();
@@ -155,9 +156,9 @@ public class LoggerLoader implements SyncopeCoreLoader {
     }
 
     public static void addAppenderToContext(
-        final LoggerContext ctx,
-        final AuditAppender auditAppender,
-        final LoggerConfig eventLogConf) {
+            final LoggerContext ctx,
+            final AuditAppender auditAppender,
+            final LoggerConfig eventLogConf) {
 
         Appender targetAppender = ctx.getConfiguration().getAppender(auditAppender.getTargetAppenderName());
         if (targetAppender == null) {
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/AuditReportlet.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/AuditReportlet.java
index 4529a0a..7b9c555 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/AuditReportlet.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/AuditReportlet.java
@@ -26,6 +26,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.report.AuditReportletConf;
 import org.apache.syncope.common.lib.report.ReportletConf;
 import org.apache.syncope.core.persistence.api.DomainHolder;
+import org.apache.syncope.core.persistence.api.dao.AuditDAO;
 import org.apache.syncope.core.persistence.api.entity.AuditEntry;
 import org.apache.syncope.core.provisioning.api.AuditEntryImpl;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
@@ -48,12 +49,12 @@ public class AuditReportlet extends AbstractReportlet {
     private DataSource datasource;
 
     private void doExtractConf(final ContentHandler handler, final AtomicReference<String> status) throws SAXException {
-        status.set("Fetching " + conf.getSize() + " rows from the SYNCOPEAUDIT table");
+        status.set("Fetching " + conf.getSize() + " rows from the " + AuditDAO.TABLE_NAME + " table");
 
         JdbcTemplate jdbcTemplate = new JdbcTemplate(datasource);
         jdbcTemplate.setMaxRows(conf.getSize());
         List<Map<String, Object>> rows = jdbcTemplate.
-                queryForList("SELECT * FROM SYNCOPEAUDIT ORDER BY EVENT_DATE DESC");
+                queryForList("SELECT * FROM " + AuditDAO.TABLE_NAME + " ORDER BY EVENT_DATE DESC");
 
         handler.startElement("", "", "events", null);
         AttributesImpl atts = new AttributesImpl();