From 728e166fbe118639b7d0c52c805bf9ea8bf458b7 Mon Sep 17 00:00:00 2001
From: Glenn Van Lint <glenn.vanlint@is4u.be>
Date: Thu, 25 Apr 2013 08:53:22 +0000
Subject: [PATCH] Added modify functionality.
---
opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCConnection.java | 226 ++++++++++++++++++++++++++++++++-----------------------
1 files changed, 131 insertions(+), 95 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 22473ff..9cd26a9 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
@@ -28,14 +28,20 @@
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
import java.util.Map;
import org.forgerock.opendj.ldap.AbstractSynchronousConnection;
import org.forgerock.opendj.ldap.Attribute;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ConnectionEventListener;
+import org.forgerock.opendj.ldap.DN;
import org.forgerock.opendj.ldap.ErrorResultException;
import org.forgerock.opendj.ldap.IntermediateResponseHandler;
+import org.forgerock.opendj.ldap.Modification;
+import org.forgerock.opendj.ldap.ModificationType;
+import org.forgerock.opendj.ldap.RDN;
import org.forgerock.opendj.ldap.ResultCode;
import org.forgerock.opendj.ldap.SearchResultHandler;
import org.forgerock.opendj.ldap.requests.AddRequest;
@@ -58,8 +64,6 @@
private final String driverName = "com.mysql.jdbc.Driver";
private java.sql.Connection connection;
private String connectionUrl;
- private String userName;
- private String userPass;
private JDBCMapper jdbcm;
private MappingConfigurationManager mcm;
@@ -74,66 +78,6 @@
jdbcm.loadMappingConfig(mcm.loadMapping());
}
- private Map<String, Object> getValuesMap(AddRequest request, String tableName, String OUName){
- final String baseDN = request.getName().toString();
- Iterable<Attribute> attributesCollection = request.getAllAttributes();
- Iterator<Attribute> attributeIter = attributesCollection.iterator();
- Map<String, Object> map = new HashMap<String, Object>();
-
- while(attributeIter.hasNext()){
- Attribute att = attributeIter.next();
- Iterator<ByteString> valueIter = att.iterator();
- String attributeName = att.getAttributeDescriptionAsString();
- String columnName = jdbcm.getColumnNameFromMapping(tableName, baseDN, OUName, attributeName);
- String columnValue = "";
-
- if (columnName == null) continue;
-
- while(valueIter.hasNext()){
- columnValue = columnValue.concat(valueIter.next().toString());
- }
- map.put(columnName, columnValue);
- }
- return map;
- }
-
- private ArrayList<String> getSQLVariablesStrings(String tableName, Map<String, Object> columnValuesMap){
- ArrayList<String>columnList = null;
- try {
- columnList = jdbcm.getTableColumns(tableName);
- } catch (SQLException e1) {
- e1.printStackTrace();
- }
- String columnNamesString = " (";
- String columnValuesString = " (";
-
- for(int i = 0; i < columnList.size(); i++){
- if (i > 0){
- columnNamesString = columnNamesString.concat(", ");
- columnValuesString = columnValuesString.concat(", ");
- }
- String columnName = columnList.get(i);
- Object columnValue = columnValuesMap.get(columnName);
- Object dataType = jdbcm.getTableColumnDataType(tableName, columnName);
- if(columnValue == null){
- if(dataType.equals(Integer.class)) columnValue = "0";
- else columnValue = "Default Value";
- }
- if(dataType.equals(Integer.class)) columnValue = Integer.parseInt(columnValue.toString());
-
- columnNamesString = columnNamesString.concat(columnName);
- columnValuesString = columnValuesString.concat("'" + columnValue + "'");
- }
- columnNamesString = columnNamesString.concat(")");
- columnValuesString = columnValuesString.concat(")");
-
- ArrayList<String> newlist = new ArrayList<String>();
- newlist.add(columnNamesString);
- newlist.add(columnValuesString);
-
- return newlist;
- }
-
public java.sql.Connection getSqlConnection(){
return connection;
}
@@ -143,19 +87,62 @@
{
Result r;
try {
- final String baseDN = request.getName().toString();
- String[] stringSplitter = baseDN.split("ou=");
- stringSplitter = stringSplitter[1].split(",");
- final String organizationalUnitName = stringSplitter[0];
+ final DN DN = request.getName();
+ final RDN OU = DN.rdn();
+ final String organizationalUnitName = OU.getFirstAVA().getAttributeValue().toString();
+ final String baseDN = DN.parent(1).toString();
final String tableName = jdbcm.getTableNameFromMapping(baseDN, organizationalUnitName);
- final Map<String, Object> columnValuesMap = getValuesMap(request, tableName, organizationalUnitName);
- final ArrayList<String> SQLStringList = getSQLVariablesStrings(tableName, columnValuesMap);
- String columnNamesString = SQLStringList.get(0), columnValuesString = SQLStringList.get(1);
+ final Map<String, Object> columnValuesMap = new HashMap<String, Object>();
+ final Iterable<Attribute> attributesCollection = request.getAllAttributes();
+ final Iterator<Attribute> attributeIter = attributesCollection.iterator();
- Statement st = connection.createStatement();
- String sql = "INSERT INTO " + tableName + columnNamesString + " VALUES" + columnValuesString;
+ while(attributeIter.hasNext()){
+ final Attribute att = attributeIter.next();
+ final Iterator<ByteString> valueIter = att.iterator();
+ final String attributeName = att.getAttributeDescriptionAsString();
+ final String columnName = jdbcm.getColumnNameFromMapping(tableName, baseDN, organizationalUnitName, attributeName);
+ String columnValue = "";
+
+ if (columnName == null) continue;
+
+ while(valueIter.hasNext()){
+ columnValue = columnValue.concat(valueIter.next().toString());
+ }
+ columnValuesMap.put(columnName, columnValue);
+ }
+ final ArrayList<String>columnList = jdbcm.getTableColumns(tableName);
+ String columnNamesString = " (";
+ String columnValuesString = " (";
+
+ for(int i = 0; i < columnList.size(); i++){
+
+ if (i > 0){
+ columnNamesString = columnNamesString.concat(", ");
+ columnValuesString = columnValuesString.concat(", ");
+ }
+ final String columnName = columnList.get(i);
+ final Object columnDataType = jdbcm.getTableColumnDataType(tableName, columnName);
+ Object columnValue = columnValuesMap.get(columnName);
+
+ if(columnValue == null){
+
+ if(columnDataType.equals(Integer.class)) columnValue = "0";
+ else columnValue = "Default Value";
+ }
+
+ if(columnDataType.equals(Integer.class)) columnValue = Integer.parseInt(columnValue.toString());
+
+ columnNamesString = columnNamesString.concat(columnName);
+ columnValuesString = columnValuesString.concat("'" + columnValue + "'");
+ }
+ columnNamesString = columnNamesString.concat(")");
+ columnValuesString = columnValuesString.concat(")");
+
+ final Statement st = connection.createStatement();
+ final String sql = "INSERT INTO " + tableName + columnNamesString + " VALUES" + columnValuesString;
st.executeUpdate(sql);
r = Responses.newResult(ResultCode.SUCCESS);
+
} catch (SQLException e) {
System.out.println(e.toString());
r = Responses.newResult(ResultCode.OPERATIONS_ERROR);
@@ -173,20 +160,22 @@
public BindResult bind(BindRequest request) throws ErrorResultException
{
BindResult r;
- this.userName = request.getName();
+ final String userName = request.getName();
+ final String userPass;
byte[] password = null;
+
if (request instanceof SimpleBindRequest) {
password = ((SimpleBindRequest) request).getPassword();
} else {
r = Responses.newBindResult(ResultCode.PROTOCOL_ERROR);
return r;
}
- this.userPass = new String(password);
+ userPass = new String(password);
try {
Class.forName(driverName);
this.connection = DriverManager
- .getConnection(this.connectionUrl,this.userName,this.userPass);
+ .getConnection(this.connectionUrl,userName , userPass);
} catch (ClassNotFoundException e) {
System.out.println(e.toString());
r = Responses.newBindResult(ResultCode.OTHER);
@@ -203,12 +192,10 @@
@Override
public void close(UnbindRequest request, String reason)
{
- try
- {
+ try {
this.connection.close();
}
- catch (SQLException e)
- {
+ catch (SQLException e){
e.printStackTrace();
}
}
@@ -224,20 +211,20 @@
@Override
public Result delete(DeleteRequest request) throws ErrorResultException
{
- Result r = null;
+ Result r;
try{
- final String baseDN = request.getName().toString();
- String[] stringSplitter = baseDN.split("ou=");
- stringSplitter = stringSplitter[1].split(",");
- final String organizationalUnitName = stringSplitter[0];
- stringSplitter = baseDN.split("cn=");
- stringSplitter = stringSplitter[1].split(",");
- final String commonName = stringSplitter[0];
- final String tableName = jdbcm.getTableNameFromMapping(baseDN, organizationalUnitName);
- String columnName = jdbcm.getColumnNameFromMapping(tableName, baseDN, organizationalUnitName, "cn");
+ final DN DN = request.getName();
+ final RDN rDN = DN.rdn();
+ final String filterAttributeName = rDN.getFirstAVA().getAttributeType().getNameOrOID();
+ final String filterAttributeValue = rDN.getFirstAVA().getAttributeValue().toString();
+ final RDN OU = DN.parent(1).rdn();
+ final String OUName = OU.getFirstAVA().getAttributeValue().toString();
+ final String baseDN = DN.parent(2).toString();
+ final String tableName = jdbcm.getTableNameFromMapping(baseDN, OUName);
+ final String columnName = jdbcm.getColumnNameFromMapping(tableName, baseDN, OUName, filterAttributeName);
- Statement st = connection.createStatement();
- String sql = "DELETE FROM " + tableName + " WHERE " + columnName + "='" + commonName + "'";
+ final Statement st = connection.createStatement();
+ final String sql = "DELETE FROM " + tableName + " WHERE " + columnName + "='" + filterAttributeValue + "'";
st.executeUpdate(sql);
r = Responses.newResult(ResultCode.SUCCESS);
} catch (SQLException e) {
@@ -271,10 +258,60 @@
}
@Override
- public Result modify(ModifyRequest request) throws ErrorResultException
- {
- // TODO Auto-generated method stub
- return null;
+ public Result modify(ModifyRequest request)
+ {
+ final DN DN = request.getName();
+ final RDN rDN = DN.rdn();
+ final String filterAttributeName = rDN.getFirstAVA().getAttributeType().getNameOrOID();
+ final String filterAttributeValue = rDN.getFirstAVA().getAttributeValue().toString();
+ final RDN OU = DN.parent(1).rdn();
+ final String OUName = OU.getFirstAVA().getAttributeValue().toString();
+ final String baseDN = DN.parent(2).toString();
+ final String tableName = jdbcm.getTableNameFromMapping(baseDN, OUName);
+ final String columnName = jdbcm.getColumnNameFromMapping(tableName, baseDN, OUName, filterAttributeName);
+ Result r;
+
+ try{
+ final List<Modification> modificationList = request.getModifications();
+ final ListIterator<Modification> listIter = modificationList.listIterator();
+ String modificationString = "";
+
+ while(listIter.hasNext()){
+ final Modification modification = listIter.next();
+ final ModificationType modificationType = modification.getModificationType();
+ final Attribute modificationAttribute = modification.getAttribute();
+ final String modificationAttributeName = modificationAttribute.getAttributeDescription().toString();
+ final String modificationColumnName = jdbcm.getColumnNameFromMapping(tableName, baseDN, OUName, modificationAttributeName);
+ String modificationAttributeValue = "";
+
+ if(modificationType == ModificationType.ADD || modificationType == ModificationType.REPLACE){
+ final Iterator<ByteString> iter = modificationAttribute.iterator();
+
+ while (iter.hasNext()){
+ modificationAttributeValue = iter.next().toString();
+ }
+ }
+ else{
+ final boolean nullable = jdbcm.getTableColumnNullable(tableName, modificationColumnName);
+
+ 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";
+ }
+ 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);
+ }catch (SQLException e){
+ System.out.println(e.toString());
+ r = Responses.newResult(ResultCode.OPERATIONS_ERROR);
+ }
+ return r;
}
@Override
@@ -288,7 +325,6 @@
public void removeConnectionEventListener(ConnectionEventListener listener)
{
// TODO Auto-generated method stub
-
}
@Override
--
Gitblit v1.10.0