From 1e545de844fe77a701b0f47f28bafda17927f6d0 Mon Sep 17 00:00:00 2001
From: Glenn Van Lint <glenn.vanlint@is4u.be>
Date: Tue, 30 Apr 2013 11:34:48 +0000
Subject: [PATCH] Fixed a bug with incorrect value returns from the attribute mapping.

---
 opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCMapper.java |   96 +++++++++++++++++++++++-------------------------
 1 files changed, 46 insertions(+), 50 deletions(-)

diff --git a/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCMapper.java b/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCMapper.java
index 6145e8e..ce759e5 100644
--- a/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCMapper.java
+++ b/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCMapper.java
@@ -33,6 +33,7 @@
 
 import org.forgerock.opendj.ldap.Attribute;
 import org.forgerock.opendj.ldap.Connection;
+import org.forgerock.opendj.ldap.DN;
 import org.forgerock.opendj.ldap.ErrorResultException;
 import org.forgerock.opendj.ldap.ErrorResultIOException;
 import org.forgerock.opendj.ldap.SearchResultReferenceIOException;
@@ -73,12 +74,11 @@
     fillBaseDNList();
     fillTablesList();
     fillTableColumnsMap();
-    fillOrganizationalUnitsMap();
-    fillOrganizationalUnitAttributesMap();
+    fillOrganizationalUnitsAndAttributesMap();
   }
 
   private void fillBaseDNList() throws IOException{
-    EntryReader reader = this.ldapConnection.search(" ", SearchScope.SINGLE_LEVEL, "objectClass=*");
+    final EntryReader reader = this.ldapConnection.search(" ", SearchScope.SINGLE_LEVEL, "objectClass=*");
     while(reader.hasNext()){
       baseDNList.add(reader.readEntry().getName().toString());
     }
@@ -124,60 +124,52 @@
     return baseDNList;
   }
 
-  public ArrayList<String> getTableColumns(String tableName) throws SQLException{
+  public ArrayList<String> getTableColumns(final String tableName) throws SQLException{
     final ArrayList<String> tableColumnsList = tableColumnsMap.get(tableName);
     return tableColumnsList;
   }   
 
-  public boolean getTableColumnNullable(String tableName, String columnName){
-    String mappingKey = tableName + ":" + columnName;
-    String nullable = tableColumnNullableMap.get(mappingKey);
-    if(nullable.equals("NO")) return false;
+  public boolean getTableColumnNullable(final String tableName, final String columnName){
+    final String mappingKey = tableName + ":" + columnName;
+    final String nullable = tableColumnNullableMap.get(mappingKey);
+    final String nullableString = "NO";
+    if(nullable.equals(nullableString)) return false;
     else return true;
   }
 
-  public Object getTableColumnDataType(String tableName, String columnName){
-    String mappingKey = tableName + ":" + columnName;
-    String mappingValue = tableColumnDataTypeMap.get(mappingKey);
-    if(mappingValue.equals("int")) return Integer.class;
+  public Object getTableColumnDataType(final String tableName, final String columnName){
+    final String mappingKey = tableName + ":" + columnName;
+    final String mappingValue = tableColumnDataTypeMap.get(mappingKey);
+    final String objectTypeString = "int";
+    if(mappingValue.equals(objectTypeString)) return Integer.class;
     return String.class;
   }
 
-  public ArrayList<String> getOrganizationalUnits(String baseDN){
+  public ArrayList<String> getOrganizationalUnits(final String baseDN){
     return organizationalUnitsMap.get(baseDN);
   }
 
-  public ArrayList<String> getOrganizationalUnitAttributes(String baseDN, String organizationalUnitName){
+  public ArrayList<String> getOrganizationalUnitAttributes(final String baseDN, final String organizationalUnitName){
     return organizationalUnitAttributesMap.get(baseDN + ":" + organizationalUnitName);
   }
 
-  private void fillOrganizationalUnitsMap() throws ErrorResultException, ErrorResultIOException, SearchResultReferenceIOException{
+  private void fillOrganizationalUnitsAndAttributesMap() throws ErrorResultException, ErrorResultIOException, SearchResultReferenceIOException{
     for(int i = 0; i < baseDNList.size(); i++){
-      String baseDN = baseDNList.get(i);
-      ConnectionEntryReader reader = ldapConnection.search(baseDN, SearchScope.WHOLE_SUBTREE, "ou=*");
+      final String baseDN = baseDNList.get(i);
+      final ConnectionEntryReader baseDNReader = ldapConnection.search(baseDN, SearchScope.SINGLE_LEVEL, "objectClass=*");
 
       ArrayList<String> organizationalUnitsList = new ArrayList<String>();
-      while (reader.hasNext()) {
-        final SearchResultEntry entry = reader.readEntry();
-        final Iterator<Attribute> it = entry.getAllAttributes().iterator();
-        organizationalUnitsList.add(it.next().firstValueAsString());
-      }
-      organizationalUnitsMap.put(baseDN, organizationalUnitsList);
-    }
-  }
+      while (baseDNReader.hasNext()) {
+        final SearchResultEntry entry = baseDNReader.readEntry();
+        final String organizationalUnitDNName = entry.getName().toString();
+        final String organizationalUnitName = DN.valueOf(organizationalUnitDNName).rdn().getFirstAVA().getAttributeValue().toString();
+        organizationalUnitsList.add(organizationalUnitName);
 
-  private void fillOrganizationalUnitAttributesMap() throws ErrorResultIOException, SearchResultReferenceIOException{
-    for(int i = 0; i < baseDNList.size(); i++){
-      String baseDN = baseDNList.get(i);
-      ArrayList<String> organizationalUnitsList = organizationalUnitsMap.get(baseDN);
-
-      for(int j = 0; j < organizationalUnitsList.size(); j++){
-        final String organizationalUnitName = organizationalUnitsList.get(j);
-        final ConnectionEntryReader reader = ldapConnection.search("ou=" + organizationalUnitName + "," + baseDN, SearchScope.WHOLE_SUBTREE, "objectClass=*");
+        final ConnectionEntryReader DNReader = ldapConnection.search(organizationalUnitDNName, SearchScope.SINGLE_LEVEL, "objectClass=*");
         final ArrayList<String> attributesList;
 
-        if(reader.hasNext()){
-          final Iterator<Attribute> it = reader.readEntry().getAllAttributes().iterator();
+        if(DNReader.hasNext()){
+          final Iterator<Attribute> it = DNReader.readEntry().getAllAttributes().iterator();
           attributesList = new ArrayList<String>();
 
           while(it.hasNext()){
@@ -190,11 +182,12 @@
           attributesList.add("");
         }
         organizationalUnitAttributesMap.put(baseDN + ":" + organizationalUnitName, attributesList);
-      }    
+      }
+      organizationalUnitsMap.put(baseDN, organizationalUnitsList);
     }
   }
 
-  public void addCurrentMapToMapping(String tableName, String[] columnNames, String baseDN, String OUName, String[] attributeNames){
+  public void addCurrentMapToMapping(final String tableName, final String[] columnNames, final String baseDN, final String OUName, final String[] attributeNames){
     String mappingKey, mappingValue;
 
     for(int i = 0; i < columnNames.length; i++){
@@ -208,16 +201,17 @@
     return SQLToLDAPMap;
   }
 
-  public Map<String, String> loadCurrentMapFromMapping(String tableName) {
+  public Map<String, String> loadCurrentMapFromMapping(final String tableName, String baseDN, String DN) {
+    baseDN = baseDN.replace(" ", "");
     String mappingKey, mappingValue;
     final ArrayList<String> tableColumnsList = tableColumnsMap.get(tableName);
-    Map<String, String> currentMap = new HashMap<String, String>();
+    final Map<String, String> currentMap = new HashMap<String, String>();
 
     for(int i = 0; i < tableColumnsList.size(); i++){
       mappingKey = tableName + ":" + tableColumnsList.get(i);
       if(!SQLToLDAPMap.containsKey(mappingKey)) continue;
       mappingValue = SQLToLDAPMap.get(mappingKey);
-      currentMap.put(mappingKey, mappingValue);
+      if(mappingValue.contains(baseDN + ":" + DN)) currentMap.put(mappingKey, mappingValue);
     }
     return currentMap;
   }
@@ -226,27 +220,29 @@
     this.SQLToLDAPMap = m;
   }
 
-  public String getTableNameFromMapping(String DN, String organizationalUnit) {
+  public String getTableNameFromMapping(String DN, final String organizationalUnit) {
+    DN = DN.replace(" ", "");
     for (Entry<String, String> entry : SQLToLDAPMap.entrySet()) {
-      String mappingValue = entry.getValue();
+      final String mappingValue = entry.getValue();
       if (mappingValue.contains(DN + ":" + organizationalUnit)) {
-        String mappingKey = entry.getKey();
-        String stringSplitter[] = mappingKey.split(":");
-        String tableName = stringSplitter[0];
+        final String mappingKey = entry.getKey();
+        final String stringSplitter[] = mappingKey.split(":");
+        final String tableName = stringSplitter[0];
         return tableName;
       }
     }
     return null;
   }
 
-  public String getColumnNameFromMapping(String tableName, String baseDN, String organizationalUnitName, String attributeName) {
+  public String getColumnNameFromMapping(final String tableName, String baseDN, final String organizationalUnitName, final String attributeName) {
+    baseDN = baseDN.replace(" ", "");
     for (Entry<String, String> entry : SQLToLDAPMap.entrySet()) {
-      String mappingValue = entry.getValue();
+      final String mappingValue = entry.getValue();
       if (mappingValue.equals(baseDN + ":" + organizationalUnitName + ":" + attributeName)) {
-        String mappingKey = entry.getKey();
+        final String mappingKey = entry.getKey();
         if(mappingKey.contains(tableName)){
-          String stringSplitter[] = mappingKey.split(":");
-          String columnName = stringSplitter[1];
+          final String stringSplitter[] = mappingKey.split(":");
+          final String columnName = stringSplitter[1];
           return columnName;
         }
       }

--
Gitblit v1.10.0