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);