From 8424b75303306daa62423f217e0d1dc5890e814e Mon Sep 17 00:00:00 2001
From: vharseko <vharseko@openam.org.ru>
Date: Tue, 18 Dec 2018 22:52:14 +0000
Subject: [PATCH] Sorted predictive attributes name order for LDIF (version control)

---
 opendj-ldap-toolkit/src/test/resources/expected_output_80_column.ldif            |    8 ++++----
 opendj-core/src/main/java/org/forgerock/opendj/ldif/LDIFEntryWriter.java         |   12 ++++++++++--
 opendj-core/src/test/java/org/forgerock/opendj/ldif/LDIFEntryWriterTestCase.java |   18 ++++++++++++++----
 opendj-ldap-toolkit/src/test/resources/expected_output.ldif                      |    6 +++---
 4 files changed, 31 insertions(+), 13 deletions(-)

diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldif/LDIFEntryWriter.java b/opendj-core/src/main/java/org/forgerock/opendj/ldif/LDIFEntryWriter.java
index 2f15423..1a15741 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldif/LDIFEntryWriter.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldif/LDIFEntryWriter.java
@@ -20,10 +20,13 @@
 import java.io.OutputStream;
 import java.io.StringWriter;
 import java.io.Writer;
+import java.util.AbstractMap;
 import java.util.List;
+import java.util.TreeMap;
 
 import org.forgerock.opendj.ldap.Attribute;
 import org.forgerock.opendj.ldap.AttributeDescription;
+import org.forgerock.opendj.ldap.ByteSequence;
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.DN;
 import org.forgerock.opendj.ldap.Entry;
@@ -269,6 +272,8 @@
         }
 
         writeKeyAndValue("dn", entry.getName().toString());
+
+        final TreeMap<String,AbstractMap.SimpleEntry<String,ByteSequence>> attr=new TreeMap<>(); //sort by key:value
         for (final Attribute attribute : entry.getAllAttributes()) {
             // Filter the attribute if required.
             if (isAttributeExcluded(attribute.getAttributeDescription())) {
@@ -277,13 +282,16 @@
 
             final String attributeDescription = attribute.getAttributeDescriptionAsString();
             if (attribute.isEmpty()) {
-                writeKeyAndValue(attributeDescription, ByteString.empty());
+            	attr.put(attributeDescription+attr.size(), new AbstractMap.SimpleEntry<String,ByteSequence>(attributeDescription,ByteString.empty()) );
             } else {
                 for (final ByteString value : attribute) {
-                    writeKeyAndValue(attributeDescription, value);
+                    attr.put(attributeDescription+attr.size(), new AbstractMap.SimpleEntry<String,ByteSequence>(attributeDescription,value));
                 }
             }
         }
+        for (AbstractMap.SimpleEntry<String,ByteSequence> kv : attr.values()) {
+        	 writeKeyAndValue(kv.getKey(), kv.getValue());
+		}
 
         // Make sure there is a blank line after the entry.
         impl.println();
diff --git a/opendj-core/src/test/java/org/forgerock/opendj/ldif/LDIFEntryWriterTestCase.java b/opendj-core/src/test/java/org/forgerock/opendj/ldif/LDIFEntryWriterTestCase.java
index 267756c..f5cd9de 100644
--- a/opendj-core/src/test/java/org/forgerock/opendj/ldif/LDIFEntryWriterTestCase.java
+++ b/opendj-core/src/test/java/org/forgerock/opendj/ldif/LDIFEntryWriterTestCase.java
@@ -752,10 +752,20 @@
         writer.close();
 
         final String[] expected =
-                new String[] { "dn: cn=John Doe,ou=people,dc=example,dc=com", "objectClass: top",
-                    "objectClass: person", "objectClass: inetOrgPerson", "cn: John Doe", "sn: Doe",
-                    "givenName: John", "description: one two", "description: three four",
-                    "description: five six", "typeOnly: ", "localized;lang-fr:: w6dlZGlsbGE=", "", };
+                new String[] { "dn: cn=John Doe,ou=people,dc=example,dc=com", 
+                		"cn: John Doe", 
+                		"description: one two", 
+                		"description: three four",
+                		"description: five six", 
+                		"givenName: John",
+                		"localized;lang-fr:: w6dlZGlsbGE=", 
+                		"objectClass: top",
+                		"objectClass: person", 
+                		"objectClass: inetOrgPerson", 
+                		"sn: Doe",
+                		"typeOnly: ", 
+                		
+                		"", };
 
         Assert.assertEquals(actual.size(), expected.length);
         for (int i = 0; i < expected.length; i++) {
diff --git a/opendj-ldap-toolkit/src/test/resources/expected_output.ldif b/opendj-ldap-toolkit/src/test/resources/expected_output.ldif
index e5095ca..30dd660 100644
--- a/opendj-ldap-toolkit/src/test/resources/expected_output.ldif
+++ b/opendj-ldap-toolkit/src/test/resources/expected_output.ldif
@@ -3,9 +3,9 @@
 
 dn: coretokenid=tokenId,dc=example,dc=com
 coretokenid: tokenId
+coretokenobject: {"redirectURI":["http://fake.com"],"acr":[],"clientID":["clientOIDC"],"lineFoldingTest":["This line should have been correctly folded"],"tokenName":["refresh_token"],"authModules":["LDAP"],"realm":["/myrealm"],"id":["fakeid"],"userName":["johndoe"],"tokenType":["Bearer"]}
+coretokenstring07: Bearer
+coretokenstring08: /myrealm
 objectClass: top
 objectClass: frCoreToken
-coretokenstring08: /myrealm
-coretokenstring07: Bearer
-coretokenobject: {"redirectURI":["http://fake.com"],"acr":[],"clientID":["clientOIDC"],"lineFoldingTest":["This line should have been correctly folded"],"tokenName":["refresh_token"],"authModules":["LDAP"],"realm":["/myrealm"],"id":["fakeid"],"userName":["johndoe"],"tokenType":["Bearer"]}
 
diff --git a/opendj-ldap-toolkit/src/test/resources/expected_output_80_column.ldif b/opendj-ldap-toolkit/src/test/resources/expected_output_80_column.ldif
index 45e611c..93a7749 100644
--- a/opendj-ldap-toolkit/src/test/resources/expected_output_80_column.ldif
+++ b/opendj-ldap-toolkit/src/test/resources/expected_output_80_column.ldif
@@ -3,12 +3,12 @@
 
 dn: coretokenid=tokenId,dc=example,dc=com
 coretokenid: tokenId
-objectClass: top
-objectClass: frCoreToken
-coretokenstring08: /myrealm
-coretokenstring07: Bearer
 coretokenobject: {"redirectURI":["http://fake.com"],"acr":[],"clientID":["client
  OIDC"],"lineFoldingTest":["This line should have been correctly folded"],"token
  Name":["refresh_token"],"authModules":["LDAP"],"realm":["/myrealm"],"id":["fake
  id"],"userName":["johndoe"],"tokenType":["Bearer"]}
+coretokenstring07: Bearer
+coretokenstring08: /myrealm
+objectClass: top
+objectClass: frCoreToken
 

--
Gitblit v1.10.0