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/01/30 10:49:30 UTC

[syncope] branch master updated: [SYNCOPE-1531] Attempt to keep column order as requested

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


The following commit(s) were added to refs/heads/master by this push:
     new 254611f  [SYNCOPE-1531] Attempt to keep column order as requested
254611f is described below

commit 254611fed6623e1dafb8dda63d201413c63c1291
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Thu Jan 30 11:46:20 2020 +0100

    [SYNCOPE-1531] Attempt to keep column order as requested
---
 .../syncope/core/logic/ReconciliationLogic.java    |  3 ++-
 .../java/pushpull/stream/CSVStreamConnector.java   | 28 +++++++++++++++++-----
 2 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java b/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java
index ccb4380..ec5976f 100644
--- a/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java
+++ b/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java
@@ -478,7 +478,8 @@ public class ReconciliationLogic extends AbstractTransactionalLogic<EntityTO> {
                 spec.getArrayElementSeparator(),
                 csvSchema(spec),
                 null,
-                os)) {
+                os,
+                columns.toArray(new String[columns.size()]))) {
 
             return streamPushExecutor.push(
                     anyType,
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/stream/CSVStreamConnector.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/stream/CSVStreamConnector.java
index 6b025ae..a1e04ef 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/stream/CSVStreamConnector.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/stream/CSVStreamConnector.java
@@ -26,7 +26,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -69,6 +69,8 @@ public class CSVStreamConnector implements Connector, AutoCloseable {
 
     private final OutputStream out;
 
+    private final List<String> columns;
+
     private MappingIterator<Map<String, String>> reader;
 
     private SequenceWriter writer;
@@ -78,13 +80,15 @@ public class CSVStreamConnector implements Connector, AutoCloseable {
             final String arrayElementsSeparator,
             final CsvSchema.Builder schemaBuilder,
             final InputStream in,
-            final OutputStream out) {
+            final OutputStream out,
+            final String... columns) {
 
         this.keyColumn = keyColumn;
         this.arrayElementsSeparator = arrayElementsSeparator;
         this.schemaBuilder = schemaBuilder;
         this.in = in;
         this.out = out;
+        this.columns = List.of(columns);
     }
 
     @Override
@@ -107,13 +111,13 @@ public class CSVStreamConnector implements Connector, AutoCloseable {
     }
 
     public List<String> getColumns(final CSVPullSpec spec) throws IOException {
-        List<String> columns = new ArrayList<>();
+        List<String> fromSpec = new ArrayList<>();
         ((CsvSchema) reader().getParserSchema()).forEach(column -> {
             if (!spec.getIgnoreColumns().contains(column.getName())) {
-                columns.add(column.getName());
+                fromSpec.add(column.getName());
             }
         });
-        return columns;
+        return fromSpec;
     }
 
     public SequenceWriter writer() throws IOException {
@@ -145,11 +149,23 @@ public class CSVStreamConnector implements Connector, AutoCloseable {
         synchronized (schemaBuilder) {
             if (schemaBuilder.size() == 0) {
                 attrs.stream().filter(attr -> !AttributeUtil.isSpecial(attr)).map(Attribute::getName).
+                        sorted((c1, c2) -> {
+                            // sort according to the passed columns, leave any additional column at the end
+                            int index1 = columns.indexOf(c1);
+                            if (index1 == -1) {
+                                index1 = Integer.MAX_VALUE;
+                            }
+                            int index2 = columns.indexOf(c2);
+                            if (index2 == -1) {
+                                index2 = Integer.MAX_VALUE;
+                            }
+                            return Integer.compare(index1, index2);
+                        }).
                         forEachOrdered(schemaBuilder::addColumn);
             }
         }
 
-        Map<String, String> row = new HashMap<>();
+        Map<String, String> row = new LinkedHashMap<>();
         attrs.stream().filter(attr -> !AttributeUtil.isSpecial(attr)).forEach(attr -> {
             if (CollectionUtils.isEmpty(attr.getValue()) || attr.getValue().get(0) == null) {
                 row.put(attr.getName(), null);