From 3df6f8de9aaa8b3699635436f73b4dbd643e33d7 Mon Sep 17 00:00:00 2001
From: Glenn Van Lint <glenn.vanlint@is4u.be>
Date: Tue, 14 May 2013 09:09:18 +0000
Subject: [PATCH] Fixed a bug in the modify operation where values were not added correctly.

---
 opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCConnection.java |  123 ++++++++++++++++++++++++++++------------
 1 files changed, 86 insertions(+), 37 deletions(-)

diff --git a/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCConnection.java b/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCConnection.java
index 8da548c..00d7134 100644
--- a/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCConnection.java
+++ b/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCConnection.java
@@ -39,9 +39,11 @@
 import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.ConnectionEventListener;
 import org.forgerock.opendj.ldap.DN;
+import org.forgerock.opendj.ldap.Entry;
 import org.forgerock.opendj.ldap.ErrorResultException;
 import org.forgerock.opendj.ldap.Filter;
 import org.forgerock.opendj.ldap.IntermediateResponseHandler;
+import org.forgerock.opendj.ldap.LinkedHashMapEntry;
 import org.forgerock.opendj.ldap.Modification;
 import org.forgerock.opendj.ldap.ModificationType;
 import org.forgerock.opendj.ldap.RDN;
@@ -64,24 +66,29 @@
 import org.forgerock.opendj.ldap.responses.Result;
 
 public final class JDBCConnection extends AbstractSynchronousConnection {
+  // For connection to h2 database, use driverName = "org.h2.driver";
   private final String driverName = "com.mysql.jdbc.Driver";
   private java.sql.Connection connection;
   private String connectionUrl;
   private JDBCMapper jdbcm;
   private MappingConfigurationManager mcm;
+  private List<Entry> searchEntries = new ArrayList<Entry>();
 
-  JDBCConnection(final String connectionURL) {
+  JDBCConnection(final String connectionURL) 
+  {
     this.connectionUrl = connectionURL;
   }   
 
-  public void initializeMapper(JDBCMapper jdbcmapper) throws SQLException, ErrorResultException, IOException{
+  public void initializeMapper(JDBCMapper jdbcmapper) throws SQLException, ErrorResultException, IOException
+  {
     jdbcm = jdbcmapper;
     jdbcm.fillMaps();
     mcm = new MappingConfigurationManager(jdbcm);
     jdbcm.loadMappingConfig(mcm.loadMapping());
   }
 
-  public java.sql.Connection getSqlConnection(){
+  public java.sql.Connection getSqlConnection()
+  {
     return connection;
   }
 
@@ -91,9 +98,9 @@
     Result r;
     try {
       final DN DN = request.getName();
-      final RDN OU = DN.rdn();
+      final RDN OU = DN.parent().rdn();
       final String organizationalUnitName = OU.getFirstAVA().getAttributeValue().toString();
-      final String baseDN = DN.parent(1).toString();
+      final String baseDN = DN.parent(2).toString();
       final String tableName = jdbcm.getTableNameFromMapping(baseDN, organizationalUnitName);
       final Map<String, Object> columnValuesMap = new HashMap<String, Object>();
       final Iterable<Attribute> attributesCollection = request.getAllAttributes();
@@ -195,11 +202,15 @@
   @Override
   public void close(UnbindRequest request, String reason)
   {
-    try {
-      this.connection.close();
-    }
-    catch (SQLException e){
-      e.printStackTrace();
+    if(connection != null){
+      try
+      {
+        connection.close();
+      }
+      catch (SQLException e)
+      {
+        e.printStackTrace();
+      }
     }
   }
 
@@ -276,7 +287,7 @@
   {
     try
     {
-      return this.connection.isClosed();
+      return connection.isClosed();
     }
     catch (SQLException e)
     {
@@ -290,7 +301,7 @@
   {
     try
     {
-      return this.connection.isValid(0);
+      return connection.isValid(0);
     }
     catch (SQLException e)
     {
@@ -325,11 +336,26 @@
         final String modificationColumnName = jdbcm.getColumnNameFromMapping(tableName, baseDN, OUName, modificationAttributeName);
         String modificationAttributeValue = "";
 
-        if(modificationType == ModificationType.ADD || modificationType == ModificationType.REPLACE){
+        if(modificationType == ModificationType.ADD){
+          final Iterator<ByteString> iter = modificationAttribute.iterator();
+
+          int counter = 0;
+          while (iter.hasNext()){
+            if(counter > 0) modificationAttributeValue = modificationAttributeValue.concat(", ");
+            modificationAttributeValue = modificationAttributeValue.concat(iter.next().toString());
+            counter++;
+          }
+          final Object classType = jdbcm.getTableColumnDataType(tableName, modificationColumnName);
+          if(classType == Integer.class) modificationAttributeValue = "(case when (" + modificationAttributeName + " = 0) THEN ' "
+              + modificationAttributeValue + "' ELSE concat(" + modificationAttributeName + ", ', " + modificationAttributeValue + "') END)";
+          else modificationAttributeValue = "(case when (" + modificationAttributeName + " = 'Default Value') THEN ' "
+              + modificationAttributeValue + "' ELSE concat(" + modificationAttributeName + ", ', " + modificationAttributeValue + "') END)";
+        }        
+        else if(modificationType == ModificationType.REPLACE){
           final Iterator<ByteString> iter = modificationAttribute.iterator();
 
           while (iter.hasNext()){
-            modificationAttributeValue = iter.next().toString();
+            modificationAttributeValue = "'" + iter.next().toString() + "'";
           }
         }
         else{
@@ -338,13 +364,14 @@
           if(nullable == false) throw new SQLException("Cannot delete data from not-nullable column.");
           final Object classType = jdbcm.getTableColumnDataType(tableName, modificationColumnName);
 
-          if(classType == Integer.class) modificationAttributeValue = Integer.toString(0);
-          else modificationAttributeValue = "Default Value";
+          if(classType == Integer.class) modificationAttributeValue = "'" + Integer.toString(0) + "'";
+          else modificationAttributeValue = "'Default Value'";
         }
-        modificationString = modificationString.concat(modificationColumnName + "='" + modificationAttributeValue + "', ");
+        modificationString = modificationString.concat(modificationColumnName + "=" + modificationAttributeValue + ", ");
       }
       modificationString = modificationString.substring(0, modificationString.length() - 2);
       final String sql = "UPDATE " + tableName + " SET " + modificationString + " WHERE " + columnName + "='" + filterAttributeValue + "'";
+
       final Statement st = connection.createStatement();
       st.executeUpdate(sql);
       r = Responses.newResult(ResultCode.SUCCESS);
@@ -368,7 +395,8 @@
     // TODO Auto-generated method stub
   }
 
-  private String convertSearchFilter(final Filter filter, final String baseDN){
+  private String convertSearchFilter(final Filter filter, final String baseDN, String OUName)
+  {
     String filterString = filter.toString();
     int stringIndex = 0;
     int subStringCount = 0;
@@ -402,8 +430,10 @@
 
     for(int i = 0; i < subStringCount; i++){
       final char operationChar = operationChars[i];
+
       if(operationChar == '!'){
         String subString = subStrings[i];
+
         if(subString.isEmpty()){
           subString = subStrings[i-1];
           subString = subString.replace(">=", ">");
@@ -424,6 +454,7 @@
       }
     }
     boolean multipleSubStrings = false;
+
     if(subStringCount > 1) multipleSubStrings = true;
 
     for(int i = 0; i < subStringCount; i++){
@@ -459,16 +490,24 @@
         final String filterAttributeName = subStringFilterSplitter[0];
         String filterColumnName = null;;
         Object columnDataType = null;
-        final List<String> OUList = jdbcm.getOrganizationalUnits(baseDN);
 
-        for(Iterator<String> iter = OUList.iterator(); iter.hasNext();){
-          final String OUName = iter.next();
+        if(OUName == null){
+          final List<String> OUList = jdbcm.getOrganizationalUnits(baseDN);
+
+          for(Iterator<String> iter = OUList.iterator(); iter.hasNext();){
+            OUName = iter.next();
+            final String tableName = jdbcm.getTableNameFromMapping(baseDN, OUName);
+            filterColumnName = jdbcm.getColumnNameFromMapping(tableName, baseDN, OUName, filterAttributeName);
+
+            if(filterColumnName == null) continue;
+            else columnDataType = jdbcm.getTableColumnDataType(tableName, filterColumnName);
+            break;
+          }
+        }
+        else{
           final String tableName = jdbcm.getTableNameFromMapping(baseDN, OUName);
-          filterColumnName = jdbcm.getColumnNameFromMapping(tableName, baseDN, OUName, filterAttributeName);
-
-          if(filterColumnName == null) continue;
-          else columnDataType = jdbcm.getTableColumnDataType(tableName, filterColumnName);
-          break;
+          filterColumnName = jdbcm.getColumnNameFromMapping(tableName, baseDN, OUName, filterAttributeName);     
+          columnDataType = jdbcm.getTableColumnDataType(tableName, filterColumnName);
         }
 
         if(columnDataType != Integer.class){
@@ -493,11 +532,17 @@
         if(j != 0 || i != 0) convertedFilterString = convertedFilterString.concat(operationString);
         convertedFilterString = convertedFilterString.concat(subStringFilter);
       }
+
       if(multipleSubStrings && i < subStringCount -1) convertedFilterString = "(" + convertedFilterString + ")";
     }
     return convertedFilterString;
   }
 
+  public List<Entry> getSearchEntries()
+  {
+    return searchEntries;
+  }
+
   @Override
   public Result search(SearchRequest request, SearchResultHandler handler) throws ErrorResultException
   {
@@ -529,7 +574,7 @@
       final List<String> returnColumnNames = new ArrayList<String>();
 
       final Filter searchFilter = request.getFilter();
-      final String convertedFilterString = convertSearchFilter(searchFilter, baseDN);
+      final String convertedFilterString = convertSearchFilter(searchFilter, baseDN, OUName);
 
       if(returnAttributeNames != null){
 
@@ -573,14 +618,15 @@
           if(currentTable == null) continue;
           final List<String> currentTableColumnNames = jdbcm.getTableColumns(currentTable);
 
-          if(i > 0) fromString = fromString.concat(",");
+          if(!fromString.isEmpty()) fromString = fromString.concat(",");
           fromString = fromString.concat(currentTable);
 
           for(int j = 0; j < returnColumnNames.size(); j++){
             final String returnColumnName = returnColumnNames.get(j);
 
             if(currentTableColumnNames.contains(returnColumnName)){
-              if(j > 0) selectString = selectString.concat(",");
+
+              if(!selectString.isEmpty()) selectString = selectString.concat(",");
               selectString = selectString.concat(currentTable + "." + returnColumnName);
             }
           }
@@ -593,7 +639,9 @@
         for(int j = 0; j < returnColumnNames.size(); j++){
           final String returnColumnName = returnColumnNames.get(j);
 
-          if(j > 0) selectString = selectString.concat(",");
+          if(returnColumnName == null) continue;
+
+          if(!selectString.isEmpty()) selectString = selectString.concat(",");
           selectString = selectString.concat(returnColumnName);
         }
 
@@ -605,21 +653,22 @@
       }
 
       String sql = "SELECT " + selectString + " FROM " + fromString;
+
       if(!whereString.isEmpty()) sql = sql.concat(" WHERE " + whereString);
-            
+
       final Statement st = connection.createStatement();
       ResultSet rs = st.executeQuery(sql);
       ResultSetMetaData rsmd = rs.getMetaData();
 
+      searchEntries.clear();
       while (rs.next()) {
-        System.out.println("# Row: " +rs.getRow()); 
-                
+        Entry e = new LinkedHashMapEntry();
+
         for(int i = 1; i <= rsmd.getColumnCount(); i++){
-          System.out.println(rsmd.getTableName(i) + ":" + rsmd.getColumnName(i) + " = " + rs.getObject(i));
+          e.addAttribute(rsmd.getTableName(i) + "_" + rsmd.getColumnName(i), rs.getObject(i));
         }
-        System.out.println();
+        searchEntries.add(e);
       }
-      
       r = Responses.newResult(ResultCode.SUCCESS);
     }catch (SQLException e){
       System.out.println(e.toString());
@@ -631,6 +680,6 @@
   @Override
   public String toString()
   {
-    return this.connection.toString();
+    return connection.toString();
   }
 }

--
Gitblit v1.10.0