From a031489dbe4d200f674bc8980db9b0975071b5ff Mon Sep 17 00:00:00 2001
From: Glenn Van Lint <glenn.vanlint@is4u.be>
Date: Mon, 15 Apr 2013 08:13:56 +0000
Subject: [PATCH]
---
opendj-sdk/opendj3/opendj-virtual/MappingConfig.properties | 20
opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/GUI.java | 306 +++++++++
opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/TestUpdate.class | 0
opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/MappingConfigurationManager.java | 92 ++
opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCConnectionFactory.java | 99 +-
opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/JDBCMapperTestCase.java | 81 ++
/dev/null | 30
opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCConnection.java | 478 ++++++++++++++
opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/AddRequestTestCase.java | 71 ++
opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/JDBCConnectionTestCase.java | 17
opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCMapper.java | 231 +++++++
opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/GUIMap.java | 330 ++++++++++
opendj-sdk/opendj3/opendj-virtual/hs_err_pid7620.log | 221 ++++++
13 files changed, 1,895 insertions(+), 81 deletions(-)
diff --git a/opendj-sdk/opendj3/opendj-virtual/MappingConfig.properties b/opendj-sdk/opendj3/opendj-virtual/MappingConfig.properties
new file mode 100644
index 0000000..ade9764
--- /dev/null
+++ b/opendj-sdk/opendj3/opendj-virtual/MappingConfig.properties
@@ -0,0 +1,20 @@
+#Mon Mar 25 13:43:32 CET 2013
+employees\:postalCode=People\:postalCode
+customers\:customerName=People\:sn
+employees\:employeeName=People\:cn
+employees\:addressLine=People\:street
+employees\:city=People\:l
+customers\:country=People\:description
+employees\:contactPhone=People\:homePhone
+customers\:city=People\:l
+customers\:contactPhone=People\:telephoneNumber
+customers\:customerId=People\:uid
+employees\:jobTitle=People\:initials
+employees\:country=People\:description
+customers\:postalCode=People\:postalCode
+employees\:employeeFirstName=People\:givenName
+customers\:customerFirstName=People\:givenName
+customers\:addressLine=People\:street
+employees\:employeeId=People\:employeeNumber
+employees\:contactEmail=People\:mail
+employees\:officeId=People\:employeeNumber
diff --git a/opendj-sdk/opendj3/opendj-virtual/hs_err_pid7620.log b/opendj-sdk/opendj3/opendj-virtual/hs_err_pid7620.log
new file mode 100644
index 0000000..1b6a257
--- /dev/null
+++ b/opendj-sdk/opendj3/opendj-virtual/hs_err_pid7620.log
@@ -0,0 +1,221 @@
+#
+# A fatal error has been detected by the Java Runtime Environment:
+#
+# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006b698f09, pid=7620, tid=3708
+#
+# JRE version: 7.0_13-b20
+# Java VM: Java HotSpot(TM) 64-Bit Server VM (23.7-b01 mixed mode windows-amd64 compressed oops)
+# Problematic frame:
+# V [jvm.dll+0x38f09]
+#
+# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
+#
+# If you would like to submit a bug report, please visit:
+# http://bugreport.sun.com/bugreport/crash.jsp
+#
+
+--------------- T H R E A D ---------------
+
+Current thread (0x000000000ad18800): JavaThread "JDWP Transport Listener: dt_socket" daemon [_thread_in_vm, id=3708, stack(0x000000000c6d0000,0x000000000c7d0000)]
+
+siginfo: ExceptionCode=0xc0000005, reading address 0x000000000000000c
+
+Registers:
+RAX=0x000000000000000c, RBX=0x000000000ad18800, RCX=0x0000000000000000, RDX=0x0000000000000000
+RSP=0x000000000c7cf700, RBP=0x000000000000000c, RSI=0x0000000000000000, RDI=0x0000000000000010
+R8 =0x00000000d713c0a0, R9 =0x0000000000000000, R10=0x0000000000000000, R11=0x0000000000000001
+R12=0x0000000000000000, R13=0x0000000000000000, R14=0x0000000000000000, R15=0x0000000000000000
+RIP=0x000000006b698f09, EFLAGS=0x0000000000010246
+
+Top of Stack: (sp=0x000000000c7cf700)
+0x000000000c7cf700: 000000000ad18800 0000000000000000
+0x000000000c7cf710: 0000000000000000 000000000ad18800
+0x000000000c7cf720: 0000000000000000 000000006b7575d4
+0x000000000c7cf730: 00000000d713c0a0 000000000c7cf850
+0x000000000c7cf740: 000000000ad1a110 000000000c7cf820
+0x000000000c7cf750: 000000000ad18800 0000000000000000
+0x000000000c7cf760: 000000000ad1a110 000000000c7cf850
+0x000000000c7cf770: 0000000000000000 0000000000000000
+0x000000000c7cf780: 000000000ad189d8 000000006b2e7d15
+0x000000000c7cf790: 000000000c7cf820 000000000c7cf850
+0x000000000c7cf7a0: 000000000ad1a110 000000000ad189d8
+0x000000000c7cf7b0: 000000000adb0f0a 000000006b2ef09c
+0x000000000c7cf7c0: 000000006b010a01 000000000c7cf8c0
+0x000000000c7cf7d0: 000000000ad11001 000000000adc8f30
+0x000000000c7cf7e0: 000009be00000013 000000006b010a00
+0x000000000c7cf7f0: 000000000ad34090 000000000ad1f1e0
+
+Instructions: (pc=0x000000006b698f09)
+0x000000006b698ee9: d2 48 8b c5 eb 18 48 8b d0 48 8b c5 48 d3 e2 48
+0x000000006b698ef9: 03 15 11 16 62 00 eb 06 48 8b 12 48 8b c7 48 98
+0x000000006b698f09: 8b 14 10 85 d2 74 2a 45 84 db 4c 63 c6 48 0f 45
+0x000000006b698f19: fd 8d 47 0b 48 63 c8 48 83 e1 f8 48 c1 e9 03 8d
+
+
+Register to memory mapping:
+
+RAX=0x000000000000000c is an unknown value
+RBX=0x000000000ad18800 is a thread
+RCX=0x0000000000000000 is an unknown value
+RDX=0x0000000000000000 is an unknown value
+RSP=0x000000000c7cf700 is pointing into the stack for thread: 0x000000000ad18800
+RBP=0x000000000000000c is an unknown value
+RSI=0x0000000000000000 is an unknown value
+RDI=0x0000000000000010 is an unknown value
+R8 =0x00000000d713c0a0 is an oop
+java.lang.String
+ - klass: 'java/lang/String'
+R9 =0x0000000000000000 is an unknown value
+R10=0x0000000000000000 is an unknown value
+R11=0x0000000000000001 is an unknown value
+R12=0x0000000000000000 is an unknown value
+R13=0x0000000000000000 is an unknown value
+R14=0x0000000000000000 is an unknown value
+R15=0x0000000000000000 is an unknown value
+
+
+Stack: [0x000000000c6d0000,0x000000000c7d0000], sp=0x000000000c7cf700, free space=1021k
+Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
+V [jvm.dll+0x38f09]
+
+
+--------------- P R O C E S S ---------------
+
+Java Threads: ( => current thread )
+ 0x000000000ad40800 JavaThread "Service Thread" daemon [_thread_blocked, id=9440, stack(0x000000000cbd0000,0x000000000ccd0000)]
+ 0x000000000ad3a000 JavaThread "C2 CompilerThread1" daemon [_thread_blocked, id=1088, stack(0x000000000cad0000,0x000000000cbd0000)]
+ 0x000000000ad34800 JavaThread "C2 CompilerThread0" daemon [_thread_blocked, id=6732, stack(0x000000000c9d0000,0x000000000cad0000)]
+ 0x000000000ad25800 JavaThread "JDWP Command Reader" daemon [_thread_in_native, id=8884, stack(0x000000000c8d0000,0x000000000c9d0000)]
+ 0x000000000ad24000 JavaThread "JDWP Event Helper Thread" daemon [_thread_blocked, id=3736, stack(0x000000000c7d0000,0x000000000c8d0000)]
+=>0x000000000ad18800 JavaThread "JDWP Transport Listener: dt_socket" daemon [_thread_in_vm, id=3708, stack(0x000000000c6d0000,0x000000000c7d0000)]
+ 0x000000000ad12000 JavaThread "Attach Listener" daemon [_thread_blocked, id=6104, stack(0x000000000c1f0000,0x000000000c2f0000)]
+ 0x000000000ad0e800 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=7288, stack(0x000000000c0f0000,0x000000000c1f0000)]
+ 0x000000000aca9800 JavaThread "Finalizer" daemon [_thread_blocked, id=7420, stack(0x000000000bff0000,0x000000000c0f0000)]
+ 0x000000000aca2800 JavaThread "Reference Handler" daemon [_thread_blocked, id=12004, stack(0x000000000bef0000,0x000000000bff0000)]
+ 0x0000000002032800 JavaThread "main" [_thread_blocked, id=6728, stack(0x0000000001f30000,0x0000000002030000)]
+
+Other Threads:
+ 0x000000000abf4000 VMThread [stack: 0x000000000bdf0000,0x000000000bef0000] [id=10404]
+ 0x000000000ad35000 WatcherThread [stack: 0x000000000ccd0000,0x000000000cdd0000] [id=9800]
+
+VM state:not at safepoint (normal execution)
+
+VM Mutex/Monitor currently owned by a thread: None
+
+Heap
+ PSYoungGen total 36736K, used 1262K [0x00000000d70b0000, 0x00000000d99a0000, 0x0000000100000000)
+ eden space 31552K, 4% used [0x00000000d70b0000,0x00000000d71eb8d8,0x00000000d8f80000)
+ from space 5184K, 0% used [0x00000000d9490000,0x00000000d9490000,0x00000000d99a0000)
+ to space 5184K, 0% used [0x00000000d8f80000,0x00000000d8f80000,0x00000000d9490000)
+ ParOldGen total 83904K, used 0K [0x0000000085200000, 0x000000008a3f0000, 0x00000000d70b0000)
+ object space 83904K, 0% used [0x0000000085200000,0x0000000085200000,0x000000008a3f0000)
+ PSPermGen total 21248K, used 2521K [0x0000000080000000, 0x00000000814c0000, 0x0000000085200000)
+ object space 21248K, 11% used [0x0000000080000000,0x00000000802765a8,0x00000000814c0000)
+
+Card table byte_map: [0x0000000005130000,0x0000000005540000] byte_map_base: 0x0000000004d30000
+
+Polling page: 0x00000000005e0000
+
+Code Cache [0x0000000002130000, 0x00000000023a0000, 0x0000000005130000)
+ total_blobs=172 nmethods=2 adapters=130 free_code_cache=48772Kb largest_free_block=49924352
+
+Compilation events (4 events):
+Event: 0.231 Thread 0x000000000ad34800 1 java.lang.String::charAt (29 bytes)
+Event: 0.236 Thread 0x000000000ad34800 nmethod 1 0x000000000218e110 code [0x000000000218e260, 0x000000000218e338]
+Event: 0.249 Thread 0x000000000ad3a000 2 java.lang.String::indexOf (166 bytes)
+Event: 0.256 Thread 0x000000000ad3a000 nmethod 2 0x000000000218d850 code [0x000000000218d9a0, 0x000000000218de58]
+
+GC Heap History (0 events):
+No events
+
+Deoptimization events (0 events):
+No events
+
+Internal exceptions (6 events):
+Event: 0.034 Thread 0x0000000002032800 Threw 0x00000000d70b61a8 at C:\jdk7u2_64p\jdk7u13\hotspot\src\share\vm\prims\jni.cpp:3994
+Event: 0.232 Thread 0x0000000002032800 Threw 0x00000000d7114a50 at C:\jdk7u2_64p\jdk7u13\hotspot\src\share\vm\prims\jvm.cpp:1166
+Event: 0.245 Thread 0x0000000002032800 Threw 0x00000000d711b8e8 at C:\jdk7u2_64p\jdk7u13\hotspot\src\share\vm\prims\jvm.cpp:1166
+Event: 0.247 Thread 0x0000000002032800 Threw 0x00000000d71202c0 at C:\jdk7u2_64p\jdk7u13\hotspot\src\share\vm\prims\jvm.cpp:1166
+Event: 0.249 Thread 0x0000000002032800 Threw 0x00000000d71253f0 at C:\jdk7u2_64p\jdk7u13\hotspot\src\share\vm\prims\jvm.cpp:1166
+Event: 0.250 Thread 0x0000000002032800 Threw 0x00000000d712e3a8 at C:\jdk7u2_64p\jdk7u13\hotspot\src\share\vm\prims\jvm.cpp:1166
+
+Events (10 events):
+Event: 17.404 Executing VM operation: GetCurrentLocation
+Event: 17.404 Executing VM operation: GetCurrentLocation done
+Event: 17.404 Executing VM operation: ChangeSingleStep
+Event: 17.404 Executing VM operation: ChangeSingleStep done
+Event: 17.407 Executing VM operation: ChangeSingleStep
+Event: 17.407 Executing VM operation: ChangeSingleStep done
+Event: 17.424 Executing VM operation: GetOrSetLocal
+Event: 17.424 Executing VM operation: GetOrSetLocal done
+Event: 17.432 Executing VM operation: GetOrSetLocal
+Event: 17.432 Executing VM operation: GetOrSetLocal done
+
+
+Dynamic libraries:
+0x000007f635990000 - 0x000007f6359c3000 C:\Program Files\Java\jdk1.7.0_13\bin\javaw.exe
+0x000007f8dc270000 - 0x000007f8dc42e000 C:\WINDOWS\SYSTEM32\ntdll.dll
+0x000007f8da1d0000 - 0x000007f8da306000 C:\WINDOWS\system32\KERNEL32.DLL
+0x000007f8d88c0000 - 0x000007f8d89b3000 C:\WINDOWS\system32\KERNELBASE.dll
+0x000007f8daa00000 - 0x000007f8daade000 C:\WINDOWS\system32\ADVAPI32.dll
+0x000007f8da650000 - 0x000007f8da79c000 C:\WINDOWS\system32\USER32.dll
+0x000007f8d5bb0000 - 0x000007f8d5e19000 C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.9200.16384_none_418c2a697189c07f\COMCTL32.dll
+0x000007f8da5a0000 - 0x000007f8da645000 C:\WINDOWS\system32\msvcrt.dll
+0x000007f8d9de0000 - 0x000007f8d9e28000 C:\WINDOWS\SYSTEM32\sechost.dll
+0x000007f8da8c0000 - 0x000007f8daa00000 C:\WINDOWS\system32\RPCRT4.dll
+0x000007f8db450000 - 0x000007f8db590000 C:\WINDOWS\system32\GDI32.dll
+0x000007f8dad10000 - 0x000007f8dad49000 C:\WINDOWS\system32\IMM32.DLL
+0x000007f8da7a0000 - 0x000007f8da8b5000 C:\WINDOWS\system32\MSCTF.dll
+0x000007f8d84e0000 - 0x000007f8d8520000 C:\WINDOWS\system32\nvinitx.dll
+0x000000006b320000 - 0x000000006b3f1000 C:\Program Files\Java\jdk1.7.0_13\jre\bin\msvcr100.dll
+0x000000006b660000 - 0x000000006bd7f000 C:\Program Files\Java\jdk1.7.0_13\jre\bin\server\jvm.dll
+0x000007f8cc650000 - 0x000007f8cc659000 C:\WINDOWS\SYSTEM32\WSOCK32.dll
+0x000007f8d4b40000 - 0x000007f8d4b60000 C:\WINDOWS\SYSTEM32\WINMM.dll
+0x000007f8db120000 - 0x000007f8db127000 C:\WINDOWS\system32\PSAPI.DLL
+0x000007f8da530000 - 0x000007f8da588000 C:\WINDOWS\system32\WS2_32.dll
+0x000007f8d4af0000 - 0x000007f8d4b22000 C:\WINDOWS\SYSTEM32\WINMMBASE.dll
+0x000007f8da590000 - 0x000007f8da599000 C:\WINDOWS\system32\NSI.dll
+0x000000006cdc0000 - 0x000000006cdcf000 C:\Program Files\Java\jdk1.7.0_13\jre\bin\verify.dll
+0x000000006cd90000 - 0x000000006cdb8000 C:\Program Files\Java\jdk1.7.0_13\jre\bin\java.dll
+0x000000006b2e0000 - 0x000000006b315000 C:\Program Files\Java\jdk1.7.0_13\jre\bin\jdwp.dll
+0x000000006b2d0000 - 0x000000006b2d8000 C:\Program Files\Java\jdk1.7.0_13\jre\bin\npt.dll
+0x000000006cd70000 - 0x000000006cd85000 C:\Program Files\Java\jdk1.7.0_13\jre\bin\zip.dll
+0x000000006b2c0000 - 0x000000006b2c9000 C:\Program Files\Java\jdk1.7.0_13\jre\bin\dt_socket.dll
+0x000007f8d0fb0000 - 0x000007f8d0fc4000 C:\WINDOWS\system32\napinsp.dll
+0x000007f8d0fd0000 - 0x000007f8d0fe8000 C:\WINDOWS\system32\pnrpnsp.dll
+0x000007f8d6ec0000 - 0x000007f8d6ed6000 C:\WINDOWS\system32\NLAapi.dll
+0x000007f8d7d40000 - 0x000007f8d7d9c000 C:\WINDOWS\System32\mswsock.dll
+0x000007f8d7b80000 - 0x000007f8d7c18000 C:\WINDOWS\SYSTEM32\DNSAPI.dll
+0x000007f8d0ff0000 - 0x000007f8d1002000 C:\WINDOWS\System32\winrnr.dll
+0x000007f8d1010000 - 0x000007f8d1024000 C:\WINDOWS\system32\wshbth.dll
+0x000007f8d3400000 - 0x000007f8d345f000 C:\WINDOWS\System32\fwpuclnt.dll
+0x000007f8d1400000 - 0x000007f8d1408000 C:\Windows\System32\rasadhlp.dll
+0x000007f8d66b0000 - 0x000007f8d6813000 C:\WINDOWS\SYSTEM32\dbghelp.dll
+
+VM Arguments:
+jvm_args: -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:10257 -Dfile.encoding=Cp1252 -Xbootclasspath:C:\Program Files\Java\jdk1.7.0_13\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_13\jre\lib\rt.jar;C:\Program Files\Java\jdk1.7.0_13\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_13\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_13\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_13\jre\lib\jfr.jar;C:\Program Files (x86)\Java\jre7\lib\ext\mysql-connector-java-5.1.23-bin.jar
+java_command: org.forgerock.opendj.virtual.JDBCConnectionTestCase
+Launcher Type: SUN_STANDARD
+
+Environment Variables:
+JAVA_HOME=C:\Progra~2\Java\jdk1.7.0
+PATH=C:\Program Files\Java\jdk1.7.0_13\jre\bin;C:/Program Files/Java/jdk1.7.0_13/bin/../jre/bin/server;C:/Program Files/Java/jdk1.7.0_13/bin/../jre/bin;C:/Program Files/Java/jdk1.7.0_13/bin/../jre/lib/amd64;C:\Program Files\Java\jdk1.7.0_13\bin;C:\Program Files\apache-maven-3.0.4\bin;C:\Program Files (x86)\eclipse;
+USERNAME=Glenn
+OS=Windows_NT
+PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 37 Stepping 5, GenuineIntel
+
+
+
+--------------- S Y S T E M ---------------
+
+OS: Windows 8 , 64 bit Build 9200
+
+CPU:total 4 (2 cores per cpu, 2 threads per core) family 6 model 37 stepping 5, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, ht, tsc, tscinvbit
+
+Memory: 4k page, physical 8049516k(3879296k free), swap 10670956k(5031828k free)
+
+vm_info: Java HotSpot(TM) 64-Bit Server VM (23.7-b01) for windows-amd64 JRE (1.7.0_13-b20), built on Jan 30 2013 10:10:00 by "java_re" with unknown MS VC++:1600
+
+time: Mon Mar 18 10:29:34 2013
+elapsed time: 17 seconds
+
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
new file mode 100644
index 0000000..0bea705
--- /dev/null
+++ b/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCConnection.java
@@ -0,0 +1,478 @@
+package org.forgerock.opendj.virtual;
+
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.forgerock.opendj.ldap.Attribute;
+import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.opendj.ldap.Connection;
+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.ErrorResultIOException;
+import org.forgerock.opendj.ldap.FutureResult;
+import org.forgerock.opendj.ldap.IntermediateResponseHandler;
+import org.forgerock.opendj.ldap.ResultCode;
+import org.forgerock.opendj.ldap.ResultHandler;
+import org.forgerock.opendj.ldap.SearchResultHandler;
+import org.forgerock.opendj.ldap.SearchResultReferenceIOException;
+import org.forgerock.opendj.ldap.SearchScope;
+import org.forgerock.opendj.ldap.requests.AbandonRequest;
+import org.forgerock.opendj.ldap.requests.AddRequest;
+import org.forgerock.opendj.ldap.requests.BindRequest;
+import org.forgerock.opendj.ldap.requests.CompareRequest;
+import org.forgerock.opendj.ldap.requests.DeleteRequest;
+import org.forgerock.opendj.ldap.requests.ExtendedRequest;
+import org.forgerock.opendj.ldap.requests.ModifyDNRequest;
+import org.forgerock.opendj.ldap.requests.ModifyRequest;
+import org.forgerock.opendj.ldap.requests.Requests;
+import org.forgerock.opendj.ldap.requests.SearchRequest;
+import org.forgerock.opendj.ldap.requests.UnbindRequest;
+import org.forgerock.opendj.ldap.responses.BindResult;
+import org.forgerock.opendj.ldap.responses.CompareResult;
+import org.forgerock.opendj.ldap.responses.ExtendedResult;
+import org.forgerock.opendj.ldap.responses.GenericExtendedResult;
+import org.forgerock.opendj.ldap.responses.Responses;
+import org.forgerock.opendj.ldap.responses.Result;
+import org.forgerock.opendj.ldap.responses.SearchResultEntry;
+import org.forgerock.opendj.ldap.responses.SearchResultReference;
+import org.forgerock.opendj.ldif.ChangeRecord;
+import org.forgerock.opendj.ldif.ConnectionEntryReader;
+
+public final class JDBCConnection implements Connection {
+ 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;
+ /**
+ * Creates a new JDBC connection.
+ *
+ * @param connection
+ * The SQL Connection using JDBC Driver.
+ */
+ JDBCConnection(final String connectionURL) {
+ this.connectionUrl = connectionURL;
+ }
+
+ public void initializeMapper(JDBCMapper jdbcmapper) throws SQLException, ErrorResultException, ErrorResultIOException, SearchResultReferenceIOException{
+ jdbcm = jdbcmapper;
+ jdbcm.fillMaps();
+ mcm = new MappingConfigurationManager(jdbcm);
+ jdbcm.loadMappingConfig(mcm.loadMapping());
+ }
+
+ public java.sql.Connection getSqlConnection(){
+ return connection;
+ }
+
+ @Override
+ public FutureResult<Void> abandonAsync(AbandonRequest request) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ private Map<String, Object> getValuesMap(AddRequest request, String tableName, String OUName){
+ 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, 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 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;
+ }
+
+ private Result addOperation(AddRequest request){
+ Result r;
+ try {
+ final String DN = request.getName().toString();
+ String[] stringSplitter = DN.split("ou=");
+ stringSplitter = stringSplitter[1].split(",");
+ final String organizationalUnitName = stringSplitter[0];
+ final String tableName = jdbcm.getTableNameFromMapping(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);
+
+ Statement st = connection.createStatement();
+ 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.UNWILLING_TO_PERFORM);
+ }
+ return r;
+ }
+
+ @Override
+ public Result add(AddRequest request) throws ErrorResultException {
+ return addOperation(request);
+ }
+
+ @Override
+ public Result add(Entry entry) throws ErrorResultException {
+ AddRequest addRequest = Requests.newAddRequest(entry);
+ return addOperation(addRequest);
+ }
+
+ @Override
+ public Result add(String... ldifLines) throws ErrorResultException {
+ AddRequest addRequest = Requests.newAddRequest(ldifLines);
+ return addOperation(addRequest);
+ }
+
+ @Override
+ public FutureResult<Result> addAsync(AddRequest request,
+ IntermediateResponseHandler intermediateResponseHandler,
+ ResultHandler<? super Result> resultHandler) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void addConnectionEventListener(ConnectionEventListener listener) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public Result applyChange(ChangeRecord request) throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public FutureResult<Result> applyChangeAsync(ChangeRecord request,
+ IntermediateResponseHandler intermediateResponseHandler,
+ ResultHandler<? super Result> resultHandler) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public BindResult bind(BindRequest request) throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public BindResult bind(String name, char[] password)
+ throws ErrorResultException {
+ BindResult r;
+ this.userName = name;
+ this.userPass = new String(password);
+ try {
+ Class.forName(driverName);
+ this.connection = DriverManager
+ .getConnection(this.connectionUrl,this.userName,this.userPass);
+ } catch (ClassNotFoundException e) {
+ System.out.println(e.toString());
+ r = Responses.newBindResult(ResultCode.OTHER);
+ return r;
+ } catch (SQLException e) {
+ System.out.println(e.toString());
+ r = Responses.newBindResult(ResultCode.CLIENT_SIDE_CONNECT_ERROR);
+ return r;
+ }
+ r = Responses.newBindResult(ResultCode.SUCCESS);
+ return r;
+ }
+
+ @Override
+ public FutureResult<BindResult> bindAsync(BindRequest request,
+ IntermediateResponseHandler intermediateResponseHandler,
+ ResultHandler<? super BindResult> resultHandler) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void close() {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void close(UnbindRequest request, String reason) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public CompareResult compare(CompareRequest request)
+ throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public CompareResult compare(String name, String attributeDescription,
+ String assertionValue) throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public FutureResult<CompareResult> compareAsync(CompareRequest request,
+ IntermediateResponseHandler intermediateResponseHandler,
+ ResultHandler<? super CompareResult> resultHandler) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Result delete(DeleteRequest request) throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Result delete(String name) throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public FutureResult<Result> deleteAsync(DeleteRequest request,
+ IntermediateResponseHandler intermediateResponseHandler,
+ ResultHandler<? super Result> resultHandler) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public <R extends ExtendedResult> R extendedRequest(
+ ExtendedRequest<R> request) throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public <R extends ExtendedResult> R extendedRequest(
+ ExtendedRequest<R> request, IntermediateResponseHandler handler)
+ throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public GenericExtendedResult extendedRequest(String requestName,
+ ByteString requestValue) throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public <R extends ExtendedResult> FutureResult<R> extendedRequestAsync(
+ ExtendedRequest<R> request,
+ IntermediateResponseHandler intermediateResponseHandler,
+ ResultHandler<? super R> resultHandler) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean isClosed() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean isValid() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public Result modify(ModifyRequest request) throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Result modify(String... ldifLines) throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public FutureResult<Result> modifyAsync(ModifyRequest request,
+ IntermediateResponseHandler intermediateResponseHandler,
+ ResultHandler<? super Result> resultHandler) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Result modifyDN(ModifyDNRequest request) throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Result modifyDN(String name, String newRDN)
+ throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public FutureResult<Result> modifyDNAsync(ModifyDNRequest request,
+ IntermediateResponseHandler intermediateResponseHandler,
+ ResultHandler<? super Result> resultHandler) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public SearchResultEntry readEntry(DN name, String... attributeDescriptions)
+ throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public SearchResultEntry readEntry(String name,
+ String... attributeDescriptions) throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public FutureResult<SearchResultEntry> readEntryAsync(DN name,
+ Collection<String> attributeDescriptions,
+ ResultHandler<? super SearchResultEntry> handler) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void removeConnectionEventListener(ConnectionEventListener listener) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public ConnectionEntryReader search(SearchRequest request) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Result search(SearchRequest request,
+ Collection<? super SearchResultEntry> entries)
+ throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Result search(SearchRequest request,
+ Collection<? super SearchResultEntry> entries,
+ Collection<? super SearchResultReference> references)
+ throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Result search(SearchRequest request, SearchResultHandler handler)
+ throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public ConnectionEntryReader search(String baseObject, SearchScope scope,
+ String filter, String... attributeDescriptions) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public FutureResult<Result> searchAsync(SearchRequest request,
+ IntermediateResponseHandler intermediateResponseHandler,
+ SearchResultHandler resultHandler) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public SearchResultEntry searchSingleEntry(SearchRequest request)
+ throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public SearchResultEntry searchSingleEntry(String baseObject,
+ SearchScope scope, String filter, String... attributeDescriptions)
+ throws ErrorResultException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public FutureResult<SearchResultEntry> searchSingleEntryAsync(
+ SearchRequest request,
+ ResultHandler<? super SearchResultEntry> handler) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+}
diff --git a/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCConnectionFactory.java b/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCConnectionFactory.java
index fe92dca..5a8498b 100644
--- a/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCConnectionFactory.java
+++ b/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCConnectionFactory.java
@@ -22,72 +22,73 @@
*
*
* Copyright 2009-2010 Sun Microsystems, Inc.
- * Portions copyright 2011-2013 ForgeRock AS.
+ * Portions copyright 2011-2012 ForgeRock AS.
*/
+
package org.forgerock.opendj.virtual;
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.SQLException;
+
+import org.forgerock.opendj.ldap.Connection;
+import org.forgerock.opendj.ldap.ConnectionFactory;
+import org.forgerock.opendj.ldap.ErrorResultException;
+import org.forgerock.opendj.ldap.FutureResult;
+import org.forgerock.opendj.ldap.ResultHandler;
/**
- * Create a JDBC driver instance which contains all the methods for
- * connection and commands to the database.
+ * Create a JDBC driver instance which contains all the methods for
+ * connection to the database.
*/
-public class JDBCConnectionFactory {
- private String driverName = "com.mysql.jdbc.Driver";
- private Connection con = null;
-
- public JDBCConnectionFactory() {
- try {
- Class.forName(driverName);
- } catch (ClassNotFoundException e) {
- System.out.println(e.toString());
- }
- }
-
- /**
- * Set up a JDBC connection using the defined parameters.
+public final class JDBCConnectionFactory implements ConnectionFactory {
+ private String ConnectionUrl = "";
+ private final String Host;
+ private final int Port;
+ private final String DbName;
+ private JDBCConnection jdbc;
+
+ /**
+ * Set up a JDBC connection configuration.
*
* @param host
- * The host address of the database.
+ * The hostname of the database to connect.
* @param port
- * The port used to connect to the database.
- * @param databaseName
- * The name of the database to connect with.
+ * The port used to connect to the database.
+ * @param dbName
+ * The name of the database.
* @param userName
* The username required for authentication to the database.
* @param userPass
* The password required for authentication to the database.
- * @return The created connection.
*/
- public Connection createConnection(String host, String port, String databaseName, String userName, String userPass) {
- try {
- String connectionUrl="jdbc:mysql://"
- .concat(host+":")
- .concat(port+"/")
- .concat(databaseName);
- con = DriverManager
- .getConnection(connectionUrl,userName,userPass);
- System.out.println("Connection created.");
- } catch (SQLException e) {
- System.out.println(e.toString());
- }
- return con;
+ public JDBCConnectionFactory(final String host, final int port, final String dbName) {
+ this.Host = host;
+ this.Port = port;
+ this.DbName = dbName;
+
+ this.ConnectionUrl="jdbc:mysql://"
+ .concat(this.Host+":")
+ .concat(this.Port+"/")
+ .concat(this.DbName);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Connection getConnection() throws ErrorResultException {
+ if (this.jdbc == null){
+ this.jdbc = new JDBCConnection(this.ConnectionUrl);
+ }
+ return this.jdbc;
}
- /**
- * Close the open connection to the database.
- */
- public void closeConnection(){
- try{
- this.con.close();
- System.out.println("Connection terminated.");
- }catch(Exception e){
- System.out.println(e.toString());
- }
- }
+ @Override
+ public FutureResult<Connection> getConnectionAsync(
+ ResultHandler<? super Connection> handler) {
+ //TODO
+ return null;
+ }
+
}
diff --git a/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCMapper.java b/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCMapper.java
new file mode 100644
index 0000000..62c8d92
--- /dev/null
+++ b/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JDBCMapper.java
@@ -0,0 +1,231 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Copyright 2010 Sun Microsystems, Inc.
+ * Portions copyright 2011 ForgeRock AS
+ */
+
+package org.forgerock.opendj.virtual;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.forgerock.opendj.ldap.Attribute;
+import org.forgerock.opendj.ldap.Connection;
+import org.forgerock.opendj.ldap.ErrorResultException;
+import org.forgerock.opendj.ldap.ErrorResultIOException;
+import org.forgerock.opendj.ldap.SearchResultReferenceIOException;
+import org.forgerock.opendj.ldap.SearchScope;
+import org.forgerock.opendj.ldap.responses.SearchResultEntry;
+import org.forgerock.opendj.ldif.ConnectionEntryReader;
+
+public final class JDBCMapper {
+
+ final private java.sql.Connection jdbcConnection;
+ final private Connection ldapConnection;
+ final private ArrayList<String> tables = new ArrayList<String>();
+ final private Map<String, ArrayList<String>> tableColumnsMap = new HashMap<String, ArrayList<String>>();
+ final private Map<String, String> tableColumnNullableMap = new HashMap<String, String>();
+ final private Map<String, String> tableColumnDataTypeMap = new HashMap<String, String>();
+ final private ArrayList <String> organizationalUnits = new ArrayList<String>();
+ final private Map<String, ArrayList<String>> organizationalUnitAttributesMap = new HashMap<String, ArrayList<String>>();
+ private Map<String, String> SQLToLDAPMap = new HashMap<String, String>();
+
+ JDBCMapper(final Connection jdbcconnection, final Connection ldapconnection) {
+ this.jdbcConnection = ((JDBCConnection) jdbcconnection).getSqlConnection();
+ this.ldapConnection = ldapconnection;
+ }
+
+ public void closeConnections() throws SQLException{
+ this.jdbcConnection.close();
+ this.ldapConnection.close();
+ }
+
+ public void fillMaps() throws ErrorResultException, ErrorResultIOException, SearchResultReferenceIOException, SQLException{
+ fillTablesList();
+ fillTableColumnsMap();
+ fillOrganizationalUnitsList();
+ fillOrganizationalUnitAttributesMap();
+ }
+
+ private void fillTablesList() throws SQLException{
+ final String sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE " +
+ "TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='opendj_db'";
+ final Statement st = jdbcConnection.createStatement();
+ final ResultSet rs = st.executeQuery(sql);
+
+ while(rs.next()){
+ tables.add(rs.getString(1));
+ }
+ }
+
+ private void fillTableColumnsMap() throws SQLException, ErrorResultIOException, SearchResultReferenceIOException{
+ for(int i =0; i < tables.size(); i++){
+ final String tableName = tables.get(i);
+ final String sql = "SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" + tableName + "'";
+ final Statement st = jdbcConnection.createStatement();
+ final ResultSet rs = st.executeQuery(sql);
+ final ArrayList<String> columnsList = new ArrayList<String>();
+
+ String columnName = "", columnNullable = "", columnDataType = "";
+ while(rs.next()){
+ columnName = rs.getString(4);
+ columnNullable = rs.getString(7);
+ columnDataType = rs.getString(8);
+ columnsList.add(columnName);
+ tableColumnNullableMap.put(tableName + ":" + columnName, columnNullable);
+ tableColumnDataTypeMap.put(tableName + ":" + columnName, columnDataType);
+ }
+ tableColumnsMap.put(tableName, columnsList);
+ }
+ }
+
+ public ArrayList<String> getTables() throws SQLException{
+ return tables;
+ }
+
+ public ArrayList<String> getTableColumns(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;
+ 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;
+ return String.class;
+ }
+
+ public ArrayList<String> getOrganizationalUnits(){
+ return organizationalUnits;
+ }
+
+ public ArrayList<String> getOrganizationalUnitAttributes(String organizationalUnitName){
+ final ArrayList<String> organizationalUnitAttributesList = organizationalUnitAttributesMap.get(organizationalUnitName);
+ return organizationalUnitAttributesList;
+ }
+
+ private void fillOrganizationalUnitsList() throws ErrorResultException, ErrorResultIOException, SearchResultReferenceIOException{
+ ConnectionEntryReader reader = ldapConnection.search("dc=example,dc=com", SearchScope.WHOLE_SUBTREE, "ou=*");
+
+ while (reader.hasNext()) {
+ final SearchResultEntry entry = reader.readEntry();
+ final Iterator<Attribute> it = entry.getAllAttributes().iterator();
+ organizationalUnits.add(it.next().firstValueAsString());
+ }
+ }
+
+ private void fillOrganizationalUnitAttributesMap() throws ErrorResultIOException, SearchResultReferenceIOException{
+ for(int i=0; i < organizationalUnits.size(); i++){
+ final String organizationalUnitName = organizationalUnits.get(i);
+ final ConnectionEntryReader reader = ldapConnection.search("ou=" + organizationalUnitName + ",dc=example,dc=com", SearchScope.WHOLE_SUBTREE, "uid=*");
+
+ if(reader.hasNext()){
+ final Iterator<Attribute> it = reader.readEntry().getAllAttributes().iterator();
+ final ArrayList <String> attributesList = new ArrayList <String>();
+
+ while(it.hasNext()){
+ final Attribute att = it.next();
+ attributesList.add(att.getAttributeDescriptionAsString());
+ }
+ organizationalUnitAttributesMap.put(organizationalUnitName, attributesList);
+ }
+ }
+ }
+
+ public void addCurrentMapToMapping(String tableName, String[] columnNames, String OUName, String[] attributeNames){
+ String mappingKey, mappingValue;
+
+ for(int i = 0; i < columnNames.length; i++){
+ mappingKey = tableName + ":" + columnNames[i];
+ mappingValue = OUName + ":" + attributeNames[i];
+ SQLToLDAPMap.put(mappingKey, mappingValue);
+ }
+ }
+
+ public Map<String, String> getMapping(){
+ return SQLToLDAPMap;
+ }
+
+ public Map<String, String> loadCurrentMapFromMapping(String tableName) {
+ String mappingKey, mappingValue;
+ final ArrayList<String> tableColumnsList = tableColumnsMap.get(tableName);
+ 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);
+ }
+ return currentMap;
+ }
+
+ public void loadMappingConfig(Map<String, String> m){
+ this.SQLToLDAPMap = m;
+ }
+
+ public String getTableNameFromMapping(String organizationalUnit) {
+ for (Entry<String, String> entry : SQLToLDAPMap.entrySet()) {
+ String mappingValue = entry.getValue();
+ if (mappingValue.contains(organizationalUnit)) {
+ String mappingKey = entry.getKey();
+ String stringSplitter[] = mappingKey.split(":");
+ String tableName = stringSplitter[0];
+ return tableName;
+ }
+ }
+ return null;
+ }
+
+ public String getColumnNameFromMapping(String tableName, String organizationalUnitName, String attributeName) {
+ for (Entry<String, String> entry : SQLToLDAPMap.entrySet()) {
+ String mappingValue = entry.getValue();
+ if (mappingValue.equals(organizationalUnitName + ":" + attributeName)) {
+ String mappingKey = entry.getKey();
+ if(mappingKey.contains(tableName)){
+ String stringSplitter[] = mappingKey.split(":");
+ String columnName = stringSplitter[1];
+ return columnName;
+ }
+ }
+ }
+ return null;
+ }
+}
+
+
+
\ No newline at end of file
diff --git a/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/MappingConfigurationManager.java b/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/MappingConfigurationManager.java
new file mode 100644
index 0000000..fd4040d
--- /dev/null
+++ b/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/MappingConfigurationManager.java
@@ -0,0 +1,92 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Copyright 2010 Sun Microsystems, Inc.
+ * Portions copyright 2011 ForgeRock AS
+ */
+
+package org.forgerock.opendj.virtual;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+public class MappingConfigurationManager
+{
+ private JDBCMapper JDBCM;
+ private Properties prop;
+
+ public MappingConfigurationManager(JDBCMapper jdbcm){
+ prop = new Properties();
+ JDBCM = jdbcm;
+ }
+
+ public void saveMapping(Map<String, String> mapper){
+ String mappingKey, mappingValue;
+ Set<String> mapperKeySet = mapper.keySet();
+ try {
+ for(Iterator<String> i = mapperKeySet.iterator(); i.hasNext(); ){
+ mappingKey = i.next();
+ mappingValue = mapper.get(mappingKey);
+ prop.setProperty(mappingKey, mappingValue);
+ }
+ prop.store(new FileOutputStream("MappingConfig.properties"), null);
+ System.out.println("Save succesful!");
+
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ public Map<String, String> loadMapping() throws SQLException{
+ try {
+ prop.load(new FileInputStream("MappingConfig.properties"));
+ ArrayList<String> tableNames = JDBCM.getTables();
+ Map<String, String> mapper = new HashMap<String, String>();
+
+ for(int i = 0; i < tableNames.size(); i++){
+ String columnName, mappingKey, mappingValue, tableName = tableNames.get(i);
+ ArrayList<String> columnNames = JDBCM.getTableColumns(tableName);
+
+ for(Iterator<String> j = columnNames.iterator(); j.hasNext(); ) {
+ columnName = j.next();
+ mappingKey = tableName + ":" + columnName;
+ mappingValue = prop.getProperty(tableName + ":" + columnName);
+ if(mappingValue != null)mapper.put(mappingKey, mappingValue);
+ }
+ }
+ return mapper;
+
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ return null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/TestUpdate.class b/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/TestUpdate.class
new file mode 100644
index 0000000..8c4215b
--- /dev/null
+++ b/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/TestUpdate.class
Binary files differ
diff --git a/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/package-info.java b/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/package-info.java
deleted file mode 100644
index 1db04ab..0000000
--- a/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * The contents of this file are subject to the terms of the Common Development and
- * Distribution License (the License). You may not use this file except in compliance with the
- * License.
- *
- * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
- * specific language governing permission and limitations under the License.
- *
- * When distributing Covered Software, include this CDDL Header Notice in each file and include
- * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
- * Header, with the fields enclosed by brackets [] replaced by your own identifying
- * information: "Portions Copyright [year] [name of copyright owner]".
- *
- * Copyright 2012 ForgeRock AS.
- */
-
-/**
- * APIs for the virtual directory.
- */
-package org.forgerock.opendj.virtual;
\ No newline at end of file
diff --git a/opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/AddRequestTestCase.java b/opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/AddRequestTestCase.java
new file mode 100644
index 0000000..634f319
--- /dev/null
+++ b/opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/AddRequestTestCase.java
@@ -0,0 +1,71 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Copyright 2010 Sun Microsystems, Inc.
+ * Portions copyright 2011 ForgeRock AS
+ */
+
+package org.forgerock.opendj.virtual;
+
+import org.forgerock.opendj.ldap.Connection;
+import org.forgerock.opendj.ldap.LDAPConnectionFactory;
+import org.forgerock.opendj.ldap.requests.AddRequest;
+import org.forgerock.opendj.ldap.requests.Requests;
+
+public class AddRequestTestCase {
+ public static void main(String args[])throws Exception {
+ final JDBCConnectionFactory JDBC = new JDBCConnectionFactory("localhost", 3306, "opendj_db");
+ JDBCConnection jdbcconnection = (JDBCConnection) JDBC.getConnection();
+ jdbcconnection.bind("root", "".toCharArray());
+
+ final LDAPConnectionFactory LDAP = new LDAPConnectionFactory("localhost", 389);
+ final Connection ldapconnection = LDAP.getConnection();
+ ldapconnection.bind("cn=Directory Manager", "opendj".toCharArray());
+
+ final JDBCMapper JDBCM = new JDBCMapper(jdbcconnection, ldapconnection);
+ jdbcconnection.initializeMapper(JDBCM);
+
+ AddRequest testRequest1 = Requests.newAddRequest("dn: uid=user.1,ou=People,dc=example,dc=com",
+ "objectClass: top",
+ "objectClass: person",
+ "objectClass: inetOrgPerson",
+ "givenName: Glenn",
+ "sn: Van Lint",
+ "cn: Glenn Van Lint",
+ "employeeNumber: 1");
+ jdbcconnection.add(testRequest1);
+
+ String[] ldifLines = {"dn: uid=user.2,ou=People,dc=example,dc=com",
+ "objectClass: top",
+ "objectClass: person",
+ "objectClass: inetOrgPerson",
+ "givenName: Jochen",
+ "sn: Raymaekers",
+ "cn: Jochen Raymaekers",
+ "employeeNumber: 2"};
+ jdbcconnection.add(ldifLines);
+ }
+}
+
+
+
diff --git a/opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/Example.java b/opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/Example.java
deleted file mode 100644
index b7792aa..0000000
--- a/opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/Example.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * The contents of this file are subject to the terms of the Common Development and
- * Distribution License (the License). You may not use this file except in compliance with the
- * License.
- *
- * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
- * specific language governing permission and limitations under the License.
- *
- * When distributing Covered Software, include this CDDL Header Notice in each file and include
- * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
- * Header, with the fields enclosed by brackets [] replaced by your own identifying
- * information: "Portions Copyright [year] [name of copyright owner]".
- *
- * Copyright 2012-2013 ForgeRock AS.
- */
-
-package org.forgerock.opendj.virtual;
-
-import org.forgerock.opendj.virtual.JDBCConnectionFactory;
-
-/**
- * Example.
- */
-public class Example {
- public static void main(String args[])throws Exception {
- final JDBCConnectionFactory JDBC =new JDBCConnectionFactory();
- JDBC.createConnection("localhost", "3306", "opendj_db","root", "");
- JDBC.closeConnection();
- }
-}
\ No newline at end of file
diff --git a/opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/GUI.java b/opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/GUI.java
new file mode 100644
index 0000000..9bd88ab
--- /dev/null
+++ b/opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/GUI.java
@@ -0,0 +1,306 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Copyright 2010 Sun Microsystems, Inc.
+ * Portions copyright 2011 ForgeRock AS
+ */
+
+package org.forgerock.opendj.virtual;
+
+import java.awt.event.*;
+import java.sql.SQLException;
+
+import javax.swing.*;
+import javax.swing.UIManager.LookAndFeelInfo;
+
+import org.forgerock.opendj.ldap.Connection;
+import org.forgerock.opendj.ldap.ErrorResultException;
+import org.forgerock.opendj.ldap.ErrorResultIOException;
+import org.forgerock.opendj.ldap.LDAPConnectionFactory;
+import org.forgerock.opendj.ldap.SearchResultReferenceIOException;
+
+public class GUI implements ActionListener{
+ //Definition of global values and items that are part of the GUI.
+ static JFrame frame = new JFrame("Login Screen");
+
+ private JPanel totalGUI;
+ private JLabel label, label_1, label_2, label_3, label_4,label_5, label_6, lblBasedn, label_8, label_9;
+ private JPanel buttonPane;
+ private JButton btnLogin, btnCancel;
+
+ //login pane Normal
+ private JPanel loginPane;
+ private JTextField txtHost, txtPort, txtDatabaseName, txtUsername;
+ private JPasswordField txtPassword;
+
+ //login pane Ldap
+ private JPanel loginPaneLdap;
+ private JTextField txtHostLdap, txtPortLdap,txtBaseDN,txtUsernameLdap;
+ private JPasswordField txtPasswordLdap;
+
+ public JPanel createContentPane (){
+ totalGUI = new JPanel();
+ totalGUI.setLayout(null);
+
+ buttonPane = new JPanel();
+ buttonPane.setLayout(null);
+ buttonPane.setBounds(143, 143, 291, 30);
+ totalGUI.add(buttonPane);
+
+ btnLogin = new JButton("Login");
+ btnLogin.setBounds(0, 0, 145, 30);
+ btnLogin.addActionListener(this);
+ buttonPane.add(btnLogin);
+
+ btnCancel = new JButton("Cancel");
+ btnCancel.setBounds(145, 1, 147, 29);
+ btnCancel.addActionListener(this);
+ buttonPane.add(btnCancel);
+
+ loginPane = new JPanel();
+ loginPane.setLayout(null);
+ loginPane.setBounds(6, 6, 274, 125);
+ totalGUI.add(loginPane);
+
+ label = new JLabel("Host");
+ label.setHorizontalAlignment(SwingConstants.TRAILING);
+ label.setBounds(0, 2, 112, 23);
+ loginPane.add(label);
+
+ txtHost = new JTextField();
+ txtHost.setColumns(10);
+ txtHost.setBounds(124, 2, 146, 23);
+ loginPane.add(txtHost);
+
+ label_1 = new JLabel("Port");
+ label_1.setHorizontalAlignment(SwingConstants.TRAILING);
+ label_1.setBounds(0, 25, 112, 23);
+ loginPane.add(label_1);
+
+ txtPort = new JTextField();
+ txtPort.setColumns(10);
+ txtPort.setBounds(124, 25, 146, 23);
+ loginPane.add(txtPort);
+
+ label_2 = new JLabel("DatabaseName");
+ label_2.setHorizontalAlignment(SwingConstants.TRAILING);
+ label_2.setBounds(0, 48, 112, 23);
+ loginPane.add(label_2);
+
+ txtDatabaseName = new JTextField();
+ txtDatabaseName.setColumns(10);
+ txtDatabaseName.setBounds(124, 48, 146, 23);
+ loginPane.add(txtDatabaseName);
+
+ label_3 = new JLabel("Username");
+ label_3.setHorizontalAlignment(SwingConstants.TRAILING);
+ label_3.setBounds(0, 71, 112, 23);
+ loginPane.add(label_3);
+
+ txtUsername = new JTextField();
+ txtUsername.setColumns(10);
+ txtUsername.setBounds(124, 71, 146, 23);
+ loginPane.add(txtUsername);
+
+ label_4 = new JLabel("Password");
+ label_4.setHorizontalAlignment(SwingConstants.TRAILING);
+ label_4.setBounds(0, 94, 112, 23);
+ loginPane.add(label_4);
+
+ txtPassword = new JPasswordField();
+ txtPassword.setBounds(124, 94, 146, 23);
+ loginPane.add(txtPassword);
+
+ loginPaneLdap = new JPanel();
+ loginPaneLdap.setLayout(null);
+ loginPaneLdap.setBounds(292, 6, 274, 125);
+ totalGUI.add(loginPaneLdap);
+
+ label_5 = new JLabel("Host");
+ label_5.setHorizontalAlignment(SwingConstants.TRAILING);
+ label_5.setBounds(0, 2, 112, 23);
+ loginPaneLdap.add(label_5);
+
+ txtHostLdap = new JTextField();
+ txtHostLdap.setColumns(10);
+ txtHostLdap.setBounds(124, 2, 146, 23);
+ loginPaneLdap.add(txtHostLdap);
+
+ label_6 = new JLabel("Port");
+ label_6.setHorizontalAlignment(SwingConstants.TRAILING);
+ label_6.setBounds(0, 25, 112, 23);
+ loginPaneLdap.add(label_6);
+
+ txtPortLdap = new JTextField();
+ txtPortLdap.setColumns(10);
+ txtPortLdap.setBounds(124, 25, 146, 23);
+ loginPaneLdap.add(txtPortLdap);
+
+ lblBasedn = new JLabel("BaseDN");
+ lblBasedn.setHorizontalAlignment(SwingConstants.TRAILING);
+ lblBasedn.setBounds(0, 48, 112, 23);
+ loginPaneLdap.add(lblBasedn);
+
+ txtBaseDN = new JTextField();
+ txtBaseDN.setColumns(10);
+ txtBaseDN.setBounds(124, 48, 146, 23);
+ loginPaneLdap.add(txtBaseDN);
+
+ label_8 = new JLabel("Username");
+ label_8.setHorizontalAlignment(SwingConstants.TRAILING);
+ label_8.setBounds(0, 71, 112, 23);
+ loginPaneLdap.add(label_8);
+
+ txtUsernameLdap = new JTextField();
+ txtUsernameLdap.setColumns(10);
+ txtUsernameLdap.setBounds(124, 71, 146, 23);
+ loginPaneLdap.add(txtUsernameLdap);
+
+ label_9 = new JLabel("Password");
+ label_9.setHorizontalAlignment(SwingConstants.TRAILING);
+ label_9.setBounds(0, 94, 112, 23);
+ loginPaneLdap.add(label_9);
+
+ txtPasswordLdap = new JPasswordField();
+ txtPasswordLdap.setBounds(124, 94, 146, 23);
+ loginPaneLdap.add(txtPasswordLdap);
+
+ txtHost.setText("localhost");
+ txtPort.setText("3306");
+ txtUsername.setText("root");
+ txtDatabaseName.setText("opendj_db");
+ txtHostLdap.setText("localhost");
+ txtPortLdap.setText("389");
+ txtBaseDN.setText("dc=example,dc=com");
+ txtUsernameLdap.setText("cn=Directory Manager");
+
+ return totalGUI;
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ Object source = e.getSource();
+ JDBCConnectionFactory JDBC = null;
+ LDAPConnectionFactory LDAP = null;
+ if((source == btnLogin))
+ {
+ String aHost = txtHost.getText(); //read aHost from the screen as a string
+ String lHost = txtHostLdap.getText();
+ String aPort = txtPort.getText();
+ String lPort = txtPortLdap.getText();
+ Integer intaPort = null;
+ Integer intlPort = null;
+ String aDatabase = txtDatabaseName.getText();
+ String lBaseDN = txtBaseDN.getText();
+ String aUsername = txtUsername.getText();
+ String lUsername = txtUsernameLdap.getText();
+ try {
+ // aHost = txtHost.getText();
+ if ((aHost.isEmpty()) || (lHost.isEmpty()))
+ //if entry is made then throw error
+ throw new IllegalArgumentException("Enter Host address");
+ else if ((aPort.isEmpty()) || (lPort.isEmpty()))
+ {
+ throw new IllegalArgumentException("Enter port number");
+ }
+ else if ((aDatabase.isEmpty()) || (lBaseDN.isEmpty()))
+ {
+ throw new IllegalArgumentException("Enter database name");
+ }
+ else if ((aUsername.isEmpty()) || lUsername.isEmpty())
+ {
+ throw new IllegalArgumentException("Enter username number");
+ }
+ //otherwise setup connection
+ else
+ {
+ try{
+ intaPort = Integer.parseInt(aPort);
+ intlPort = Integer.parseInt(lPort);
+
+ JDBC = new JDBCConnectionFactory(aHost, intaPort, aDatabase);
+ final Connection jdbcconnection = JDBC.getConnection();
+ jdbcconnection.bind(aUsername, txtPassword.getPassword());
+
+ LDAP = new LDAPConnectionFactory(lHost, intlPort);
+ final Connection ldapconnection = LDAP.getConnection();
+ ldapconnection.bind(lUsername, txtPasswordLdap.getPassword());
+
+ //TODO aanpassen connection failed
+ frame.dispose();
+ new GUIMap(JDBC, LDAP);
+ } catch (NumberFormatException ex){
+ JOptionPane.showMessageDialog(frame, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
+ } catch (ErrorResultException e1) {
+ e1.printStackTrace();
+ } catch (ErrorResultIOException e1) {
+ e1.printStackTrace();
+ } catch (SearchResultReferenceIOException e1) {
+ e1.printStackTrace();
+ } catch (SQLException e1) {
+ e1.printStackTrace();
+ }
+ }
+ }
+ catch (IllegalArgumentException x) { // catch the error
+ JOptionPane.showMessageDialog(frame, x.getMessage(), "Warning", JOptionPane.ERROR_MESSAGE);
+ }
+ }
+ else if(source == btnCancel)
+ {
+ System.exit(0);
+ }
+ }
+ private static void createAndShowGUI() {
+
+ // JFrame.setDefaultLookAndFeelDecorated(true);
+ try {
+ for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
+ //System.out.println(info.getName());
+ if ("Nimbus".equals(info.getName())) {
+ UIManager.setLookAndFeel(info.getClassName());
+ break;
+ }
+ }
+ } catch (Exception e) {
+ // If Nimbus is not available, you can set the GUI to another look and feel.
+ }
+ //Create and set up the content pane.
+ GUI gui = new GUI();
+ frame.setContentPane(gui.createContentPane());
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ frame.setSize(600, 225);
+ frame.setVisible(true);
+ frame.setResizable(false);
+ frame.setEnabled(true);
+ frame.setLocationRelativeTo(null);
+ }
+ public static void main(String[] args) {
+ //Schedule a job for the event-dispatching thread:
+ //creating and showing this application's GUI.
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ createAndShowGUI();
+ }
+ });
+ }
+}
diff --git a/opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/GUIMap.java b/opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/GUIMap.java
new file mode 100644
index 0000000..cd7da6e
--- /dev/null
+++ b/opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/GUIMap.java
@@ -0,0 +1,330 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Copyright 2010 Sun Microsystems, Inc.
+ * Portions copyright 2011 ForgeRock AS
+ */
+
+
+
+package org.forgerock.opendj.virtual;
+
+import java.awt.event.*;
+import java.awt.*;
+
+import javax.swing.*;
+import javax.swing.UIManager.LookAndFeelInfo;
+import javax.swing.table.*;
+
+import org.forgerock.opendj.ldap.ErrorResultException;
+import org.forgerock.opendj.ldap.ErrorResultIOException;
+import org.forgerock.opendj.ldap.LDAPConnectionFactory;
+import org.forgerock.opendj.ldap.SearchResultReferenceIOException;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@SuppressWarnings("serial")
+class MyTable extends AbstractTableModel {
+
+ public MyTable(){}
+
+ private String[] columnNames = {"Columns",
+ "Attributes"
+ };
+
+ public Object[][] data = {};
+
+ public int getColumnCount() {
+ return columnNames.length;
+ }
+ public int getRowCount() {
+ return data.length;
+ }
+ public String getColumnName(int col) {
+ return columnNames[col];
+ }
+ public Object getValueAt(int row, int col) {
+ return data[row][col];
+ }
+
+ public boolean isCellEditable(int row, int col) {
+ if (col == 1) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public void setValueAt(Object value, int row, int col) {
+ data[row][col] = value;
+ fireTableCellUpdated(row, col);
+ }
+}
+
+@SuppressWarnings("serial")
+public class GUIMap extends JPanel implements ActionListener {
+ //Definition of global values and items that are part of the GUI.
+ static JFrame frame = new JFrame("Mapping configuration");
+ private JPanel totalGUI, inputPane, dataPane,btnPane;
+ private JComboBox<Object> tableList, directoryOUList;
+ private JButton btnSetMap, btnResetMap, btnSave, btnQuitConnection;
+ private JLabel lblDatabaseTables, lblSelectOu;
+ private JDBCMapper JDBCM;
+ private JTable table;
+ private JScrollPane scrollPane;
+ private MappingConfigurationManager mcm;
+ static DefaultTableModel model;
+ static String[] tableNameList;
+ static String[] OUNameList;
+
+ public GUIMap(JDBCConnectionFactory jdbc, LDAPConnectionFactory ldap) throws ErrorResultException, ErrorResultIOException, SearchResultReferenceIOException, SQLException
+ {
+ JDBCM = new JDBCMapper(jdbc.getConnection(), ldap.getConnection());
+ JDBCM.fillMaps();
+ List<String> tableStringList = JDBCM.getTables();
+ List<String> OUStringList = JDBCM.getOrganizationalUnits();
+ tableNameList = new String[tableStringList.size()];
+ OUNameList = new String[OUStringList.size()];
+ mcm = new MappingConfigurationManager(JDBCM);
+ JDBCM.loadMappingConfig(mcm.loadMapping());
+
+ for (int i = 0; i < tableStringList.size(); i++){
+ tableNameList[i] = tableStringList.get(i);
+ }
+
+ for (int i = 0; i < OUStringList.size(); i++){
+ OUNameList[i] = OUStringList.get(i);
+ }
+
+ try{
+ //JFrame.setDefaultLookAndFeelDecorated(true);
+ for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
+ //System.out.println(info.getName());
+ if ("Nimbus".equals(info.getName())) {
+ UIManager.setLookAndFeel(info.getClassName());
+ break;
+ }
+ }
+ } catch (Exception e) {
+ // If Nimbus is not available, you can set the GUI to another look and feel.
+ }
+ frame.setResizable(false);
+ frame.setContentPane(createContentPane());
+ frame.setEnabled(true);
+ frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+ frame.setSize(523, 487);
+ frame.setLocationRelativeTo(null);
+ frame.setVisible(true);
+}
+
+ /**
+ * @return
+ * @throws SQLException
+ */
+ public JPanel createContentPane () throws SQLException{
+ totalGUI = new JPanel();
+ totalGUI.setLayout(null);
+
+ inputPane = new JPanel();
+ inputPane.setBounds(6, 5, 507, 61);
+ totalGUI.add(inputPane);
+ inputPane.setLayout(null);
+
+ tableList = new JComboBox<Object>(tableNameList);
+ tableList.setToolTipText("Click to change table");
+ tableList.setMaximumRowCount(4);
+ tableList.setBounds(6,35,230,27);
+ tableList.addActionListener(this);
+ inputPane.add(tableList);
+
+ directoryOUList = new JComboBox<Object>(OUNameList);
+ directoryOUList.setToolTipText("Click to change OU");
+ directoryOUList.setMaximumRowCount(4);
+ directoryOUList.setBounds(271, 35, 230, 27);
+ inputPane.add(directoryOUList);
+
+ lblDatabaseTables = new JLabel("Select table");
+ lblDatabaseTables.setBounds(75, 15, 128, 16);
+ inputPane.add(lblDatabaseTables);
+
+ lblSelectOu = new JLabel("Select OU\n");
+ lblSelectOu.setBounds(350, 15, 128, 16);
+ inputPane.add(lblSelectOu);
+ directoryOUList.addActionListener(this);
+
+ dataPane = new JPanel();
+ dataPane.setBounds(6, 75, 511, 308);
+ totalGUI.add(dataPane);
+ dataPane.setLayout(new GridLayout(0, 1, 0, 0));
+
+ //Create the scroll pane and add the table to it.
+ scrollPane = new JScrollPane();
+ fillTable();
+ UpdateTable();
+ dataPane.add(scrollPane);
+
+ table.setPreferredScrollableViewportSize(new Dimension(500, 70));
+ table.setFillsViewportHeight(true);
+ table.getTableHeader().setReorderingAllowed(false);
+ table.getTableHeader().setResizingAllowed(false);
+
+ btnPane = new JPanel();
+ btnPane.setLayout(null);
+ btnPane.setBounds(100, 390, 500, 60);
+ totalGUI.add(btnPane);
+
+ btnSetMap = new JButton("Save current mapping");
+ btnSetMap.setBounds(0, 0, 175, 30);
+ btnSetMap.addActionListener(this);
+ btnPane.add(btnSetMap);
+
+ btnResetMap = new JButton("Reset current mapping");
+ btnResetMap.setBounds(180, 0, 175, 30);
+ btnResetMap.addActionListener(this);
+ btnPane.add(btnResetMap);
+
+ btnSave = new JButton("Save to file");
+ btnSave.setBounds(30, 30, 145, 30);
+ btnSave.addActionListener(this);
+ btnPane.add(btnSave);
+
+ btnQuitConnection = new JButton("Close");
+ btnQuitConnection.setBounds(180, 30, 145, 30);
+ btnQuitConnection.addActionListener(this);
+ btnPane.add(btnQuitConnection);
+
+ return totalGUI;
+ }
+
+ private void fillTable() throws SQLException {
+ String tableName = tableList.getSelectedItem().toString();
+ ArrayList<String> columnsList = JDBCM.getTableColumns(tableName);
+ Object[][] rowData = new Object[columnsList.size()][2];
+
+ for(int i = 0; i < columnsList.size(); i++){
+ String columnName = columnsList.get(i);
+
+ if(!JDBCM.getTableColumnNullable(tableName, columnName)){
+ columnName = columnName.concat("(*)");
+ }
+ rowData[i][0] = columnName;
+ rowData[i][1] = "----";
+ }
+
+ MyTable myTable = new MyTable();
+ myTable.data = rowData;
+ table = new JTable(myTable);
+ scrollPane.setViewportView(table);
+
+ createTableComboBoxList();
+}
+ private void createTableComboBoxList(){
+ JComboBox<String> comboBox = new JComboBox<String>();
+ ArrayList<String> attributesList = JDBCM.getOrganizationalUnitAttributes(directoryOUList.getSelectedItem().toString());
+
+ for(int i = 0; i < attributesList.size(); i++){
+ comboBox.addItem(attributesList.get(i));
+ }
+ TableColumn directoryColumn = table.getColumnModel().getColumn(1);
+ directoryColumn.setCellEditor(new DefaultCellEditor(comboBox));
+ DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
+ directoryColumn.setCellRenderer(renderer);
+ }
+
+ public void UpdateTable(){
+ String tableName = tableList.getSelectedItem().toString();
+ Map<String, String> currentMap = JDBCM.loadCurrentMapFromMapping(tableName);
+
+ if(!currentMap.isEmpty()){
+ String mappingKey, mappingValue;
+ MyTable mt = (MyTable) table.getModel();
+
+ for(int i = 0; i < mt.data.length; i++){
+ mappingKey = tableName + ":" + mt.data[i][0].toString();
+ mappingKey = mappingKey.replace("(*)", "");
+ mappingValue = currentMap.get(mappingKey);
+ String[] stringSplitter = mappingValue.split((":"));
+ mt.data[i][1] = stringSplitter[1];
+ }
+ }
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ Object source = e.getSource();
+ if((source == tableList) || (source == directoryOUList))
+ {
+ try {
+ fillTable();
+ createTableComboBoxList();
+ if(source == tableList){
+ UpdateTable();
+ }
+ } catch (SQLException e1) {
+ e1.printStackTrace();
+ }
+ }
+ else if(source == btnSetMap){
+ MyTable mt = (MyTable) table.getModel();
+ String tableName = tableList.getSelectedItem().toString();
+ String OUName = directoryOUList.getSelectedItem().toString();
+ String [] columnStrings = new String[mt.data.length], attributeStrings = new String[mt.data.length];
+ boolean success = true;
+ String columnName, attributeName;
+
+ for(int i = 0; i < mt.data.length; i++){
+ columnName = mt.data[i][0].toString();
+ attributeName = mt.data[i][1].toString();
+
+ if(columnName.contains("(*)") && attributeName.equals("----")){
+ success = false;
+ JOptionPane.showMessageDialog(frame, "Map all the required fields!", "Error", JOptionPane.ERROR_MESSAGE);
+ break;
+ }
+ columnStrings[i] = columnName.replace("(*)", "");
+ attributeStrings[i] = attributeName;
+ }
+ if(success) JDBCM.addCurrentMapToMapping(tableName, columnStrings, OUName, attributeStrings);
+ }
+ else if(source == btnSave){
+ mcm.saveMapping(JDBCM.getMapping());
+ }
+ else if(source == btnResetMap){
+ try {
+ fillTable();
+ } catch (SQLException e1) {
+ e1.printStackTrace();
+ }
+ }
+ else if(source == btnQuitConnection){
+ try {
+ JDBCM.closeConnections();
+ } catch (SQLException e1) {
+ e1.printStackTrace();
+ }
+ System.exit(0);
+ }
+ }
+}
diff --git a/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JoinConnectionFactory.java b/opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/JDBCConnectionTestCase.java
similarity index 64%
rename from opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JoinConnectionFactory.java
rename to opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/JDBCConnectionTestCase.java
index 1846093..0026a5a 100644
--- a/opendj-sdk/opendj3/opendj-virtual/src/main/java/org/forgerock/opendj/virtual/JoinConnectionFactory.java
+++ b/opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/JDBCConnectionTestCase.java
@@ -21,9 +21,22 @@
* CDDL HEADER END
*
*
- * Copyright 2009-2010 Sun Microsystems, Inc.
- * Portions copyright 2011-2012 ForgeRock AS.
+ * Copyright 2010 Sun Microsystems, Inc.
+ * Portions copyright 2011 ForgeRock AS
*/
package org.forgerock.opendj.virtual;
+import org.forgerock.opendj.ldap.Connection;
+
+
+/**
+ * This class provides tests the JDBCConnection.
+ */
+public class JDBCConnectionTestCase {
+ public static void main(String args[])throws Exception {
+ final JDBCConnectionFactory JDBC = new JDBCConnectionFactory("localhost", 3306, "opendj_db");
+ Connection con = JDBC.getConnection();
+ con.bind("root", "".toCharArray());
+ }
+}
\ No newline at end of file
diff --git a/opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/JDBCMapperTestCase.java b/opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/JDBCMapperTestCase.java
new file mode 100644
index 0000000..6fd09b9
--- /dev/null
+++ b/opendj-sdk/opendj3/opendj-virtual/src/test/java/org/forgerock/opendj/virtual/JDBCMapperTestCase.java
@@ -0,0 +1,81 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Copyright 2010 Sun Microsystems, Inc.
+ * Portions copyright 2011 ForgeRock AS
+ */
+
+package org.forgerock.opendj.virtual;
+
+import java.util.ArrayList;
+
+import org.forgerock.opendj.ldap.Connection;
+import org.forgerock.opendj.ldap.LDAPConnectionFactory;
+
+
+public class JDBCMapperTestCase {
+ public static void main(String args[])throws Exception {
+ final JDBCConnectionFactory JDBC = new JDBCConnectionFactory("localhost", 3306, "opendj_db");
+ final Connection jdbcconnection = JDBC.getConnection();
+ jdbcconnection.bind("root", "".toCharArray());
+
+ final LDAPConnectionFactory LDAP = new LDAPConnectionFactory("localhost", 389);
+ final Connection ldapconnection = LDAP.getConnection();
+ ldapconnection.bind("cn=Directory Manager", "opendj".toCharArray());
+
+ final JDBCMapper JDBCM = new JDBCMapper(jdbcconnection, ldapconnection);
+ JDBCM.fillMaps();
+ final ArrayList<String> tablesList = JDBCM.getTables();
+ final ArrayList<String> organizationalUnitsList = JDBCM.getOrganizationalUnits();
+
+ for(int i = 0; i < tablesList.size(); i++){
+ final String tableName = tablesList.get(i);
+ System.out.println("Table: " + tableName);
+ final ArrayList<String> columnsList = JDBCM.getTableColumns(tableName);
+
+ if(columnsList != null){
+
+ for(int j = 0; j < columnsList.size(); j++){
+ System.out.println(columnsList.get(j));
+ }
+ System.out.println();
+ }
+ }
+
+ for(int i = 0; i < organizationalUnitsList.size(); i++){
+ final String organizationalUnitName = organizationalUnitsList.get(i);
+ System.out.println("OU: " + organizationalUnitName);
+ final ArrayList<String> attributesList = JDBCM.getOrganizationalUnitAttributes(organizationalUnitName);
+
+ if(attributesList != null){
+ for(int j = 0; j < attributesList.size(); j++){
+ System.out.println(attributesList.get(j));
+ }
+ System.out.println();
+ }
+ }
+ }
+}
+
+
+
--
Gitblit v1.10.0