summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Pouzenc <ludovic@pouzenc.fr>2014-10-23 13:30:31 +0200
committerLudovic Pouzenc <ludovic@pouzenc.fr>2015-04-14 07:44:59 +0200
commit695373bb62f87ad8de51d72ed8c78c4acc8af3e0 (patch)
treed2b31ae9c43f7faee5819ff8328126b62b9eb7fe
parent267c7b1af11ec8f306b37c58c7190c57fd906dc5 (diff)
downloadsssync-695373bb62f87ad8de51d72ed8c78c4acc8af3e0.tar.gz
sssync-695373bb62f87ad8de51d72ed8c78c4acc8af3e0.tar.bz2
sssync-695373bb62f87ad8de51d72ed8c78c4acc8af3e0.zip
A bit of visual documentation
-rw-r--r--doc/diagrams/.gitignore1
-rw-r--r--doc/diagrams/config.plant97
-rw-r--r--doc/diagrams/config.svg1
-rw-r--r--doc/diagrams/inheritance.plant28
-rw-r--r--doc/diagrams/inheritance.svg1
-rw-r--r--doc/diagrams/main.plant48
-rw-r--r--doc/diagrams/main.svg1
-rwxr-xr-xdoc/src/do_inherit.sh9
8 files changed, 186 insertions, 0 deletions
diff --git a/doc/diagrams/.gitignore b/doc/diagrams/.gitignore
new file mode 100644
index 0000000..f622f85
--- /dev/null
+++ b/doc/diagrams/.gitignore
@@ -0,0 +1 @@
+/plantuml-dependency.log
diff --git a/doc/diagrams/config.plant b/doc/diagrams/config.plant
new file mode 100644
index 0000000..24bd135
--- /dev/null
+++ b/doc/diagrams/config.plant
@@ -0,0 +1,97 @@
+@startuml
+
+enum DBMSType {
+ORACLE
+MYSQL
+}
+
+enum ConnectionType {
+JDBC
+LDAP
+}
+
+class ConfigConnectionBean {
+-String id
+-String ress
+-String host
+-int port
+-String user
+-String bind
+-String pass
+-String db
+}
+
+class ConfigGlobalsBean {
+-int maxExecTime
+}
+
+class ConfigTaskBean {
+-String name
+-boolean skipReadErrors
+-boolean skipEntryDelete
+}
+
+class ConfigOpLimitsBean {
+ -int insert
+ -int update
+ -int delete
+}
+
+enum SourceKind {
+FIXED_CSV
+FIXED_CSV_SORTED
+LDAP
+SQL
+}
+
+enum DestKind {
+LDAP
+}
+
+
+enum MVDataCombineMode {
+PRIMARY_SOURCE
+MERGE_APPEND
+MERGE_REPLACE
+OVERRIDE
+}
+
+class ConfigSourceBean {
+-String name
+-String conn
+-String query
+-String path
+-String attr
+-String base
+-int lookahead
+}
+
+class ConfigDestBean {
+-String name
+-String conn
+-String attr
+-String base
+-int lookahead
+}
+
+SSSync *-- "confMain (1)" ConfigRootBean
+SSSync *-- "confConn (1)" ConfigConnectionsBean
+
+ConfigRootBean *-- "globals (1)" ConfigGlobalsBean
+ConfigRootBean *-- "tasks (*)" ConfigTaskBean
+
+ConfigConnectionsBean *-- "connections (1)" ConfigConnectionBean
+
+ConfigConnectionBean *-- "dbms (1)" DBMSType
+ConfigConnectionBean *-- "type (1)" ConnectionType
+
+ConfigTaskBean *-- "opLimits (1)" ConfigOpLimitsBean
+ConfigTaskBean *-- "sources (*)" ConfigSourceBean
+ConfigTaskBean *-- "destination (1)" ConfigDestBean
+
+ConfigSourceBean *-- "kind (1)" SourceKind
+ConfigSourceBean *-- "mode (1)" MVDataCombineMode
+
+ConfigDestBean *-- "kind (1)" DestKind
+
+@enduml
diff --git a/doc/diagrams/config.svg b/doc/diagrams/config.svg
new file mode 100644
index 0000000..7554a89
--- /dev/null
+++ b/doc/diagrams/config.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="873pt" style="width:857px;height:873px;" version="1.1" viewBox="0 0 857 873" width="857pt"><defs><filter height="300%" id="f1" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><rect fill="#FEFECE" filter="url(#f1)" height="86.4141" style="stroke: #A80036; stroke-width: 1.5;" width="96" x="537" y="559"/><ellipse cx="552" cy="575" fill="#EB937F" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M556.1094,581 L548.3906,581 L548.3906,568.6094 L556.1094,568.6094 L556.1094,570.7656 L550.8438,570.7656 L550.8438,573.4375 L555.6094,573.4375 L555.6094,575.5938 L550.8438,575.5938 L550.8438,578.8438 L556.1094,578.8438 L556.1094,581 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="64" x="566" y="579.1543">DBMSType</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="538" x2="632" y1="591" y2="591"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="35" x="543" y="605.2104">oracle</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="34" x="543" y="618.0151">mysql</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="52" x="543" y="630.8198">/*derby*/</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="538" x2="632" y1="637.4141" y2="637.4141"/><rect fill="#FEFECE" filter="url(#f1)" height="73.6094" style="stroke: #A80036; stroke-width: 1.5;" width="132" x="716" y="565"/><ellipse cx="731" cy="581" fill="#EB937F" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M735.1094,587 L727.3906,587 L727.3906,574.6094 L735.1094,574.6094 L735.1094,576.7656 L729.8438,576.7656 L729.8438,579.4375 L734.6094,579.4375 L734.6094,581.5938 L729.8438,581.5938 L729.8438,584.8438 L735.1094,584.8438 L735.1094,587 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="100" x="745" y="585.1543">ConnectionType</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="717" x2="847" y1="597" y2="597"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="23" x="722" y="611.2104">jdbc</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="24" x="722" y="624.0151">ldap</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="717" x2="847" y1="630.6094" y2="630.6094"/><rect fill="#FEFECE" filter="url(#f1)" height="150.4375" style="stroke: #A80036; stroke-width: 1.5;" width="174" x="517" y="288"/><ellipse cx="532" cy="304" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M534.9688,309.6406 Q534.3906,309.9375 533.75,310.0859 Q533.1094,310.2344 532.4063,310.2344 Q529.9063,310.2344 528.5859,308.5859 Q527.2656,306.9375 527.2656,303.8125 Q527.2656,300.6875 528.5859,299.0313 Q529.9063,297.375 532.4063,297.375 Q533.1094,297.375 533.7578,297.5313 Q534.4063,297.6875 534.9688,297.9844 L534.9688,300.7031 Q534.3438,300.125 533.75,299.8516 Q533.1563,299.5781 532.5313,299.5781 Q531.1875,299.5781 530.5,300.6484 Q529.8125,301.7188 529.8125,303.8125 Q529.8125,305.9063 530.5,306.9766 Q531.1875,308.0469 532.5313,308.0469 Q533.1563,308.0469 533.75,307.7734 Q534.3438,307.5 534.9688,306.9219 L534.9688,309.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="142" x="546" y="308.1543">ConfigConnectionBean</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="518" x2="690" y1="320" y2="320"/><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="525" y="328.9023"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="47" x="537" y="334.2104">String id</text><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="525" y="341.707"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="63" x="537" y="347.0151">String ress</text><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="525" y="354.5117"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="537" y="359.8198">String host</text><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="525" y="367.3164"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="40" x="537" y="372.6245">int port</text><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="525" y="380.1211"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="63" x="537" y="385.4292">String user</text><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="525" y="392.9258"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="61" x="537" y="398.2339">String bind</text><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="525" y="405.7305"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="65" x="537" y="411.0386">String pass</text><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="525" y="418.5352"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="51" x="537" y="423.8433">String db</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="518" x2="690" y1="430.4375" y2="430.4375"/><rect fill="#FEFECE" filter="url(#f1)" height="60.8047" style="stroke: #A80036; stroke-width: 1.5;" width="149" x="39" y="333"/><ellipse cx="54" cy="349" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M56.9688,354.6406 Q56.3906,354.9375 55.75,355.0859 Q55.1094,355.2344 54.4063,355.2344 Q51.9063,355.2344 50.5859,353.5859 Q49.2656,351.9375 49.2656,348.8125 Q49.2656,345.6875 50.5859,344.0313 Q51.9063,342.375 54.4063,342.375 Q55.1094,342.375 55.7578,342.5313 Q56.4063,342.6875 56.9688,342.9844 L56.9688,345.7031 Q56.3438,345.125 55.75,344.8516 Q55.1563,344.5781 54.5313,344.5781 Q53.1875,344.5781 52.5,345.6484 Q51.8125,346.7188 51.8125,348.8125 Q51.8125,350.9063 52.5,351.9766 Q53.1875,353.0469 54.5313,353.0469 Q55.1563,353.0469 55.75,352.7734 Q56.3438,352.5 56.9688,351.9219 L56.9688,354.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="117" x="68" y="353.1543">ConfigGlobalsBean</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="40" x2="187" y1="365" y2="365"/><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="47" y="373.9023"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="95" x="59" y="379.2104">int maxExecTime</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="40" x2="187" y1="385.8047" y2="385.8047"/><rect fill="#FEFECE" filter="url(#f1)" height="86.4141" style="stroke: #A80036; stroke-width: 1.5;" width="162" x="272" y="320"/><ellipse cx="300.5" cy="336" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M303.4688,341.6406 Q302.8906,341.9375 302.25,342.0859 Q301.6094,342.2344 300.9063,342.2344 Q298.4063,342.2344 297.0859,340.5859 Q295.7656,338.9375 295.7656,335.8125 Q295.7656,332.6875 297.0859,331.0313 Q298.4063,329.375 300.9063,329.375 Q301.6094,329.375 302.2578,329.5313 Q302.9063,329.6875 303.4688,329.9844 L303.4688,332.7031 Q302.8438,332.125 302.25,331.8516 Q301.6563,331.5781 301.0313,331.5781 Q299.6875,331.5781 299,332.6484 Q298.3125,333.7188 298.3125,335.8125 Q298.3125,337.9063 299,338.9766 Q299.6875,340.0469 301.0313,340.0469 Q301.6563,340.0469 302.25,339.7734 Q302.8438,339.5 303.4688,338.9219 L303.4688,341.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="100" x="317.5" y="340.1543">ConfigTaskBean</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="273" x2="433" y1="352" y2="352"/><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="280" y="360.9023"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="69" x="292" y="366.2104">String name</text><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="280" y="373.707"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="135" x="292" y="379.0151">boolean skipReadErrors</text><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="280" y="386.5117"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="136" x="292" y="391.8198">boolean skipEntryDelete</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="273" x2="433" y1="398.4141" y2="398.4141"/><rect fill="#FEFECE" filter="url(#f1)" height="86.4141" style="stroke: #A80036; stroke-width: 1.5;" width="155" x="31" y="559"/><ellipse cx="46" cy="575" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M48.9688,580.6406 Q48.3906,580.9375 47.75,581.0859 Q47.1094,581.2344 46.4063,581.2344 Q43.9063,581.2344 42.5859,579.5859 Q41.2656,577.9375 41.2656,574.8125 Q41.2656,571.6875 42.5859,570.0313 Q43.9063,568.375 46.4063,568.375 Q47.1094,568.375 47.7578,568.5313 Q48.4063,568.6875 48.9688,568.9844 L48.9688,571.7031 Q48.3438,571.125 47.75,570.8516 Q47.1563,570.5781 46.5313,570.5781 Q45.1875,570.5781 44.5,571.6484 Q43.8125,572.7188 43.8125,574.8125 Q43.8125,576.9063 44.5,577.9766 Q45.1875,579.0469 46.5313,579.0469 Q47.1563,579.0469 47.75,578.7734 Q48.3438,578.5 48.9688,577.9219 L48.9688,580.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="123" x="60" y="579.1543">ConfigOpLimitsBean</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="32" x2="185" y1="591" y2="591"/><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="39" y="599.9023"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="50" x="51" y="605.2104">int insert</text><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="39" y="612.707"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="56" x="51" y="618.0151">int update</text><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="39" y="625.5117"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="52" x="51" y="630.8198">int delete</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="32" x2="185" y1="637.4141" y2="637.4141"/><rect fill="#FEFECE" filter="url(#f1)" height="99.2188" style="stroke: #A80036; stroke-width: 1.5;" width="102" x="193" y="765"/><ellipse cx="208" cy="781" fill="#EB937F" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M212.1094,787 L204.3906,787 L204.3906,774.6094 L212.1094,774.6094 L212.1094,776.7656 L206.8438,776.7656 L206.8438,779.4375 L211.6094,779.4375 L211.6094,781.5938 L206.8438,781.5938 L206.8438,784.8438 L212.1094,784.8438 L212.1094,787 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="70" x="222" y="785.1543">SourceKind</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="194" x2="294" y1="797" y2="797"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="19" x="199" y="811.2104">csv</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="24" x="199" y="824.0151">ldap</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="199" y="836.8198">sorted_csv</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="17" x="199" y="849.6245">sql</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="194" x2="294" y1="856.2188" y2="856.2188"/><rect fill="#FEFECE" filter="url(#f1)" height="99.2188" style="stroke: #A80036; stroke-width: 1.5;" width="168" x="378" y="765"/><ellipse cx="393" cy="781" fill="#EB937F" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M397.1094,787 L389.3906,787 L389.3906,774.6094 L397.1094,774.6094 L397.1094,776.7656 L391.8438,776.7656 L391.8438,779.4375 L396.6094,779.4375 L396.6094,781.5938 L391.8438,781.5938 L391.8438,784.8438 L397.1094,784.8438 L397.1094,787 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="136" x="407" y="785.1543">MVDataCombineMode</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="379" x2="545" y1="797" y2="797"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="100" x="384" y="811.2104">PRIMARY_SOURCE</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="89" x="384" y="824.0151">MERGE_APPEND</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="94" x="384" y="836.8198">MERGE_REPLACE</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="55" x="384" y="849.6245">OVERRIDE</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="379" x2="545" y1="856.2188" y2="856.2188"/><rect fill="#FEFECE" filter="url(#f1)" height="124.8281" style="stroke: #A80036; stroke-width: 1.5;" width="166" x="270" y="540"/><ellipse cx="285" cy="556" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M287.9688,561.6406 Q287.3906,561.9375 286.75,562.0859 Q286.1094,562.2344 285.4063,562.2344 Q282.9063,562.2344 281.5859,560.5859 Q280.2656,558.9375 280.2656,555.8125 Q280.2656,552.6875 281.5859,551.0313 Q282.9063,549.375 285.4063,549.375 Q286.1094,549.375 286.7578,549.5313 Q287.4063,549.6875 287.9688,549.9844 L287.9688,552.7031 Q287.3438,552.125 286.75,551.8516 Q286.1563,551.5781 285.5313,551.5781 Q284.1875,551.5781 283.5,552.6484 Q282.8125,553.7188 282.8125,555.8125 Q282.8125,557.9063 283.5,558.9766 Q284.1875,560.0469 285.5313,560.0469 Q286.1563,560.0469 286.75,559.7734 Q287.3438,559.5 287.9688,558.9219 L287.9688,561.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="134" x="299" y="560.1543">ConfigSrcOrDestBean</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="271" x2="435" y1="572" y2="572"/><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="278" y="580.9023"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="69" x="290" y="586.2104">String name</text><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="278" y="593.707"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="64" x="290" y="599.0151">String conn</text><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="278" y="606.5117"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="69" x="290" y="611.8198">String query</text><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="278" y="619.3164"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="62" x="290" y="624.6245">String path</text><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="278" y="632.1211"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="57" x="290" y="637.4292">String attr</text><rect fill="none" height="6" style="stroke: #C82930; stroke-width: 1.0;" width="6" x="278" y="644.9258"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="65" x="290" y="650.2339">String base</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="271" x2="435" y1="656.8281" y2="656.8281"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="77" x="437" y="8"/><ellipse cx="452" cy="24" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M454.9688,29.6406 Q454.3906,29.9375 453.75,30.0859 Q453.1094,30.2344 452.4063,30.2344 Q449.9063,30.2344 448.5859,28.5859 Q447.2656,26.9375 447.2656,23.8125 Q447.2656,20.6875 448.5859,19.0313 Q449.9063,17.375 452.4063,17.375 Q453.1094,17.375 453.7578,17.5313 Q454.4063,17.6875 454.9688,17.9844 L454.9688,20.7031 Q454.3438,20.125 453.75,19.8516 Q453.1563,19.5781 452.5313,19.5781 Q451.1875,19.5781 450.5,20.6484 Q449.8125,21.7188 449.8125,23.8125 Q449.8125,25.9063 450.5,26.9766 Q451.1875,28.0469 452.5313,28.0469 Q453.1563,28.0469 453.75,27.7734 Q454.3438,27.5 454.9688,26.9219 L454.9688,29.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="45" x="466" y="28.1543">SSSync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="438" x2="513" y1="40" y2="40"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="438" x2="513" y1="48" y2="48"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="132" x="287" y="138"/><ellipse cx="302" cy="154" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M304.9688,159.6406 Q304.3906,159.9375 303.75,160.0859 Q303.1094,160.2344 302.4063,160.2344 Q299.9063,160.2344 298.5859,158.5859 Q297.2656,156.9375 297.2656,153.8125 Q297.2656,150.6875 298.5859,149.0313 Q299.9063,147.375 302.4063,147.375 Q303.1094,147.375 303.7578,147.5313 Q304.4063,147.6875 304.9688,147.9844 L304.9688,150.7031 Q304.3438,150.125 303.75,149.8516 Q303.1563,149.5781 302.5313,149.5781 Q301.1875,149.5781 300.5,150.6484 Q299.8125,151.7188 299.8125,153.8125 Q299.8125,155.9063 300.5,156.9766 Q301.1875,158.0469 302.5313,158.0469 Q303.1563,158.0469 303.75,157.7734 Q304.3438,157.5 304.9688,156.9219 L304.9688,159.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="100" x="316" y="158.1543">ConfigRootBean</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="288" x2="418" y1="170" y2="170"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="288" x2="418" y1="178" y2="178"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="181" x="507" y="138"/><ellipse cx="522" cy="154" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M524.9688,159.6406 Q524.3906,159.9375 523.75,160.0859 Q523.1094,160.2344 522.4063,160.2344 Q519.9063,160.2344 518.5859,158.5859 Q517.2656,156.9375 517.2656,153.8125 Q517.2656,150.6875 518.5859,149.0313 Q519.9063,147.375 522.4063,147.375 Q523.1094,147.375 523.7578,147.5313 Q524.4063,147.6875 524.9688,147.9844 L524.9688,150.7031 Q524.3438,150.125 523.75,149.8516 Q523.1563,149.5781 522.5313,149.5781 Q521.1875,149.5781 520.5,150.6484 Q519.8125,151.7188 519.8125,153.8125 Q519.8125,155.9063 520.5,156.9766 Q521.1875,158.0469 522.5313,158.0469 Q523.1563,158.0469 523.75,157.7734 Q524.3438,157.5 524.9688,156.9219 L524.9688,159.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="149" x="536" y="158.1543">ConfigConnectionsBean</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="508" x2="687" y1="170" y2="170"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="508" x2="687" y1="178" y2="178"/><path d="M443.359,65.716 C422.099,88.37 394.593,117.68 375.54,137.982 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="452.339,56.147,445.3163,57.7847,444.127,64.897,451.1497,63.2594,452.339,56.147" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="79" x="357.7452" y="126.7123">confMain (1)</text><path d="M506.901,65.716 C528.334,88.37 556.067,117.68 575.275,137.982 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="497.847,56.147,499.0656,63.2544,506.095,64.8631,504.8764,57.7557,497.847,56.147" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="82" x="526.329" y="126.9396">confConn (1)</text><path d="M314.11,194.707 C268.665,232.926 194.08,295.652 149.942,332.772 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="324.171,186.245,317.0044,187.0452,314.9867,193.9683,322.1533,193.1681,324.171,186.245" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="67" x="142.4136" y="321.8267">globals (1)</text><path d="M353,199.321 C353,233.398 353,283.776 353,319.63 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="353,186.245,349,192.245,353,198.245,357,192.245,353,186.245" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="55" x="329.6335" y="308.829">tasks (*)</text><path d="M599.116,199.385 C599.855,224.13 600.849,257.451 601.748,287.565 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="598.724,186.245,594.9045,192.3615,599.0814,198.2397,602.9009,192.1232,598.724,186.245" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="99" x="555.779" y="276.9841">connections (1)</text><path d="M596.96,451.557 C594.051,488.145 590.812,528.888 588.439,558.737 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="598.014,438.293,593.5512,443.9572,597.0633,450.2553,601.5261,444.591,598.014,438.293" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="58" x="564.78" y="548.0227">dbms (1)</text><path d="M667.918,448.822 C697.57,488.637 731.267,533.882 754.305,564.814 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="660.076,438.293,660.4523,445.4943,667.2443,447.9167,666.8681,440.7154,660.076,438.293" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="50" x="723.4758" y="553.9235">type (1)</text><path d="M299.72,415.188 C255.763,458.245 194.142,518.603 152.963,558.938 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="309.096,406.004,302.0107,407.3451,300.5235,414.4011,307.6088,413.0601,309.096,406.004" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="76" x="136.9088" y="548.2206">opLimits (1)</text><path d="M341.991,419.271 C339.793,455.379 339.676,502.305 341.641,539.561 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="342.936,406.004,338.5195,411.7044,342.0828,417.9736,346.4993,412.2732,342.936,406.004" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="71" x="295.5114" y="513.9715">sources (*)</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="0" x="345.5114" y="529.1043"/><path d="M364.656,419.271 C366.984,455.379 367.108,502.305 365.027,539.561 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="363.656,406.004,360.1183,412.2877,364.5579,417.9701,368.0956,411.6864,363.656,406.004" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="0" x="374.1738" y="513.9947"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="93" x="341.6738" y="529.1275">destination (1)</text><path d="M315.089,676.084 C300.063,705.446 283.178,738.442 269.635,764.906 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="321.18,664.181,314.8857,667.6998,315.7129,674.8633,322.0072,671.3445,321.18,664.181" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="48" x="258.2895" y="753.8614">kind (1)</text><path d="M390.911,676.084 C405.937,705.446 422.822,738.442 436.365,764.906 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="384.82,664.181,383.9928,671.3445,390.2871,674.8633,391.1143,667.6998,384.82,664.181" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="59" x="403.8044" y="754.0004">mode (1)</text></g></svg> \ No newline at end of file
diff --git a/doc/diagrams/inheritance.plant b/doc/diagrams/inheritance.plant
new file mode 100644
index 0000000..5b763e6
--- /dev/null
+++ b/doc/diagrams/inheritance.plant
@@ -0,0 +1,28 @@
+@startuml
+abstract class data.io.AbstractMVDataReader
+abstract class sync.AbstractSyncTask
+interface data.io.MVDataReader
+interface data.io.MVDataWriter
+interface java.io.Closeable
+interface java.lang.Comparable
+interface java.lang.Iterable
+interface java.util.Iterator
+interface java.util.concurrent.Callable
+data.io.AbstractMVDataReader --|> data.io.MVDataReader
+sync.AbstractSyncTask --|> java.util.concurrent.Callable
+data.MVDataEntry --|> java.lang.Comparable
+data.filters.MVDataCombiner --|> data.io.AbstractMVDataReader
+data.io.ConnectionsHolder --|> java.io.Closeable
+data.io.SafeDataReader --|> data.io.AbstractMVDataReader
+data.io.csv.CSVDataReader --|> data.io.AbstractMVDataReader
+data.io.ldap.LDAPConnectionWrapper --|> java.io.Closeable
+data.io.ldap.LDAPFlatDataReader --|> data.io.AbstractMVDataReader
+data.io.ldap.LDAPFlatDataWriter --|> data.io.MVDataWriter
+data.io.sql.SQLConnectionWrapper --|> java.io.Closeable
+data.io.sql.SQLRelDataReader --|> data.io.AbstractMVDataReader
+data.io.stub.StubDataReader --|> data.io.AbstractMVDataReader
+data.io.stub.StubDataWriter --|> data.io.MVDataWriter
+sync.BasicSyncTask --|> sync.AbstractSyncTask
+data.io.MVDataReader --|> java.lang.Iterable
+data.io.MVDataReader --|> java.util.Iterator
+@enduml
diff --git a/doc/diagrams/inheritance.svg b/doc/diagrams/inheritance.svg
new file mode 100644
index 0000000..4004ae8
--- /dev/null
+++ b/doc/diagrams/inheritance.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="627pt" style="width:1706px;height:627px;" version="1.1" viewBox="0 0 1706 627" width="1706pt"><defs><filter height="300%" id="f1" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><polygon fill="#FFFFFF" filter="url(#f1)" points="523,148,582,148,589,170.2969,1023,170.2969,1023,496,523,496,523,148" style="stroke: #000000; stroke-width: 2.0;"/><line style="stroke: #000000; stroke-width: 2.0;" x1="523" x2="589" y1="170.2969" y2="170.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="53" x="526" y="163.9951">data.io</text><polygon fill="#FFFFFF" filter="url(#f1)" points="1514,24,1557,24,1564,46.2969,1684,46.2969,1684,248,1514,248,1514,24" style="stroke: #000000; stroke-width: 2.0;"/><line style="stroke: #000000; stroke-width: 2.0;" x1="1514" x2="1564" y1="46.2969" y2="46.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="37" x="1517" y="39.9951">sync</text><polygon fill="#FFFFFF" filter="url(#f1)" points="1275,272,1331,272,1338,294.2969,1395,294.2969,1395,372,1275,372,1275,272" style="stroke: #000000; stroke-width: 2.0;"/><line style="stroke: #000000; stroke-width: 2.0;" x1="1275" x2="1338" y1="294.2969" y2="294.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="50" x="1278" y="287.9951">java.io</text><polygon fill="#FFFFFF" filter="url(#f1)" points="329,520,404,520,411,542.2969,576,542.2969,576,620,329,620,329,520" style="stroke: #000000; stroke-width: 2.0;"/><line style="stroke: #000000; stroke-width: 2.0;" x1="329" x2="411" y1="542.2969" y2="542.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="69" x="332" y="535.9951">java.lang</text><polygon fill="#FFFFFF" filter="url(#f1)" points="600,520,666,520,673,542.2969,708,542.2969,708,620,600,620,600,520" style="stroke: #000000; stroke-width: 2.0;"/><line style="stroke: #000000; stroke-width: 2.0;" x1="600" x2="673" y1="542.2969" y2="542.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="60" x="603" y="535.9951">java.util</text><polygon fill="#FFFFFF" filter="url(#f1)" points="1529,272,1688,272,1695,294.2969,1699,294.2969,1699,372,1529,372,1529,272" style="stroke: #000000; stroke-width: 2.0;"/><line style="stroke: #000000; stroke-width: 2.0;" x1="1529" x2="1695" y1="294.2969" y2="294.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="153" x="1532" y="287.9951">java.util.concurrent</text><polygon fill="#FFFFFF" filter="url(#f1)" points="324,396,364,396,371,418.2969,468,418.2969,468,496,324,496,324,396" style="stroke: #000000; stroke-width: 2.0;"/><line style="stroke: #000000; stroke-width: 2.0;" x1="324" x2="371" y1="418.2969" y2="418.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="34" x="327" y="411.9951">data</text><polygon fill="#FFFFFF" filter="url(#f1)" points="22,148,113,148,120,170.2969,192,170.2969,192,248,22,248,22,148" style="stroke: #000000; stroke-width: 2.0;"/><line style="stroke: #000000; stroke-width: 2.0;" x1="22" x2="120" y1="170.2969" y2="170.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="85" x="25" y="163.9951">data.filters</text><polygon fill="#FFFFFF" filter="url(#f1)" points="337,148,428,148,435,170.2969,499,170.2969,499,248,337,248,337,148" style="stroke: #000000; stroke-width: 2.0;"/><line style="stroke: #000000; stroke-width: 2.0;" x1="337" x2="435" y1="170.2969" y2="170.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="85" x="340" y="163.9951">data.io.csv</text><polygon fill="#FFFFFF" filter="url(#f1)" points="663,24,760,24,767,46.2969,1263,46.2969,1263,124,663,124,663,24" style="stroke: #000000; stroke-width: 2.0;"/><line style="stroke: #000000; stroke-width: 2.0;" x1="663" x2="767" y1="46.2969" y2="46.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="91" x="666" y="39.9951">data.io.ldap</text><polygon fill="#FFFFFF" filter="url(#f1)" points="1047,148,1134,148,1141,170.2969,1440,170.2969,1440,248,1047,248,1047,148" style="stroke: #000000; stroke-width: 2.0;"/><line style="stroke: #000000; stroke-width: 2.0;" x1="1047" x2="1141" y1="170.2969" y2="170.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="81" x="1050" y="163.9951">data.io.sql</text><polygon fill="#FFFFFF" filter="url(#f1)" points="226,24,325,24,332,46.2969,557,46.2969,557,124,226,124,226,24" style="stroke: #000000; stroke-width: 2.0;"/><line style="stroke: #000000; stroke-width: 2.0;" x1="226" x2="332" y1="46.2969" y2="46.2969"/><text fill="#000000" font-family="sans-serif" font-size="14" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="93" x="229" y="39.9951">data.io.stub</text><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="171" x="539" y="308"/><ellipse cx="554" cy="324" fill="#A9DCDF" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M554.1094,319.3438 L552.9531,324.4219 L555.2813,324.4219 L554.1094,319.3438 Z M552.625,317.1094 L555.6094,317.1094 L558.9688,329.5 L556.5156,329.5 L555.75,326.4375 L552.4688,326.4375 L551.7188,329.5 L549.2813,329.5 L552.625,317.1094 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="139" x="568" y="328.1543">AbstractMVDataReader</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="540" x2="709" y1="340" y2="340"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="540" x2="709" y1="348" y2="348"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="120" x="564" y="432"/><ellipse cx="579" cy="448" fill="#B4A7E5" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M574.9219,443.7656 L574.9219,441.6094 L582.3125,441.6094 L582.3125,443.7656 L579.8438,443.7656 L579.8438,451.8438 L582.3125,451.8438 L582.3125,454 L574.9219,454 L574.9219,451.8438 L577.3906,451.8438 L577.3906,443.7656 L574.9219,443.7656 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="88" x="593" y="452.1543">MVDataReader</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="565" x2="683" y1="464" y2="464"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="565" x2="683" y1="472" y2="472"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="115" x="893" y="184"/><ellipse cx="908" cy="200" fill="#B4A7E5" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M903.9219,195.7656 L903.9219,193.6094 L911.3125,193.6094 L911.3125,195.7656 L908.8438,195.7656 L908.8438,203.8438 L911.3125,203.8438 L911.3125,206 L903.9219,206 L903.9219,203.8438 L906.3906,203.8438 L906.3906,195.7656 L903.9219,195.7656 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="83" x="922" y="204.1543">MVDataWriter</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="894" x2="1007" y1="216" y2="216"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="894" x2="1007" y1="224" y2="224"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="151" x="708" y="184"/><ellipse cx="723" cy="200" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M725.9688,205.6406 Q725.3906,205.9375 724.75,206.0859 Q724.1094,206.2344 723.4063,206.2344 Q720.9063,206.2344 719.5859,204.5859 Q718.2656,202.9375 718.2656,199.8125 Q718.2656,196.6875 719.5859,195.0313 Q720.9063,193.375 723.4063,193.375 Q724.1094,193.375 724.7578,193.5313 Q725.4063,193.6875 725.9688,193.9844 L725.9688,196.7031 Q725.3438,196.125 724.75,195.8516 Q724.1563,195.5781 723.5313,195.5781 Q722.1875,195.5781 721.5,196.6484 Q720.8125,197.7188 720.8125,199.8125 Q720.8125,201.9063 721.5,202.9766 Q722.1875,204.0469 723.5313,204.0469 Q724.1563,204.0469 724.75,203.7734 Q725.3438,203.5 725.9688,202.9219 L725.9688,205.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="119" x="737" y="204.1543">ConnectionsHolder</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="709" x2="858" y1="216" y2="216"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="709" x2="858" y1="224" y2="224"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="135" x="539" y="184"/><ellipse cx="554" cy="200" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M556.9688,205.6406 Q556.3906,205.9375 555.75,206.0859 Q555.1094,206.2344 554.4063,206.2344 Q551.9063,206.2344 550.5859,204.5859 Q549.2656,202.9375 549.2656,199.8125 Q549.2656,196.6875 550.5859,195.0313 Q551.9063,193.375 554.4063,193.375 Q555.1094,193.375 555.7578,193.5313 Q556.4063,193.6875 556.9688,193.9844 L556.9688,196.7031 Q556.3438,196.125 555.75,195.8516 Q555.1563,195.5781 554.5313,195.5781 Q553.1875,195.5781 552.5,196.6484 Q551.8125,197.7188 551.8125,199.8125 Q551.8125,201.9063 552.5,202.9766 Q553.1875,204.0469 554.5313,204.0469 Q555.1563,204.0469 555.75,203.7734 Q556.3438,203.5 556.9688,202.9219 L556.9688,205.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="103" x="568" y="204.1543">SafeDataReader</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="540" x2="673" y1="216" y2="216"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="540" x2="673" y1="224" y2="224"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="139" x="1530" y="184"/><ellipse cx="1545" cy="200" fill="#A9DCDF" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1545.1094,195.3438 L1543.9531,200.4219 L1546.2813,200.4219 L1545.1094,195.3438 Z M1543.625,193.1094 L1546.6094,193.1094 L1549.9688,205.5 L1547.5156,205.5 L1546.75,202.4375 L1543.4688,202.4375 L1542.7188,205.5 L1540.2813,205.5 L1543.625,193.1094 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="107" x="1559" y="204.1543">AbstractSyncTask</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1531" x2="1668" y1="216" y2="216"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1531" x2="1668" y1="224" y2="224"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="123" x="1538" y="60"/><ellipse cx="1553" cy="76" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1555.9688,81.6406 Q1555.3906,81.9375 1554.75,82.0859 Q1554.1094,82.2344 1553.4063,82.2344 Q1550.9063,82.2344 1549.5859,80.5859 Q1548.2656,78.9375 1548.2656,75.8125 Q1548.2656,72.6875 1549.5859,71.0313 Q1550.9063,69.375 1553.4063,69.375 Q1554.1094,69.375 1554.7578,69.5313 Q1555.4063,69.6875 1555.9688,69.9844 L1555.9688,72.7031 Q1555.3438,72.125 1554.75,71.8516 Q1554.1563,71.5781 1553.5313,71.5781 Q1552.1875,71.5781 1551.5,72.6484 Q1550.8125,73.7188 1550.8125,75.8125 Q1550.8125,77.9063 1551.5,78.9766 Q1552.1875,80.0469 1553.5313,80.0469 Q1554.1563,80.0469 1554.75,79.7734 Q1555.3438,79.5 1555.9688,78.9219 L1555.9688,81.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="91" x="1567" y="80.1543">BasicSyncTask</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1539" x2="1660" y1="92" y2="92"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1539" x2="1660" y1="100" y2="100"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="88" x="1291" y="308"/><ellipse cx="1306" cy="324" fill="#B4A7E5" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1301.9219,319.7656 L1301.9219,317.6094 L1309.3125,317.6094 L1309.3125,319.7656 L1306.8438,319.7656 L1306.8438,327.8438 L1309.3125,327.8438 L1309.3125,330 L1301.9219,330 L1301.9219,327.8438 L1304.3906,327.8438 L1304.3906,319.7656 L1301.9219,319.7656 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="56" x="1320" y="328.1543">Closeable</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1292" x2="1378" y1="340" y2="340"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1292" x2="1378" y1="348" y2="348"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="103" x="345" y="556"/><ellipse cx="360" cy="572" fill="#B4A7E5" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M355.9219,567.7656 L355.9219,565.6094 L363.3125,565.6094 L363.3125,567.7656 L360.8438,567.7656 L360.8438,575.8438 L363.3125,575.8438 L363.3125,578 L355.9219,578 L355.9219,575.8438 L358.3906,575.8438 L358.3906,567.7656 L355.9219,567.7656 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="71" x="374" y="576.1543">Comparable</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="346" x2="447" y1="588" y2="588"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="346" x2="447" y1="596" y2="596"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="78" x="482" y="556"/><ellipse cx="497" cy="572" fill="#B4A7E5" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M492.9219,567.7656 L492.9219,565.6094 L500.3125,565.6094 L500.3125,567.7656 L497.8438,567.7656 L497.8438,575.8438 L500.3125,575.8438 L500.3125,578 L492.9219,578 L492.9219,575.8438 L495.3906,575.8438 L495.3906,567.7656 L492.9219,567.7656 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="46" x="511" y="576.1543">Iterable</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="483" x2="559" y1="588" y2="588"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="483" x2="559" y1="596" y2="596"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="77" x="616" y="556"/><ellipse cx="631" cy="572" fill="#B4A7E5" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M626.9219,567.7656 L626.9219,565.6094 L634.3125,565.6094 L634.3125,567.7656 L631.8438,567.7656 L631.8438,575.8438 L634.3125,575.8438 L634.3125,578 L626.9219,578 L626.9219,575.8438 L629.3906,575.8438 L629.3906,567.7656 L626.9219,567.7656 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="45" x="645" y="576.1543">Iterator</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="617" x2="692" y1="588" y2="588"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="617" x2="692" y1="596" y2="596"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="78" x="1560" y="308"/><ellipse cx="1575" cy="324" fill="#B4A7E5" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1570.9219,319.7656 L1570.9219,317.6094 L1578.3125,317.6094 L1578.3125,319.7656 L1575.8438,319.7656 L1575.8438,327.8438 L1578.3125,327.8438 L1578.3125,330 L1570.9219,330 L1570.9219,327.8438 L1573.3906,327.8438 L1573.3906,319.7656 L1570.9219,319.7656 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="46" x="1589" y="328.1543">Callable</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1561" x2="1637" y1="340" y2="340"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1561" x2="1637" y1="348" y2="348"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="112" x="340" y="432"/><ellipse cx="355" cy="448" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M357.9688,453.6406 Q357.3906,453.9375 356.75,454.0859 Q356.1094,454.2344 355.4063,454.2344 Q352.9063,454.2344 351.5859,452.5859 Q350.2656,450.9375 350.2656,447.8125 Q350.2656,444.6875 351.5859,443.0313 Q352.9063,441.375 355.4063,441.375 Q356.1094,441.375 356.7578,441.5313 Q357.4063,441.6875 357.9688,441.9844 L357.9688,444.7031 Q357.3438,444.125 356.75,443.8516 Q356.1563,443.5781 355.5313,443.5781 Q354.1875,443.5781 353.5,444.6484 Q352.8125,445.7188 352.8125,447.8125 Q352.8125,449.9063 353.5,450.9766 Q354.1875,452.0469 355.5313,452.0469 Q356.1563,452.0469 356.75,451.7734 Q357.3438,451.5 357.9688,450.9219 L357.9688,453.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="80" x="369" y="452.1543">MVDataEntry</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="341" x2="451" y1="464" y2="464"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="341" x2="451" y1="472" y2="472"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="139" x="38" y="184"/><ellipse cx="53" cy="200" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M55.9688,205.6406 Q55.3906,205.9375 54.75,206.0859 Q54.1094,206.2344 53.4063,206.2344 Q50.9063,206.2344 49.5859,204.5859 Q48.2656,202.9375 48.2656,199.8125 Q48.2656,196.6875 49.5859,195.0313 Q50.9063,193.375 53.4063,193.375 Q54.1094,193.375 54.7578,193.5313 Q55.4063,193.6875 55.9688,193.9844 L55.9688,196.7031 Q55.3438,196.125 54.75,195.8516 Q54.1563,195.5781 53.5313,195.5781 Q52.1875,195.5781 51.5,196.6484 Q50.8125,197.7188 50.8125,199.8125 Q50.8125,201.9063 51.5,202.9766 Q52.1875,204.0469 53.5313,204.0469 Q54.1563,204.0469 54.75,203.7734 Q55.3438,203.5 55.9688,202.9219 L55.9688,205.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="107" x="67" y="204.1543">MVDataCombiner</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="39" x2="176" y1="216" y2="216"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="39" x2="176" y1="224" y2="224"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="131" x="353" y="184"/><ellipse cx="368" cy="200" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M370.9688,205.6406 Q370.3906,205.9375 369.75,206.0859 Q369.1094,206.2344 368.4063,206.2344 Q365.9063,206.2344 364.5859,204.5859 Q363.2656,202.9375 363.2656,199.8125 Q363.2656,196.6875 364.5859,195.0313 Q365.9063,193.375 368.4063,193.375 Q369.1094,193.375 369.7578,193.5313 Q370.4063,193.6875 370.9688,193.9844 L370.9688,196.7031 Q370.3438,196.125 369.75,195.8516 Q369.1563,195.5781 368.5313,195.5781 Q367.1875,195.5781 366.5,196.6484 Q365.8125,197.7188 365.8125,199.8125 Q365.8125,201.9063 366.5,202.9766 Q367.1875,204.0469 368.5313,204.0469 Q369.1563,204.0469 369.75,203.7734 Q370.3438,203.5 370.9688,202.9219 L370.9688,205.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="99" x="382" y="204.1543">CSVDataReader</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="354" x2="483" y1="216" y2="216"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="354" x2="483" y1="224" y2="224"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="187" x="1061" y="60"/><ellipse cx="1076" cy="76" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1078.9688,81.6406 Q1078.3906,81.9375 1077.75,82.0859 Q1077.1094,82.2344 1076.4063,82.2344 Q1073.9063,82.2344 1072.5859,80.5859 Q1071.2656,78.9375 1071.2656,75.8125 Q1071.2656,72.6875 1072.5859,71.0313 Q1073.9063,69.375 1076.4063,69.375 Q1077.1094,69.375 1077.7578,69.5313 Q1078.4063,69.6875 1078.9688,69.9844 L1078.9688,72.7031 Q1078.3438,72.125 1077.75,71.8516 Q1077.1563,71.5781 1076.5313,71.5781 Q1075.1875,71.5781 1074.5,72.6484 Q1073.8125,73.7188 1073.8125,75.8125 Q1073.8125,77.9063 1074.5,78.9766 Q1075.1875,80.0469 1076.5313,80.0469 Q1077.1563,80.0469 1077.75,79.7734 Q1078.3438,79.5 1078.9688,78.9219 L1078.9688,81.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="155" x="1090" y="80.1543">LDAPConnectionWrapper</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1062" x2="1247" y1="92" y2="92"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1062" x2="1247" y1="100" y2="100"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="161" x="679" y="60"/><ellipse cx="694" cy="76" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M696.9688,81.6406 Q696.3906,81.9375 695.75,82.0859 Q695.1094,82.2344 694.4063,82.2344 Q691.9063,82.2344 690.5859,80.5859 Q689.2656,78.9375 689.2656,75.8125 Q689.2656,72.6875 690.5859,71.0313 Q691.9063,69.375 694.4063,69.375 Q695.1094,69.375 695.7578,69.5313 Q696.4063,69.6875 696.9688,69.9844 L696.9688,72.7031 Q696.3438,72.125 695.75,71.8516 Q695.1563,71.5781 694.5313,71.5781 Q693.1875,71.5781 692.5,72.6484 Q691.8125,73.7188 691.8125,75.8125 Q691.8125,77.9063 692.5,78.9766 Q693.1875,80.0469 694.5313,80.0469 Q695.1563,80.0469 695.75,79.7734 Q696.3438,79.5 696.9688,78.9219 L696.9688,81.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="129" x="708" y="80.1543">LDAPFlatDataReader</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="680" x2="839" y1="92" y2="92"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="680" x2="839" y1="100" y2="100"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="153" x="874" y="60"/><ellipse cx="889" cy="76" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M891.9688,81.6406 Q891.3906,81.9375 890.75,82.0859 Q890.1094,82.2344 889.4063,82.2344 Q886.9063,82.2344 885.5859,80.5859 Q884.2656,78.9375 884.2656,75.8125 Q884.2656,72.6875 885.5859,71.0313 Q886.9063,69.375 889.4063,69.375 Q890.1094,69.375 890.7578,69.5313 Q891.4063,69.6875 891.9688,69.9844 L891.9688,72.7031 Q891.3438,72.125 890.75,71.8516 Q890.1563,71.5781 889.5313,71.5781 Q888.1875,71.5781 887.5,72.6484 Q886.8125,73.7188 886.8125,75.8125 Q886.8125,77.9063 887.5,78.9766 Q888.1875,80.0469 889.5313,80.0469 Q890.1563,80.0469 890.75,79.7734 Q891.3438,79.5 891.9688,78.9219 L891.9688,81.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="121" x="903" y="80.1543">LDAPFlatDataWriter</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="875" x2="1026" y1="92" y2="92"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="875" x2="1026" y1="100" y2="100"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="179" x="1246" y="184"/><ellipse cx="1261" cy="200" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1263.9688,205.6406 Q1263.3906,205.9375 1262.75,206.0859 Q1262.1094,206.2344 1261.4063,206.2344 Q1258.9063,206.2344 1257.5859,204.5859 Q1256.2656,202.9375 1256.2656,199.8125 Q1256.2656,196.6875 1257.5859,195.0313 Q1258.9063,193.375 1261.4063,193.375 Q1262.1094,193.375 1262.7578,193.5313 Q1263.4063,193.6875 1263.9688,193.9844 L1263.9688,196.7031 Q1263.3438,196.125 1262.75,195.8516 Q1262.1563,195.5781 1261.5313,195.5781 Q1260.1875,195.5781 1259.5,196.6484 Q1258.8125,197.7188 1258.8125,199.8125 Q1258.8125,201.9063 1259.5,202.9766 Q1260.1875,204.0469 1261.5313,204.0469 Q1262.1563,204.0469 1262.75,203.7734 Q1263.3438,203.5 1263.9688,202.9219 L1263.9688,205.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="147" x="1275" y="204.1543">SQLConnectionWrapper</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1247" x2="1424" y1="216" y2="216"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1247" x2="1424" y1="224" y2="224"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="149" x="1063" y="184"/><ellipse cx="1078" cy="200" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1080.9688,205.6406 Q1080.3906,205.9375 1079.75,206.0859 Q1079.1094,206.2344 1078.4063,206.2344 Q1075.9063,206.2344 1074.5859,204.5859 Q1073.2656,202.9375 1073.2656,199.8125 Q1073.2656,196.6875 1074.5859,195.0313 Q1075.9063,193.375 1078.4063,193.375 Q1079.1094,193.375 1079.7578,193.5313 Q1080.4063,193.6875 1080.9688,193.9844 L1080.9688,196.7031 Q1080.3438,196.125 1079.75,195.8516 Q1079.1563,195.5781 1078.5313,195.5781 Q1077.1875,195.5781 1076.5,196.6484 Q1075.8125,197.7188 1075.8125,199.8125 Q1075.8125,201.9063 1076.5,202.9766 Q1077.1875,204.0469 1078.5313,204.0469 Q1079.1563,204.0469 1079.75,203.7734 Q1080.3438,203.5 1080.9688,202.9219 L1080.9688,205.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="117" x="1092" y="204.1543">SQLRelDataReader</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1064" x2="1211" y1="216" y2="216"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1064" x2="1211" y1="224" y2="224"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="136" x="242" y="60"/><ellipse cx="257" cy="76" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M259.9688,81.6406 Q259.3906,81.9375 258.75,82.0859 Q258.1094,82.2344 257.4063,82.2344 Q254.9063,82.2344 253.5859,80.5859 Q252.2656,78.9375 252.2656,75.8125 Q252.2656,72.6875 253.5859,71.0313 Q254.9063,69.375 257.4063,69.375 Q258.1094,69.375 258.7578,69.5313 Q259.4063,69.6875 259.9688,69.9844 L259.9688,72.7031 Q259.3438,72.125 258.75,71.8516 Q258.1563,71.5781 257.5313,71.5781 Q256.1875,71.5781 255.5,72.6484 Q254.8125,73.7188 254.8125,75.8125 Q254.8125,77.9063 255.5,78.9766 Q256.1875,80.0469 257.5313,80.0469 Q258.1563,80.0469 258.75,79.7734 Q259.3438,79.5 259.9688,78.9219 L259.9688,81.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="104" x="271" y="80.1543">StubDataReader</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="243" x2="377" y1="92" y2="92"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="243" x2="377" y1="100" y2="100"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="128" x="413" y="60"/><ellipse cx="428" cy="76" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M430.9688,81.6406 Q430.3906,81.9375 429.75,82.0859 Q429.1094,82.2344 428.4063,82.2344 Q425.9063,82.2344 424.5859,80.5859 Q423.2656,78.9375 423.2656,75.8125 Q423.2656,72.6875 424.5859,71.0313 Q425.9063,69.375 428.4063,69.375 Q429.1094,69.375 429.7578,69.5313 Q430.4063,69.6875 430.9688,69.9844 L430.9688,72.7031 Q430.3438,72.125 429.75,71.8516 Q429.1563,71.5781 428.5313,71.5781 Q427.1875,71.5781 426.5,72.6484 Q425.8125,73.7188 425.8125,75.8125 Q425.8125,77.9063 426.5,78.9766 Q427.1875,80.0469 428.5313,80.0469 Q429.1563,80.0469 429.75,79.7734 Q430.3438,79.5 430.9688,78.9219 L430.9688,81.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="96" x="442" y="80.1543">StubDataWriter</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="414" x2="540" y1="92" y2="92"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="414" x2="540" y1="100" y2="100"/><path d="M624,356.203 C624,371.992 624,393.07 624,411.786 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="631,411.858,624,431.858,617,411.858,631,411.858" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1599,232.203 C1599,247.992 1599,269.07 1599,287.786 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1606,287.858,1599,307.858,1592,287.858,1606,287.858" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M396,480.203 C396,495.992 396,517.07 396,535.786 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="403,535.858,396,555.8582,389,535.858,403,535.858" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M148.894,232.202 C165.32,240.815 184.611,249.883 203,256 C307.554,290.779 432.315,310.771 518.749,321.436 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="519.738,314.504,538.768,323.823,518.08,328.405,519.738,314.504" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M820.433,232.171 C836.571,241.338 856.061,250.811 875,256 C938.532,273.408 957.719,255.18 1023,264 C1110.06,275.763 1208.89,299.019 1271.56,315.033 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1273.36,308.267,1290.96,320.056,1269.85,321.821,1273.36,308.267" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M609.513,232.203 C611.805,247.992 614.865,269.07 617.582,287.786 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="624.55,287.06,620.496,307.858,610.695,289.071,624.55,287.06" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M458.208,232.203 C489.118,250.809 532.227,276.758 566.74,297.533 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="570.368,291.547,583.894,307.858,563.148,303.541,570.368,291.547" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1247.35,89.716 C1321.21,96.418 1415.8,110.605 1440,140 C1472.77,179.804 1463.45,210.085 1440,256 C1430.37,274.864 1413.62,290.13 1396.3,301.895 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1399.73,308.001,1379.02,312.495,1392.41,296.068,1399.73,308.001" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M678.596,106.949 C641.84,116.443 597.541,126.501 557,132 C544.881,133.644 345.49,131.196 337,140 C301.213,177.112 305.555,215.144 337,256 C359.486,285.216 446.457,305.511 518.825,317.733 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="520.161,310.858,538.783,320.967,517.921,324.678,520.161,310.858" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M950,108.203 C950,123.992 950,145.07 950,163.786 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="957,163.858,950,183.858,943,163.858,957,163.858" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1335,232.203 C1335,247.992 1335,269.07 1335,287.786 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1342,287.858,1335,307.858,1328,287.858,1342,287.858" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1086.2,232.088 C1066.76,240.584 1044.17,249.604 1023,256 C925.299,285.514 810.535,305.948 729.232,318.136 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="730.117,325.081,709.313,321.057,728.085,311.229,730.117,325.081" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M300.334,108.112 C287.539,144.4 270.281,213.335 304,256 C330.576,289.627 436.025,309.95 518.703,321.009 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="519.683,314.077,538.633,323.558,517.907,327.964,519.683,314.077" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M541.293,104.231 C576.801,114.478 621.916,125.995 663,132 C686.324,135.409 853.172,131.101 875,140 C890.617,146.367 905.063,157.514 917.023,168.963 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="922.452,164.513,931.201,183.812,912.327,174.182,922.452,164.513" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1599,108.203 C1599,123.992 1599,145.07 1599,163.786 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="1606,163.858,1599,183.858,1592,163.858,1606,163.858" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M603.896,480.203 C589.717,497.272 570.404,520.523 553.987,540.2879 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="559.217,544.9462,541.053,555.8582,548.448,536.0007,559.217,544.9462" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M629.856,480.203 C633.717,496.163 638.885,517.527 643.45,536.3922 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="none" points="650.26,534.773,648.159,555.8582,636.652,538.0651,650.26,534.773" style="stroke: #A80036; stroke-width: 1.0;"/></g></svg> \ No newline at end of file
diff --git a/doc/diagrams/main.plant b/doc/diagrams/main.plant
new file mode 100644
index 0000000..4429300
--- /dev/null
+++ b/doc/diagrams/main.plant
@@ -0,0 +1,48 @@
+@startuml
+class SSSync {
++void main(String[] args)
+}
+
+class SSSyncConfParser {
++loadMainConfig(String mainConfigFile)
++loadConnConfig(String connConfigFile)
+}
+
+class SSSyncConnectionsFactory {
++setupConnections(ConfigConnectionsBean confConn)
+}
+
+class SSSyncTasksFactory {
++setupTasks(ConnectionsHolder connections, ConfigRootBean confMain)
+}
+
+abstract class AbstractSyncTask {
+ #String taskName
+ #boolean dryRun
+ +Boolean call()
+}
+
+interface "Callable<Boolean>" as Callable_Boolean_ {
+}
+Callable_Boolean_ <|.. AbstractSyncTask
+
+class ExecutorService {
++invokeAll(Callable tasks...)
+}
+
+SSSync *-- "1" ConfigRootBean
+SSSync *-- "1" ConfigConnectionsBean
+SSSync *-- "1" ConnectionsHolder
+SSSync *-- "*" AbstractSyncTask
+
+SSSync "(1)" -up-> SSSyncConfParser
+SSSync "(2)" -up-> SSSyncConnectionsFactory
+SSSync "(3)" -up-> SSSyncTasksFactory
+SSSync "(4)" -> ExecutorService
+
+ConfigRootBean *-- "1" ConfigGlobalsBean
+ConfigRootBean *-- "*" ConfigTaskBean
+
+ConnectionsHolder *-- "*" LDAPConnectionWrapper
+ConnectionsHolder *-- "*" SQLConnectionWrapper
+@enduml
diff --git a/doc/diagrams/main.svg b/doc/diagrams/main.svg
new file mode 100644
index 0000000..a1f032b
--- /dev/null
+++ b/doc/diagrams/main.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="571pt" style="width:1299px;height:571px;" version="1.1" viewBox="0 0 1299 571" width="1299pt"><defs><filter height="300%" id="f1" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><rect fill="#FEFECE" filter="url(#f1)" height="60.8047" style="stroke: #A80036; stroke-width: 1.5;" width="159" x="552" y="164"/><ellipse cx="604.75" cy="180" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M607.7188,185.6406 Q607.1406,185.9375 606.5,186.0859 Q605.8594,186.2344 605.1563,186.2344 Q602.6563,186.2344 601.3359,184.5859 Q600.0156,182.9375 600.0156,179.8125 Q600.0156,176.6875 601.3359,175.0313 Q602.6563,173.375 605.1563,173.375 Q605.8594,173.375 606.5078,173.5313 Q607.1563,173.6875 607.7188,173.9844 L607.7188,176.7031 Q607.0938,176.125 606.5,175.8516 Q605.9063,175.5781 605.2813,175.5781 Q603.9375,175.5781 603.25,176.6484 Q602.5625,177.7188 602.5625,179.8125 Q602.5625,181.9063 603.25,182.9766 Q603.9375,184.0469 605.2813,184.0469 Q605.9063,184.0469 606.5,183.7734 Q607.0938,183.5 607.7188,182.9219 L607.7188,185.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="45" x="625.25" y="184.1543">SSSync</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="553" x2="710" y1="196" y2="196"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="553" x2="710" y1="204" y2="204"/><ellipse cx="563" cy="215.9023" fill="#84BE84" rx="3" ry="3" style="stroke: #038048; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="133" x="572" y="218.2104">void main(String[] args)</text><rect fill="#FEFECE" filter="url(#f1)" height="73.6094" style="stroke: #A80036; stroke-width: 1.5;" width="242" x="830" y="8"/><ellipse cx="889.75" cy="24" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M892.7188,29.6406 Q892.1406,29.9375 891.5,30.0859 Q890.8594,30.2344 890.1563,30.2344 Q887.6563,30.2344 886.3359,28.5859 Q885.0156,26.9375 885.0156,23.8125 Q885.0156,20.6875 886.3359,19.0313 Q887.6563,17.375 890.1563,17.375 Q890.8594,17.375 891.5078,17.5313 Q892.1563,17.6875 892.7188,17.9844 L892.7188,20.7031 Q892.0938,20.125 891.5,19.8516 Q890.9063,19.5781 890.2813,19.5781 Q888.9375,19.5781 888.25,20.6484 Q887.5625,21.7188 887.5625,23.8125 Q887.5625,25.9063 888.25,26.9766 Q888.9375,28.0469 890.2813,28.0469 Q890.9063,28.0469 891.5,27.7734 Q892.0938,27.5 892.7188,26.9219 L892.7188,29.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="114" x="910.25" y="28.1543">SSSyncConfParser</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="831" x2="1071" y1="40" y2="40"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="831" x2="1071" y1="48" y2="48"/><ellipse cx="841" cy="59.9023" fill="#84BE84" rx="3" ry="3" style="stroke: #038048; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="214" x="850" y="62.2104">loadMainConfig(String mainConfigFile)</text><ellipse cx="841" cy="72.707" fill="#84BE84" rx="3" ry="3" style="stroke: #038048; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="216" x="850" y="75.0151">loadConnConfig(String connConfigFile)</text><rect fill="#FEFECE" filter="url(#f1)" height="60.8047" style="stroke: #A80036; stroke-width: 1.5;" width="327" x="469" y="14.5"/><ellipse cx="543.75" cy="30.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M546.7188,36.1406 Q546.1406,36.4375 545.5,36.5859 Q544.8594,36.7344 544.1563,36.7344 Q541.6563,36.7344 540.3359,35.0859 Q539.0156,33.4375 539.0156,30.3125 Q539.0156,27.1875 540.3359,25.5313 Q541.6563,23.875 544.1563,23.875 Q544.8594,23.875 545.5078,24.0313 Q546.1563,24.1875 546.7188,24.4844 L546.7188,27.2031 Q546.0938,26.625 545.5,26.3516 Q544.9063,26.0781 544.2813,26.0781 Q542.9375,26.0781 542.25,27.1484 Q541.5625,28.2188 541.5625,30.3125 Q541.5625,32.4063 542.25,33.4766 Q542.9375,34.5469 544.2813,34.5469 Q544.9063,34.5469 545.5,34.2734 Q546.0938,34 546.7188,33.4219 L546.7188,36.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="169" x="564.25" y="34.6543">SSSyncConnectionsFactory</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="470" x2="795" y1="46.5" y2="46.5"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="470" x2="795" y1="54.5" y2="54.5"/><ellipse cx="480" cy="66.4023" fill="#84BE84" rx="3" ry="3" style="stroke: #038048; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="301" x="489" y="68.7104">setupConnections(ConfigConnectionsBean confConn)</text><rect fill="#FEFECE" filter="url(#f1)" height="60.8047" style="stroke: #A80036; stroke-width: 1.5;" width="428" x="6" y="14.5"/><ellipse cx="152.25" cy="30.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M155.2188,36.1406 Q154.6406,36.4375 154,36.5859 Q153.3594,36.7344 152.6563,36.7344 Q150.1563,36.7344 148.8359,35.0859 Q147.5156,33.4375 147.5156,30.3125 Q147.5156,27.1875 148.8359,25.5313 Q150.1563,23.875 152.6563,23.875 Q153.3594,23.875 154.0078,24.0313 Q154.6563,24.1875 155.2188,24.4844 L155.2188,27.2031 Q154.5938,26.625 154,26.3516 Q153.4063,26.0781 152.7813,26.0781 Q151.4375,26.0781 150.75,27.1484 Q150.0625,28.2188 150.0625,30.3125 Q150.0625,32.4063 150.75,33.4766 Q151.4375,34.5469 152.7813,34.5469 Q153.4063,34.5469 154,34.2734 Q154.5938,34 155.2188,33.4219 L155.2188,36.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="127" x="172.75" y="34.6543">SSSyncTasksFactory</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="433" y1="46.5" y2="46.5"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="433" y1="54.5" y2="54.5"/><ellipse cx="17" cy="66.4023" fill="#84BE84" rx="3" ry="3" style="stroke: #038048; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="402" x="26" y="68.7104">setupTasks(ConnectionsHolder connections, ConfigRootBean confMain)</text><rect fill="#FEFECE" filter="url(#f1)" height="86.4141" style="stroke: #A80036; stroke-width: 1.5;" width="139" x="223" y="326"/><ellipse cx="238" cy="342" fill="#A9DCDF" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M238.1094,337.3438 L236.9531,342.4219 L239.2813,342.4219 L238.1094,337.3438 Z M236.625,335.1094 L239.6094,335.1094 L242.9688,347.5 L240.5156,347.5 L239.75,344.4375 L236.4688,344.4375 L235.7188,347.5 L233.2813,347.5 L236.625,335.1094 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="107" x="252" y="346.1543">AbstractSyncTask</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="224" x2="361" y1="358" y2="358"/><polygon fill="none" points="234,364.9023,238,368.9023,234,372.9023,230,368.9023" style="stroke: #B38D22; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="94" x="243" y="372.2104">String taskName</text><polygon fill="none" points="234,377.707,238,381.707,234,385.707,230,381.707" style="stroke: #B38D22; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="87" x="243" y="385.0151">boolean dryRun</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="224" x2="361" y1="391.6094" y2="391.6094"/><ellipse cx="234" cy="403.5117" fill="#84BE84" rx="3" ry="3" style="stroke: #038048; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="76" x="243" y="405.8198">Boolean call()</text><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="144" x="221" y="169"/><ellipse cx="236" cy="185" fill="#B4A7E5" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M231.9219,180.7656 L231.9219,178.6094 L239.3125,178.6094 L239.3125,180.7656 L236.8438,180.7656 L236.8438,188.8438 L239.3125,188.8438 L239.3125,191 L231.9219,191 L231.9219,188.8438 L234.3906,188.8438 L234.3906,180.7656 L231.9219,180.7656 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="112" x="250" y="189.1543">Callable&lt;Boolean&gt;</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="222" x2="364" y1="201" y2="201"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="222" x2="364" y1="209" y2="209"/><rect fill="#FEFECE" filter="url(#f1)" height="60.8047" style="stroke: #A80036; stroke-width: 1.5;" width="174" x="770" y="162.5"/><ellipse cx="803.9" cy="178.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M806.8688,184.1406 Q806.2906,184.4375 805.65,184.5859 Q805.0094,184.7344 804.3063,184.7344 Q801.8063,184.7344 800.4859,183.0859 Q799.1656,181.4375 799.1656,178.3125 Q799.1656,175.1875 800.4859,173.5313 Q801.8063,171.875 804.3063,171.875 Q805.0094,171.875 805.6578,172.0313 Q806.3063,172.1875 806.8688,172.4844 L806.8688,175.2031 Q806.2438,174.625 805.65,174.3516 Q805.0563,174.0781 804.4313,174.0781 Q803.0875,174.0781 802.4,175.1484 Q801.7125,176.2188 801.7125,178.3125 Q801.7125,180.4063 802.4,181.4766 Q803.0875,182.5469 804.4313,182.5469 Q805.0563,182.5469 805.65,182.2734 Q806.2438,182 806.8688,181.4219 L806.8688,184.1406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="100" x="822.1" y="182.6543">ExecutorService</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="771" x2="943" y1="194.5" y2="194.5"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="771" x2="943" y1="202.5" y2="202.5"/><ellipse cx="781" cy="214.4023" fill="#84BE84" rx="3" ry="3" style="stroke: #038048; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="148" x="790" y="216.7104">invokeAll(Callable tasks...)</text><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="132" x="446" y="345"/><ellipse cx="461" cy="361" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M463.9688,366.6406 Q463.3906,366.9375 462.75,367.0859 Q462.1094,367.2344 461.4063,367.2344 Q458.9063,367.2344 457.5859,365.5859 Q456.2656,363.9375 456.2656,360.8125 Q456.2656,357.6875 457.5859,356.0313 Q458.9063,354.375 461.4063,354.375 Q462.1094,354.375 462.7578,354.5313 Q463.4063,354.6875 463.9688,354.9844 L463.9688,357.7031 Q463.3438,357.125 462.75,356.8516 Q462.1563,356.5781 461.5313,356.5781 Q460.1875,356.5781 459.5,357.6484 Q458.8125,358.7188 458.8125,360.8125 Q458.8125,362.9063 459.5,363.9766 Q460.1875,365.0469 461.5313,365.0469 Q462.1563,365.0469 462.75,364.7734 Q463.3438,364.5 463.9688,363.9219 L463.9688,366.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="100" x="475" y="365.1543">ConfigRootBean</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="447" x2="577" y1="377" y2="377"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="447" x2="577" y1="385" y2="385"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="181" x="661" y="345"/><ellipse cx="676" cy="361" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M678.9688,366.6406 Q678.3906,366.9375 677.75,367.0859 Q677.1094,367.2344 676.4063,367.2344 Q673.9063,367.2344 672.5859,365.5859 Q671.2656,363.9375 671.2656,360.8125 Q671.2656,357.6875 672.5859,356.0313 Q673.9063,354.375 676.4063,354.375 Q677.1094,354.375 677.7578,354.5313 Q678.4063,354.6875 678.9688,354.9844 L678.9688,357.7031 Q678.3438,357.125 677.75,356.8516 Q677.1563,356.5781 676.5313,356.5781 Q675.1875,356.5781 674.5,357.6484 Q673.8125,358.7188 673.8125,360.8125 Q673.8125,362.9063 674.5,363.9766 Q675.1875,365.0469 676.5313,365.0469 Q677.1563,365.0469 677.75,364.7734 Q678.3438,364.5 678.9688,363.9219 L678.9688,366.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="149" x="690" y="365.1543">ConfigConnectionsBean</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="662" x2="841" y1="377" y2="377"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="662" x2="841" y1="385" y2="385"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="151" x="926" y="345"/><ellipse cx="941" cy="361" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M943.9688,366.6406 Q943.3906,366.9375 942.75,367.0859 Q942.1094,367.2344 941.4063,367.2344 Q938.9063,367.2344 937.5859,365.5859 Q936.2656,363.9375 936.2656,360.8125 Q936.2656,357.6875 937.5859,356.0313 Q938.9063,354.375 941.4063,354.375 Q942.1094,354.375 942.7578,354.5313 Q943.4063,354.6875 943.9688,354.9844 L943.9688,357.7031 Q943.3438,357.125 942.75,356.8516 Q942.1563,356.5781 941.5313,356.5781 Q940.1875,356.5781 939.5,357.6484 Q938.8125,358.7188 938.8125,360.8125 Q938.8125,362.9063 939.5,363.9766 Q940.1875,365.0469 941.5313,365.0469 Q942.1563,365.0469 942.75,364.7734 Q943.3438,364.5 943.9688,363.9219 L943.9688,366.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="119" x="955" y="365.1543">ConnectionsHolder</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="927" x2="1076" y1="377" y2="377"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="927" x2="1076" y1="385" y2="385"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="149" x="325" y="514"/><ellipse cx="340" cy="530" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M342.9688,535.6406 Q342.3906,535.9375 341.75,536.0859 Q341.1094,536.2344 340.4063,536.2344 Q337.9063,536.2344 336.5859,534.5859 Q335.2656,532.9375 335.2656,529.8125 Q335.2656,526.6875 336.5859,525.0313 Q337.9063,523.375 340.4063,523.375 Q341.1094,523.375 341.7578,523.5313 Q342.4063,523.6875 342.9688,523.9844 L342.9688,526.7031 Q342.3438,526.125 341.75,525.8516 Q341.1563,525.5781 340.5313,525.5781 Q339.1875,525.5781 338.5,526.6484 Q337.8125,527.7188 337.8125,529.8125 Q337.8125,531.9063 338.5,532.9766 Q339.1875,534.0469 340.5313,534.0469 Q341.1563,534.0469 341.75,533.7734 Q342.3438,533.5 342.9688,532.9219 L342.9688,535.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="117" x="354" y="534.1543">ConfigGlobalsBean</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="326" x2="473" y1="546" y2="546"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="326" x2="473" y1="554" y2="554"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="132" x="558" y="514"/><ellipse cx="573" cy="530" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M575.9688,535.6406 Q575.3906,535.9375 574.75,536.0859 Q574.1094,536.2344 573.4063,536.2344 Q570.9063,536.2344 569.5859,534.5859 Q568.2656,532.9375 568.2656,529.8125 Q568.2656,526.6875 569.5859,525.0313 Q570.9063,523.375 573.4063,523.375 Q574.1094,523.375 574.7578,523.5313 Q575.4063,523.6875 575.9688,523.9844 L575.9688,526.7031 Q575.3438,526.125 574.75,525.8516 Q574.1563,525.5781 573.5313,525.5781 Q572.1875,525.5781 571.5,526.6484 Q570.8125,527.7188 570.8125,529.8125 Q570.8125,531.9063 571.5,532.9766 Q572.1875,534.0469 573.5313,534.0469 Q574.1563,534.0469 574.75,533.7734 Q575.3438,533.5 575.9688,532.9219 L575.9688,535.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="100" x="587" y="534.1543">ConfigTaskBean</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="559" x2="689" y1="546" y2="546"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="559" x2="689" y1="554" y2="554"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="187" x="840" y="514"/><ellipse cx="855" cy="530" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M857.9688,535.6406 Q857.3906,535.9375 856.75,536.0859 Q856.1094,536.2344 855.4063,536.2344 Q852.9063,536.2344 851.5859,534.5859 Q850.2656,532.9375 850.2656,529.8125 Q850.2656,526.6875 851.5859,525.0313 Q852.9063,523.375 855.4063,523.375 Q856.1094,523.375 856.7578,523.5313 Q857.4063,523.6875 857.9688,523.9844 L857.9688,526.7031 Q857.3438,526.125 856.75,525.8516 Q856.1563,525.5781 855.5313,525.5781 Q854.1875,525.5781 853.5,526.6484 Q852.8125,527.7188 852.8125,529.8125 Q852.8125,531.9063 853.5,532.9766 Q854.1875,534.0469 855.5313,534.0469 Q856.1563,534.0469 856.75,533.7734 Q857.3438,533.5 857.9688,532.9219 L857.9688,535.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="155" x="869" y="534.1543">LDAPConnectionWrapper</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="841" x2="1026" y1="546" y2="546"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="841" x2="1026" y1="554" y2="554"/><rect fill="#FEFECE" filter="url(#f1)" height="48" style="stroke: #A80036; stroke-width: 1.5;" width="179" x="1111" y="514"/><ellipse cx="1126" cy="530" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M1128.9688,535.6406 Q1128.3906,535.9375 1127.75,536.0859 Q1127.1094,536.2344 1126.4063,536.2344 Q1123.9063,536.2344 1122.5859,534.5859 Q1121.2656,532.9375 1121.2656,529.8125 Q1121.2656,526.6875 1122.5859,525.0313 Q1123.9063,523.375 1126.4063,523.375 Q1127.1094,523.375 1127.7578,523.5313 Q1128.4063,523.6875 1128.9688,523.9844 L1128.9688,526.7031 Q1128.3438,526.125 1127.75,525.8516 Q1127.1563,525.5781 1126.5313,525.5781 Q1125.1875,525.5781 1124.5,526.6484 Q1123.8125,527.7188 1123.8125,529.8125 Q1123.8125,531.9063 1124.5,532.9766 Q1125.1875,534.0469 1126.5313,534.0469 Q1127.1563,534.0469 1127.75,533.7734 Q1128.3438,533.5 1128.9688,532.9219 L1128.9688,535.6406 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="147" x="1140" y="534.1543">SQLConnectionWrapper</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="1112" x2="1289" y1="546" y2="546"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="1112" x2="1289" y1="554" y2="554"/><path d="M293,237.402 C293,264.53 293,299.053 293,325.932 " fill="none" style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 7.0,7.0;"/><polygon fill="none" points="286,237.103,293,217.103,300,237.103,286,237.103" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M603.813,235.107 C580.402,269.247 547.901,316.645 528.505,344.93 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="611.371,224.084,604.679,226.7704,604.5849,233.9809,611.2769,231.2945,611.371,224.084" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="8" x="540.7701" y="334.1107">1</text><path d="M660.187,235.107 C683.598,269.247 716.099,316.645 735.495,344.93 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="652.629,224.084,652.7231,231.2945,659.4151,233.9809,659.321,226.7704,652.629,224.084" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="8" x="726.5765" y="333.8692">1</text><path d="M717.791,229.137 C766.951,249.844 829.517,277.173 884,304 C909.809,316.708 938.057,332.21 960.443,344.887 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="705.594,224.02,709.5789,230.03,716.6593,228.6632,712.6744,222.6532,705.594,224.02" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="8" x="940.3539" y="334.0795">1</text><path d="M554.048,229.713 C509.638,250.529 453.206,277.777 404,304 C390.303,311.299 375.862,319.426 362.09,327.393 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="565.946,224.155,558.817,223.0699,555.0735,229.2332,562.2025,230.3183,565.946,224.155" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="7" x="369.9058" y="329.5824">*</text><path d="M866.942,84.262 C813.546,109.203 745.492,140.99 696.387,163.926 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="871.736,82.023,861.8889,82.2087,867.206,84.1395,865.2752,89.4566,871.736,82.023" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="18" x="718.7382" y="158.904">(1)</text><path d="M632,80.79 C632,106.143 632,139.778 632,163.784 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="632,75.512,628,84.512,632,80.512,636,84.512,632,75.512" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="18" x="627.3467" y="152.896">(2)</text><path d="M309.085,77.218 C381.325,103.343 482.243,139.84 551.944,165.048 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="304.369,75.512,311.4707,82.3359,309.0706,77.2135,314.1931,74.8134,304.369,75.512" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="18" x="525.8268" y="158.028">(3)</text><path d="M711.01,205.883 C728.372,206.356 746.904,206.384 764.735,205.975 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="769.744,205.848,760.6452,202.0781,764.7456,205.9751,760.8486,210.0756,769.744,205.848" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="18" x="719.1263" y="215.9221">(4)</text><path d="M488.718,404.131 C466.959,436.964 435.049,485.1131 416.017,513.8313 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="495.953,393.214,489.3041,396.0055,489.3237,403.2166,495.9726,400.4251,495.953,393.214" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="8" x="428.1782" y="502.7996">1</text><path d="M535.282,404.131 C557.041,436.964 588.951,485.1131 607.983,513.8313 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="528.047,393.214,528.0274,400.4251,534.6763,403.2166,534.6959,396.0055,528.047,393.214" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="7" x="599.8551" y="502.9429">*</text><path d="M987.342,405.43 C974.147,438.223 955.129,485.4893 943.725,513.8313 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="992.257,393.214,986.3065,397.2873,987.7778,404.3467,993.7283,400.2734,992.257,393.214" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="7" x="951.3914" y="503.0132">*</text><path d="M1040.86,402.003 C1079.54,434.853 1137.99,484.486 1172.54,513.8313 " fill="none" style="stroke: #A80036; stroke-width: 1.0;"/><polygon fill="#A80036" points="1030.51,393.214,1032.4943,400.1467,1039.6569,400.9815,1037.6726,394.0488,1030.51,393.214" style="stroke: #A80036; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacingAndGlyphs" textLength="7" x="1158.7617" y="503.0198">*</text></g></svg> \ No newline at end of file
diff --git a/doc/src/do_inherit.sh b/doc/src/do_inherit.sh
new file mode 100755
index 0000000..a49a528
--- /dev/null
+++ b/doc/src/do_inherit.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+PLANTUML_PATH=/opt/plantuml
+#CODE_BASEPATH=~/git/sssync/src/
+CODE_BASEPATH=../..
+
+java -jar $PLANTUML_PATH/plantuml-dependency-cli-1.4.0-jar-with-dependencies.jar -b $CODE_BASEPATH -o /tmp/inheritance.plant -dt abstract_classes,classes,enums,extensions,implementations,interfaces,native_methods
+grep -vE '^class ' /tmp/inheritance.plant > ../diagrams/inheritance.plant
+cd ../diagrams/
+java -jar $PLANTUML_PATH/plantuml.8008.jar -tsvg inheritance.plant