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 2020/02/18 13:46:39 UTC

[syncope] branch master updated (d043ab8 -> fa9d913)

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 d043ab8  Fix build
     new 2d28f32  [SYNCOPE-1502] Bring back actual result sorting
     new fa9d913  Various cleanings

The 2 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:
 .../wizards/any/ProvisioningReportsPanel.java      |  3 +
 .../client/console/commons/AnyDataProvider.java    |  1 -
 .../client/console/panels/ListViewPanel.java       | 25 ++++++--
 .../client/console/panels/ListViewPanel.html       |  2 +-
 .../persistence/jpa/dao/AbstractAnySearchDAO.java  |  7 +-
 .../core/persistence/jpa/dao/JPAAnySearchDAO.java  | 74 +++++++++++++---------
 6 files changed, 73 insertions(+), 39 deletions(-)


[syncope] 02/02: Various cleanings

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 fa9d913813be2b5bf1271afba1bd083c4f5dca80
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Tue Feb 18 14:39:27 2020 +0100

    Various cleanings
---
 .../wizards/any/ProvisioningReportsPanel.java      |  3 +
 .../client/console/commons/AnyDataProvider.java    |  1 -
 .../client/console/panels/ListViewPanel.java       | 25 ++++++--
 .../client/console/panels/ListViewPanel.html       |  2 +-
 .../core/persistence/jpa/dao/JPAAnySearchDAO.java  | 74 +++++++++++++---------
 5 files changed, 68 insertions(+), 37 deletions(-)

diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/any/ProvisioningReportsPanel.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/any/ProvisioningReportsPanel.java
index 264bb3f..93cd503 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/any/ProvisioningReportsPanel.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/wizards/any/ProvisioningReportsPanel.java
@@ -51,6 +51,7 @@ public class ProvisioningReportsPanel extends Panel {
                 return new ListViewPanel.Builder<>(ProvisioningReport.class, pageRef).
                         setItems(success).
                         withChecks(ListViewPanel.CheckAvailability.NONE).
+                        setCaptionVisible(false).
                         includes("name", "message").
                         build(panelId);
             }
@@ -69,6 +70,7 @@ public class ProvisioningReportsPanel extends Panel {
                 return new ListViewPanel.Builder<>(ProvisioningReport.class, pageRef).
                         setItems(failure).
                         withChecks(ListViewPanel.CheckAvailability.NONE).
+                        setCaptionVisible(false).
                         includes("name", "message").
                         build(panelId);
             }
@@ -87,6 +89,7 @@ public class ProvisioningReportsPanel extends Panel {
                 return new ListViewPanel.Builder<>(ProvisioningReport.class, pageRef).
                         setItems(ignore).
                         withChecks(ListViewPanel.CheckAvailability.NONE).
+                        setCaptionVisible(false).
                         includes("name", "message").
                         build(panelId);
             }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java
index 2f4dc17..a1aa807 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java
@@ -115,7 +115,6 @@ public class AnyDataProvider<A extends AnyTO> extends DirectoryDataProvider<A> {
                     -> ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(ajaxRequestTarget));
         }
 
-        result.sort(comparator);
         return result.iterator();
     }
 
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
index b0d39ef..6c3f419 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
@@ -40,6 +40,7 @@ import org.apache.wicket.ajax.AjaxEventBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.core.util.lang.PropertyResolver;
 import org.apache.wicket.event.IEvent;
+import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Check;
 import org.apache.wicket.markup.html.form.CheckGroup;
@@ -104,7 +105,9 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
             final CheckAvailability check,
             final boolean reuseItem,
             final boolean wizardInModal,
+            final boolean captionVisible,
             final IModel<? extends Collection<T>> model) {
+
         super(id, wizardInModal);
         setOutputMarkupId(true);
 
@@ -112,9 +115,15 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
 
         this.check = Model.of(check);
 
-        addInnerObject(new Label("caption", new ResourceModel("listview.caption", StringUtils.EMPTY)));
+        WebMarkupContainer captionContainer = new WebMarkupContainer("captionContainer");
+        captionContainer.setOutputMarkupPlaceholderTag(true);
+        captionContainer.setVisible(captionVisible);
+        addInnerObject(captionContainer);
+
+        Label caption = new Label("caption", new ResourceModel("listview.caption", StringUtils.EMPTY));
+        captionContainer.add(caption);
 
-        final CheckGroup<T> checkGroup = new CheckGroup<>("group", model);
+        CheckGroup<T> checkGroup = new CheckGroup<>("group", model);
         checkGroup.setOutputMarkupId(true);
         checkGroup.add(new IndicatorAjaxFormChoiceComponentUpdatingBehavior() {
 
@@ -273,6 +282,8 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
 
         private boolean reuseItem = true;
 
+        private boolean captionVisible = true;
+
         private final Class<T> reference;
 
         public Builder(final Class<T> reference, final PageReference pageRef) {
@@ -322,8 +333,14 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
             return this;
         }
 
-        public void setReuseItem(final boolean reuseItem) {
+        public Builder<T> setReuseItem(final boolean reuseItem) {
             this.reuseItem = reuseItem;
+            return this;
+        }
+
+        public Builder<T> setCaptionVisible(final boolean captionVisible) {
+            this.captionVisible = captionVisible;
+            return this;
         }
 
         /**
@@ -406,7 +423,7 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
         @Override
         protected WizardMgtPanel<T> newInstance(final String id, final boolean wizardInModal) {
             return new ListViewPanel<T>(
-                    id, items, reference, includes, actions, check, reuseItem, wizardInModal, model) {
+                    id, items, reference, includes, actions, check, reuseItem, wizardInModal, captionVisible, model) {
 
                 private static final long serialVersionUID = -1715389337530657988L;
 
diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/ListViewPanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/ListViewPanel.html
index 400b2a0..ca871d8 100644
--- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/ListViewPanel.html
+++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/ListViewPanel.html
@@ -24,7 +24,7 @@ under the License.
     <wicket:extend>
       <div class="col-xs-12">
         <div class="box">
-          <div class="box-header">
+          <div class="box-header" wicket:id="captionContainer">
             <h3 class="box-title">
               <span wicket:id="caption"/>
             </h3>
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
index 3bf81da..687f2ae 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
@@ -170,7 +170,7 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
             LOG.debug("Query: {}, parameters: {}", queryString, parameters);
 
             // 2. take into account realms and ordering
-            OrderBySupport obs = parseOrderBy(kind, svs, orderBy);
+            OrderBySupport obs = parseOrderBy(svs, orderBy);
             if (queryString.charAt(0) == '(') {
                 queryString.insert(0, buildSelect(obs));
                 queryString.append(buildWhere(svs, queryInfo.getRight(), obs));
@@ -382,12 +382,20 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
         }
     }
 
+    protected void parseOrderByForCustom(
+            final SearchSupport svs,
+            final OrderByClause clause,
+            final OrderBySupport.Item item,
+            final OrderBySupport obs) {
+
+        // do nothing by default, meant for subclasses
+    }
+
     private OrderBySupport parseOrderBy(
-            final AnyTypeKind kind,
             final SearchSupport svs,
             final List<OrderByClause> orderBy) {
 
-        AnyUtils anyUtils = anyUtilsFactory.getInstance(kind);
+        AnyUtils anyUtils = anyUtilsFactory.getInstance(svs.anyTypeKind);
 
         OrderBySupport obs = new OrderBySupport();
 
@@ -396,38 +404,42 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
         orderBy.forEach(clause -> {
             OrderBySupport.Item item = new OrderBySupport.Item();
 
-            if (anyUtils.getField(clause.getField()) == null) {
-                PlainSchema schema = schemaDAO.find(clause.getField());
-                if (schema != null) {
-                    if (schema.isUniqueConstraint()) {
-                        orderByUniquePlainSchemas.add(schema.getKey());
-                    } else {
-                        orderByNonUniquePlainSchemas.add(schema.getKey());
-                    }
-                    if (orderByUniquePlainSchemas.size() > 1 || orderByNonUniquePlainSchemas.size() > 1) {
-                        SyncopeClientException invalidSearch =
-                                SyncopeClientException.build(ClientExceptionType.InvalidSearchExpression);
-                        invalidSearch.getElements().add("Order by more than one attribute is not allowed; "
-                                + "remove one from " + (orderByUniquePlainSchemas.size() > 1
-                                ? orderByUniquePlainSchemas : orderByNonUniquePlainSchemas));
-                        throw invalidSearch;
+            parseOrderByForCustom(svs, clause, item, obs);
+
+            if (item.isEmpty()) {
+                if (anyUtils.getField(clause.getField()) == null) {
+                    PlainSchema schema = schemaDAO.find(clause.getField());
+                    if (schema != null) {
+                        if (schema.isUniqueConstraint()) {
+                            orderByUniquePlainSchemas.add(schema.getKey());
+                        } else {
+                            orderByNonUniquePlainSchemas.add(schema.getKey());
+                        }
+                        if (orderByUniquePlainSchemas.size() > 1 || orderByNonUniquePlainSchemas.size() > 1) {
+                            SyncopeClientException invalidSearch =
+                                    SyncopeClientException.build(ClientExceptionType.InvalidSearchExpression);
+                            invalidSearch.getElements().add("Order by more than one attribute is not allowed; "
+                                    + "remove one from " + (orderByUniquePlainSchemas.size() > 1
+                                    ? orderByUniquePlainSchemas : orderByNonUniquePlainSchemas));
+                            throw invalidSearch;
+                        }
+                        parseOrderByForPlainSchema(svs, obs, item, clause, schema, clause.getField());
                     }
-                    parseOrderByForPlainSchema(svs, obs, item, clause, schema, clause.getField());
-                }
-            } else {
-                // Manage difference among external key attribute and internal JPA @Id
-                String fieldName = "key".equals(clause.getField()) ? "id" : clause.getField();
+                } else {
+                    // Manage difference among external key attribute and internal JPA @Id
+                    String fieldName = "key".equals(clause.getField()) ? "id" : clause.getField();
 
-                // Adjust field name to column name
-                if (ArrayUtils.contains(RELATIONSHIP_FIELDS, fieldName)) {
-                    fieldName += "_id";
-                }
+                    // Adjust field name to column name
+                    if (ArrayUtils.contains(RELATIONSHIP_FIELDS, fieldName)) {
+                        fieldName += "_id";
+                    }
 
-                obs.views.add(svs.field());
+                    obs.views.add(svs.field());
 
-                item.select = svs.field().alias + '.' + fieldName;
-                item.where = StringUtils.EMPTY;
-                item.orderBy = svs.field().alias + '.' + fieldName + ' ' + clause.getDirection().name();
+                    item.select = svs.field().alias + '.' + fieldName;
+                    item.where = StringUtils.EMPTY;
+                    item.orderBy = svs.field().alias + '.' + fieldName + ' ' + clause.getDirection().name();
+                }
             }
 
             if (item.isEmpty()) {


[syncope] 01/02: [SYNCOPE-1502] Bring back actual result sorting

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 2d28f32878426e580d53d4545ce404fb72cf55b3
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Tue Feb 18 14:39:16 2020 +0100

    [SYNCOPE-1502] Bring back actual result sorting
---
 .../syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java     | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
index 28cd299..ea9c5ed 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
@@ -20,8 +20,9 @@ package org.apache.syncope.core.persistence.jpa.dao;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
-import java.util.Optional;
+import java.util.Comparator;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 import javax.validation.ValidationException;
@@ -302,7 +303,9 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement
                 map(key -> key instanceof Object[] ? (String) ((Object[]) key)[0] : ((String) key)).
                 collect(Collectors.toList());
 
-        List<Any<?>> anys = anyUtilsFactory.getInstance(kind).dao().findByKeys(keys);
+        // sort anys according to keys' sorting, as their ordering is same as raw, e.g. the actual sql query results
+        List<Any<?>> anys = anyUtilsFactory.getInstance(kind).dao().findByKeys(keys).stream().
+                sorted(Comparator.comparing(any -> keys.indexOf(any.getKey()))).collect(Collectors.toList());
 
         keys.stream().filter(key -> !anys.stream().anyMatch(any -> key.equals(any.getKey()))).
                 forEach(key -> LOG.error("Could not find {} with id {}, even if returned by native query", kind, key));