You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2012/10/29 18:18:06 UTC

svn commit: r1403432 - in /incubator/syncope/branches/1_0_X: build-tools/src/main/resources/ core/src/main/java/org/apache/syncope/core/persistence/beans/ core/src/main/java/org/apache/syncope/core/persistence/validation/attrvalue/ core/src/main/java/o...

Author: ilgrosso
Date: Mon Oct 29 17:18:05 2012
New Revision: 1403432

URL: http://svn.apache.org/viewvc?rev=1403432&view=rev
Log:
[SYNCOPE-230] SyncJob was failing to find existing users when __UID__ was mapped to an internal non-string schema

Modified:
    incubator/syncope/branches/1_0_X/build-tools/src/main/resources/testdb.sql
    incubator/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractAttrValue.java
    incubator/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/validation/attrvalue/AbstractValidator.java
    incubator/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/scheduling/SyncJob.java
    incubator/syncope/branches/1_0_X/core/src/main/resources/META-INF/orm.xml
    incubator/syncope/branches/1_0_X/core/src/test/java/org/apache/syncope/core/persistence/dao/TaskTest.java
    incubator/syncope/branches/1_0_X/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java
    incubator/syncope/branches/1_0_X/core/src/test/resources/content.xml

Modified: incubator/syncope/branches/1_0_X/build-tools/src/main/resources/testdb.sql
URL: http://svn.apache.org/viewvc/incubator/syncope/branches/1_0_X/build-tools/src/main/resources/testdb.sql?rev=1403432&r1=1403431&r2=1403432&view=diff
==============================================================================
--- incubator/syncope/branches/1_0_X/build-tools/src/main/resources/testdb.sql (original)
+++ incubator/syncope/branches/1_0_X/build-tools/src/main/resources/testdb.sql Mon Oct 29 17:18:05 2012
@@ -27,3 +27,13 @@ password VARCHAR(255) NOT NULL,
 status VARCHAR(5));
 
 INSERT INTO test2 VALUES ('testuser2', 'password321', 'false');
+
+-- this table is for issueSYNCOPE230
+DROP TABLE testsync IF EXISTS;
+CREATE TABLE TESTSYNC (
+id NUMBER(10) PRIMARY KEY,
+username VARCHAR(80),
+surname VARCHAR(80),
+email VARCHAR(80));
+
+INSERT INTO testsync VALUES (965, 'issuesyncope230', 'Surname', 'syncope230@syncope.apache.org');

Modified: incubator/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractAttrValue.java
URL: http://svn.apache.org/viewvc/incubator/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractAttrValue.java?rev=1403432&r1=1403431&r2=1403432&view=diff
==============================================================================
--- incubator/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractAttrValue.java (original)
+++ incubator/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/beans/AbstractAttrValue.java Mon Oct 29 17:18:05 2012
@@ -18,6 +18,12 @@
  */
 package org.apache.syncope.core.persistence.beans;
 
+import java.lang.Boolean;
+import java.lang.Double;
+import java.lang.Long;
+import java.lang.String;
+import java.text.DateFormat;
+import java.text.DecimalFormat;
 import java.util.Date;
 import javax.persistence.Basic;
 import javax.persistence.MappedSuperclass;
@@ -27,6 +33,9 @@ import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import org.apache.commons.lang.builder.ReflectionToStringBuilder;
 import org.apache.commons.lang.builder.ToStringStyle;
+import org.apache.commons.lang.time.DateUtils;
+import org.apache.syncope.client.SyncopeConstants;
+import org.apache.syncope.core.persistence.validation.attrvalue.ParsingValidationException;
 import org.apache.syncope.core.persistence.validation.entity.AttrValueCheck;
 
 @MappedSuperclass
@@ -99,16 +108,78 @@ public abstract class AbstractAttrValue 
         this.stringValue = stringValue;
     }
 
+    public <T extends AbstractAttrValue> void parseValue(final AbstractSchema schema, final String value)
+            throws ParsingValidationException {
+
+        Exception exception = null;
+
+        switch (schema.getType()) {
+
+            case Boolean:
+                this.setBooleanValue(Boolean.parseBoolean(value));
+                break;
+
+            case Long:
+                try {
+                    if (schema.getFormatter() == null) {
+                        this.setLongValue(Long.valueOf(value));
+                    } else {
+                        this.setLongValue(Long.valueOf(
+                                ((DecimalFormat) schema.getFormatter()).parse(value).longValue()));
+                    }
+                } catch (Exception pe) {
+                    exception = pe;
+                }
+                break;
+
+            case Double:
+                try {
+                    if (schema.getFormatter() == null) {
+                        this.setDoubleValue(Double.valueOf(value));
+                    } else {
+                        this.setDoubleValue(Double.valueOf(
+                                ((DecimalFormat) schema.getFormatter()).parse(value).doubleValue()));
+                    }
+                } catch (Exception pe) {
+                    exception = pe;
+                }
+                break;
+
+            case Date:
+                try {
+                    if (schema.getFormatter() == null) {
+                        this.setDateValue(DateUtils.parseDate(value, SyncopeConstants.DATE_PATTERNS));
+                    } else {
+                        this.setDateValue(new Date(((DateFormat) schema.getFormatter()).parse(value).getTime()));
+                    }
+                } catch (Exception pe) {
+                    exception = pe;
+                }
+                break;
+
+
+            case String:
+            case Enum:
+            default:
+                this.setStringValue(value);
+        }
+
+        if (exception != null) {
+            throw new ParsingValidationException("While trying to parse '" + value + "' as " + schema.getName(),
+                    exception);
+        }
+    }
+
     public <T> T getValue() {
         return (T) (booleanValue != null
                 ? getBooleanValue()
                 : (dateValue != null
-                        ? getDateValue()
-                        : (doubleValue != null
-                                ? getDoubleValue()
-                                : (longValue != null
-                                        ? getLongValue()
-                                        : stringValue))));
+                ? getDateValue()
+                : (doubleValue != null
+                ? getDoubleValue()
+                : (longValue != null
+                ? getLongValue()
+                : stringValue))));
     }
 
     public String getValueAsString() {

Modified: incubator/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/validation/attrvalue/AbstractValidator.java
URL: http://svn.apache.org/viewvc/incubator/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/validation/attrvalue/AbstractValidator.java?rev=1403432&r1=1403431&r2=1403432&view=diff
==============================================================================
--- incubator/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/validation/attrvalue/AbstractValidator.java (original)
+++ incubator/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/persistence/validation/attrvalue/AbstractValidator.java Mon Oct 29 17:18:05 2012
@@ -19,15 +19,10 @@
 package org.apache.syncope.core.persistence.validation.attrvalue;
 
 import java.io.Serializable;
-import java.text.DateFormat;
-import java.text.DecimalFormat;
-import java.util.Date;
-import org.apache.commons.lang.time.DateUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.syncope.client.SyncopeConstants;
 import org.apache.syncope.core.persistence.beans.AbstractAttrValue;
 import org.apache.syncope.core.persistence.beans.AbstractSchema;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public abstract class AbstractValidator implements Validator, Serializable {
 
@@ -45,75 +40,13 @@ public abstract class AbstractValidator 
     }
 
     @Override
-    public <T extends AbstractAttrValue> void validate(final String value, T attributeValue)
+    public <T extends AbstractAttrValue> void validate(final String value, final T attrValue)
             throws ParsingValidationException, InvalidAttrValueException {
 
-        parseValue(value, attributeValue);
-        doValidate(attributeValue);
-    }
-
-    private <T extends AbstractAttrValue> void parseValue(final String value, final T attributeValue)
-            throws ParsingValidationException {
-
-        Exception exception = null;
-
-        switch (schema.getType()) {
-
-            case String:
-            case Enum:
-                attributeValue.setStringValue(value);
-                break;
-
-            case Boolean:
-                attributeValue.setBooleanValue(Boolean.parseBoolean(value));
-                break;
-
-            case Long:
-                try {
-                    if (schema.getFormatter() == null) {
-                        attributeValue.setLongValue(Long.valueOf(value));
-                    } else {
-                        attributeValue.setLongValue(Long.valueOf(((DecimalFormat) schema.getFormatter()).parse(value)
-                                .longValue()));
-                    }
-                } catch (Exception pe) {
-                    exception = pe;
-                }
-                break;
-
-            case Double:
-                try {
-                    if (schema.getFormatter() == null) {
-                        attributeValue.setDoubleValue(Double.valueOf(value));
-                    } else {
-                        attributeValue.setDoubleValue(Double.valueOf(((DecimalFormat) schema.getFormatter()).parse(
-                                value).doubleValue()));
-                    }
-                } catch (Exception pe) {
-                    exception = pe;
-                }
-                break;
-
-            case Date:
-                try {
-                    if (schema.getFormatter() == null) {
-                        attributeValue.setDateValue(DateUtils.parseDate(value, SyncopeConstants.DATE_PATTERNS));
-                    } else {
-                        attributeValue.setDateValue(new Date(((DateFormat) schema.getFormatter()).parse(value)
-                                .getTime()));
-                    }
-                } catch (Exception pe) {
-                    exception = pe;
-                }
-                break;
-
-            default:
-        }
-
-        if (exception != null) {
-            throw new ParsingValidationException("While trying to parse '" + value + "'", exception);
-        }
+        attrValue.parseValue(schema, value);
+        doValidate(attrValue);
     }
 
-    protected abstract <T extends AbstractAttrValue> void doValidate(T attributeValue) throws InvalidAttrValueException;
+    protected abstract <T extends AbstractAttrValue> void doValidate(T attributeValue)
+            throws InvalidAttrValueException;
 }

Modified: incubator/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/scheduling/SyncJob.java
URL: http://svn.apache.org/viewvc/incubator/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/scheduling/SyncJob.java?rev=1403432&r1=1403431&r2=1403432&view=diff
==============================================================================
--- incubator/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/scheduling/SyncJob.java (original)
+++ incubator/syncope/branches/1_0_X/core/src/main/java/org/apache/syncope/core/scheduling/SyncJob.java Mon Oct 29 17:18:05 2012
@@ -40,10 +40,13 @@ import org.apache.syncope.core.persisten
 import org.apache.syncope.core.persistence.beans.TaskExec;
 import org.apache.syncope.core.persistence.beans.user.SyncopeUser;
 import org.apache.syncope.core.persistence.beans.user.UAttrValue;
+import org.apache.syncope.core.persistence.beans.user.USchema;
 import org.apache.syncope.core.persistence.dao.EntitlementDAO;
 import org.apache.syncope.core.persistence.dao.ResourceDAO;
+import org.apache.syncope.core.persistence.dao.SchemaDAO;
 import org.apache.syncope.core.persistence.dao.UserDAO;
 import org.apache.syncope.core.persistence.dao.UserSearchDAO;
+import org.apache.syncope.core.persistence.validation.attrvalue.ParsingValidationException;
 import org.apache.syncope.core.propagation.ConnectorFacadeProxy;
 import org.apache.syncope.core.propagation.PropagationException;
 import org.apache.syncope.core.propagation.PropagationManager;
@@ -96,6 +99,12 @@ public class SyncJob extends AbstractTas
     private ResourceDAO resourceDAO;
 
     /**
+     * Schema DAO.
+     */
+    @Autowired
+    private SchemaDAO schemaDAO;
+
+    /**
      * User DAO.
      */
     @Autowired
@@ -262,7 +271,19 @@ public class SyncJob extends AbstractTas
 
                 case UserSchema:
                     final UAttrValue value = new UAttrValue();
-                    value.setStringValue(uid);
+
+                    USchema schema = schemaDAO.find(accountIdMap.getIntAttrName(), USchema.class);
+                    if (schema == null) {
+                        value.setStringValue(uid);
+                    } else {
+                        try {
+                            value.parseValue(schema, uid);
+                        } catch (ParsingValidationException e) {
+                            LOG.error("While parsing provided __UID__ {}", uid, e);
+                            value.setStringValue(uid);
+                        }
+                    }
+
                     users = userDAO.findByAttrValue(accountIdMap.getIntAttrName(), value);
                     for (SyncopeUser user : users) {
                         result.add(user.getId());
@@ -290,11 +311,11 @@ public class SyncJob extends AbstractTas
 
     /**
      * Creates user and stores the result in parameter delta (!)
-     * 
+     *
      * @param delta
      * @param dryRun
      * @return
-     * @throws JobExecutionException 
+     * @throws JobExecutionException
      */
     private SyncResult createUser(SyncDelta delta, final boolean dryRun) throws JobExecutionException {
 
@@ -541,7 +562,7 @@ public class SyncJob extends AbstractTas
         // anyway.
         report.append("Users [created/failures]: ").append(created.size()).append('/').append(createdFailed.size())
                 .append(' ').append("[updated/failures]: ").append(updated.size()).append('/').append(
-                        updatedFailed.size()).append(' ').append("[deleted/ failures]: ").append(deleted.size())
+                updatedFailed.size()).append(' ').append("[deleted/ failures]: ").append(deleted.size())
                 .append('/').append(deletedFailed.size());
 
         // Failures
@@ -706,12 +727,12 @@ public class SyncJob extends AbstractTas
         final List<SyncResult> results = new ArrayList<SyncResult>();
 
         LOG.debug("Process '{}' for '{}'", delta.getDeltaType(), delta.getUid().getUidValue());
-        
+
         final List<Long> users = findExistingUsers(delta);
-        
+
         switch (delta.getDeltaType()) {
             case CREATE_OR_UPDATE:
-                if (users.isEmpty()) { 
+                if (users.isEmpty()) {
                     if (syncTask.isPerformCreate()) {
                         results.add(createUser(delta, dryRun));
                     } else {

Modified: incubator/syncope/branches/1_0_X/core/src/main/resources/META-INF/orm.xml
URL: http://svn.apache.org/viewvc/incubator/syncope/branches/1_0_X/core/src/main/resources/META-INF/orm.xml?rev=1403432&r1=1403431&r2=1403432&view=diff
==============================================================================
--- incubator/syncope/branches/1_0_X/core/src/main/resources/META-INF/orm.xml (original)
+++ incubator/syncope/branches/1_0_X/core/src/main/resources/META-INF/orm.xml Mon Oct 29 17:18:05 2012
@@ -211,7 +211,7 @@ under the License.
     <attributes>
       <id name="id">
         <generated-value generator="SEQ_Task" strategy="TABLE"/>
-        <table-generator name="SEQ_Task" pk-column-value="SEQ_Task" initial-value="10"/>
+        <table-generator name="SEQ_Task" pk-column-value="SEQ_Task" initial-value="100"/>
       </id>
     </attributes>
   </entity>

Modified: incubator/syncope/branches/1_0_X/core/src/test/java/org/apache/syncope/core/persistence/dao/TaskTest.java
URL: http://svn.apache.org/viewvc/incubator/syncope/branches/1_0_X/core/src/test/java/org/apache/syncope/core/persistence/dao/TaskTest.java?rev=1403432&r1=1403431&r2=1403432&view=diff
==============================================================================
--- incubator/syncope/branches/1_0_X/core/src/test/java/org/apache/syncope/core/persistence/dao/TaskTest.java (original)
+++ incubator/syncope/branches/1_0_X/core/src/test/java/org/apache/syncope/core/persistence/dao/TaskTest.java Mon Oct 29 17:18:05 2012
@@ -71,7 +71,7 @@ public class TaskTest extends AbstractTe
         assertEquals(1, sclist.size());
 
         List<SyncTask> sylist = taskDAO.findAll(SyncTask.class);
-        assertEquals(3, sylist.size());
+        assertEquals(4, sylist.size());
 
         ExternalResource resource = resourceDAO.find("ws-target-resource-2");
         assertNotNull(resource);

Modified: incubator/syncope/branches/1_0_X/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java
URL: http://svn.apache.org/viewvc/incubator/syncope/branches/1_0_X/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java?rev=1403432&r1=1403431&r2=1403432&view=diff
==============================================================================
--- incubator/syncope/branches/1_0_X/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java (original)
+++ incubator/syncope/branches/1_0_X/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java Mon Oct 29 17:18:05 2012
@@ -43,6 +43,7 @@ import org.apache.syncope.types.Propagat
 import org.apache.syncope.core.scheduling.TestSyncJobActions;
 import org.apache.syncope.types.IntMappingType;
 import org.apache.syncope.types.TraceLevel;
+import org.springframework.jdbc.core.JdbcTemplate;
 
 public class TaskTestITCase extends AbstractTest {
 
@@ -686,4 +687,76 @@ public class TaskTestITCase extends Abst
         assertEquals(2, userTO.getMemberships().size());
         assertEquals(4, userTO.getResources().size());
     }
+
+    @Test
+    public void issueSYNCOPE230() {
+        // 1. read SyncTask for resource-db-sync (table TESTSYNC on external H2)
+        SyncTaskTO task = restTemplate.getForObject(BASE_URL + "task/read/{taskId}", SyncTaskTO.class, 10);
+        assertNotNull(task);
+
+        int preSyncSize = task.getExecutions().size();
+
+        // 2. execute the SyncTask for the first time
+        TaskExecTO execution = restTemplate.postForObject(BASE_URL + "task/execute/{taskId}", null, TaskExecTO.class,
+                task.getId());
+        assertEquals("JOB_FIRED", execution.getStatus());
+
+        int i = 0;
+        final int maxit = 20;
+        do {
+            try {
+                Thread.sleep(1000);
+            } catch (InterruptedException e) {
+            }
+
+            task = restTemplate.getForObject(BASE_URL + "task/read/{taskId}", SyncTaskTO.class, task.getId());
+
+            assertNotNull(task);
+            assertNotNull(task.getExecutions());
+
+            i++;
+        } while (preSyncSize == task.getExecutions().size() && i < maxit);
+        assertEquals(1, task.getExecutions().size());
+
+        // 3. read e-mail address for user created by the SyncTask first execution
+        UserTO userTO = restTemplate.getForObject(
+                BASE_URL + "user/readByUsername/{username}.json", UserTO.class, "issuesyncope230");
+        assertNotNull(userTO);
+        String email = userTO.getAttributeMap().get("email").getValues().iterator().next();
+        assertNotNull(email);
+
+        // 4. update TESTSYNC on external H2 by changing e-mail address
+        JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
+        jdbcTemplate.execute("UPDATE TESTSYNC SET email='updatedSYNCOPE230@syncope.apache.org'");
+
+        // 5. re-execute the SyncTask
+        execution = restTemplate.postForObject(BASE_URL + "task/execute/{taskId}", null, TaskExecTO.class,
+                task.getId());
+        assertEquals("JOB_FIRED", execution.getStatus());
+
+        preSyncSize = task.getExecutions().size();
+        i = 0;
+        do {
+            try {
+                Thread.sleep(1000);
+            } catch (InterruptedException e) {
+            }
+
+            task = restTemplate.getForObject(BASE_URL + "task/read/{taskId}", SyncTaskTO.class, task.getId());
+
+            assertNotNull(task);
+            assertNotNull(task.getExecutions());
+
+            i++;
+        } while (preSyncSize == task.getExecutions().size() && i < maxit);
+        assertEquals(2, task.getExecutions().size());
+
+        // 6. verify that the e-mail was updated
+        userTO = restTemplate.getForObject(
+                BASE_URL + "user/readByUsername/{username}.json", UserTO.class, "issuesyncope230");
+        assertNotNull(userTO);
+        email = userTO.getAttributeMap().get("email").getValues().iterator().next();
+        assertNotNull(email);
+        assertEquals("updatedSYNCOPE230@syncope.apache.org", email);
+    }
 }

Modified: incubator/syncope/branches/1_0_X/core/src/test/resources/content.xml
URL: http://svn.apache.org/viewvc/incubator/syncope/branches/1_0_X/core/src/test/resources/content.xml?rev=1403432&r1=1403431&r2=1403432&view=diff
==============================================================================
--- incubator/syncope/branches/1_0_X/core/src/test/resources/content.xml (original)
+++ incubator/syncope/branches/1_0_X/core/src/test/resources/content.xml Mon Oct 29 17:18:05 2012
@@ -318,7 +318,19 @@ under the License.
                 xmlConfiguration="%3Cset%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3Euser%3C/name%3E%0A++++++%3Ctype%3Ejava.lang.String%3C/type%3E%0A++++++%3Crequired%3Efalse%3C/required%3E%0A++++%3C/schema%3E%0A%0A%3Cvalues%3E%0A%3Cjava.lang.String%3Esa%3C/java.lang.String%3E%0A%3C/values%3E%0A%0A++++%3Coverridable%3Efalse%3C/overridable%3E%0A++%3C/org.apache.syncope.types.ConnConfProperty%3E%0A%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EenabledStatusValue%3C/name%3E%0A++++++%3Ctype%3Ejava.lang.String%3C/type%3E%0A++++++%3Crequired%3Efalse%3C/required%3E%0A++++%3C/schema%3E%0A%0A%3Cvalues%3E%0A%3Cjava.lang.String%3Etrue%3C/java.lang.String%3E%0A%3C/values%3E%0A%0A++++%3Coverridable%3Efalse%3C/overridable%3E%0A++%3C/org.apache.syncope.types.ConnConfProperty%3E%0A%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EstatusColumn%3C/name%3E%0A++++++
 %3Ctype%3Ejava.lang.String%3C/type%3E%0A++++++%3Crequired%3Efalse%3C/required%3E%0A++++%3C/schema%3E%0A%0A%3Cvalues%3E%0A%3Cjava.lang.String%3Estatus%3C/java.lang.String%3E%0A%3C/values%3E%0A%0A++++%3Coverridable%3Efalse%3C/overridable%3E%0A++%3C/org.apache.syncope.types.ConnConfProperty%3E%0A%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EdisabledStatusValue%3C/name%3E%0A++++++%3Ctype%3Ejava.lang.String%3C/type%3E%0A++++++%3Crequired%3Efalse%3C/required%3E%0A++++%3C/schema%3E%0A%0A%3Cvalues%3E%0A%3Cjava.lang.String%3Efalse%3C/java.lang.String%3E%0A%3C/values%3E%0A%0A++++%3Coverridable%3Efalse%3C/overridable%3E%0A++%3C/org.apache.syncope.types.ConnConfProperty%3E%0A%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EkeyColumn%3C/name%3E%0A++++++%3Ctype%3Ejava.lang.String%3C/type%3E%0A++++++%3Crequired%3Etrue%3C/required%3E%0A++++%3C/schema%3E%0A%0A%3Cvalues%3E%0A%3Cjava.lang.String%3Eid%3C/java.l
 ang.String%3E%0A%3C/values%3E%0A%0A++++%3Coverridable%3Efalse%3C/overridable%3E%0A++%3C/org.apache.syncope.types.ConnConfProperty%3E%0A%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EjdbcUrlTemplate%3C/name%3E%0A++++++%3Ctype%3Ejava.lang.String%3C/type%3E%0A++++++%3Crequired%3Efalse%3C/required%3E%0A++++%3C/schema%3E%0A%0A%3Cvalues%3E%0A%3Cjava.lang.String%3Ejdbc%3Ah2%3Atcp%3A//localhost%3A9092/testdb%3C/java.lang.String%3E%0A%3C/values%3E%0A%0A++++%3Coverridable%3Efalse%3C/overridable%3E%0A++%3C/org.apache.syncope.types.ConnConfProperty%3E%0A%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EpasswordColumn%3C/name%3E%0A++++++%3Ctype%3Ejava.lang.String%3C/type%3E%0A++++++%3Crequired%3Efalse%3C/required%3E%0A++++%3C/schema%3E%0A%0A%3Cvalues%3E%0A%3Cjava.lang.String%3Epassword%3C/java.lang.String%3E%0A%3C/values%3E%0A%0A++++%3Coverridable%3Efalse%3C/overridable%3E%0A++%3C/org.apache.syncope.types.
 ConnConfProperty%3E%0A%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EdefaultStatusValue%3C/name%3E%0A++++++%3Ctype%3Ejava.lang.String%3C/type%3E%0A++++++%3Crequired%3Efalse%3C/required%3E%0A++++%3C/schema%3E%0A%0A%3Cvalues%3E%0A%3Cjava.lang.String%3Etrue%3C/java.lang.String%3E%0A%3C/values%3E%0A%0A++++%3Coverridable%3Efalse%3C/overridable%3E%0A++%3C/org.apache.syncope.types.ConnConfProperty%3E%0A%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3Etable%3C/name%3E%0A++++++%3Ctype%3Ejava.lang.String%3C/type%3E%0A++++++%3Crequired%3Etrue%3C/required%3E%0A++++%3C/schema%3E%0A%0A%3Cvalues%3E%0A%3Cjava.lang.String%3Etest2%3C/java.lang.String%3E%0A%3C/values%3E%0A%0A++++%3Coverridable%3Efalse%3C/overridable%3E%0A++%3C/org.apache.syncope.types.ConnConfProperty%3E%0A%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3Epassword%3C/name%3E%0A++++++%3Ctype%3Eorg.identity
 connectors.common.security.GuardedString%3C/type%3E%0A++++++%3Crequired%3Efalse%3C/required%3E%0A++++%3C/schema%3E%0A%0A%3Cvalues%3E%0A%3Cjava.lang.String%3Esa%3C/java.lang.String%3E%0A%3C/values%3E%0A%0A++++%3Coverridable%3Efalse%3C/overridable%3E%0A++%3C/org.apache.syncope.types.ConnConfProperty%3E%0A%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EjdbcDriver%3C/name%3E%0A++++++%3Ctype%3Ejava.lang.String%3C/type%3E%0A++++++%3Crequired%3Efalse%3C/required%3E%0A++++%3C/schema%3E%0A%0A%3Cvalues%3E%0A%3Cjava.lang.String%3Eorg.h2.Driver%3C/java.lang.String%3E%0A%3C/values%3E%0A%0A++++%3Coverridable%3Efalse%3C/overridable%3E%0A++%3C/org.apache.syncope.types.ConnConfProperty%3E%0A%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EcipherAlgorithm%3C/name%3E%0A++++++%3Ctype%3Ejava.lang.String%3C/type%3E%0A++++++%3Crequired%3Etrue%3C/required%3E%0A++++%3C/schema%3E%0A%0A%3Cvalues%3E%0A%3Cjava.lang.String
 %3EMD5%3C/java.lang.String%3E%0A%3C/values%3E%0A%0A++++%3Coverridable%3Efalse%3C/overridable%3E%0A++%3C/org.apache.syncope.types.ConnConfProperty%3E%0A%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EretrievePassword%3C/name%3E%0A++++++%3Ctype%3Ejava.lang.Boolean%3C/type%3E%0A++++++%3Crequired%3Efalse%3C/required%3E%0A++++%3C/schema%3E%0A%0A%3Cvalues%3E%0A%3Cjava.lang.String%3Etrue%3C/java.lang.String%3E%0A%3C/values%3E%0A%0A++++%3Coverridable%3Efalse%3C/overridable%3E%0A++%3C/org.apache.syncope.types.ConnConfProperty%3E%0A%3C/set%3E%0A"/>
   <ConnInstance_capabilities ConnInstance_id="106" capabilities="SEARCH"/>
   <ConnInstance_capabilities ConnInstance_id="106" capabilities="SYNC"/>
-    
+  
+  <ConnInstance id="107" bundleName="org.connid.bundles.db.table" 
+                connectorName="org.connid.bundles.db.table.DatabaseTableConnector" 
+                displayName="H2-testsync" version="${connid.db.table.version}"
+                xmlConfiguration="%3Cset%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3Edatasource%3C%2Fname%3E%0A++++++%3CdisplayName%3EDatasource+Path%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BJDBC+Data+Source+Name%2FPath%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BEnter+the+JDBC+Data+Source+Name%2FPath+to+connect+to+the+Oracle+server.+If+specified%2C+connector+will+only+try+to+connect+using+Datasource+and+ignore+other+resource+parameters+specified.%26lt%3Bbr%26gt%3Bthe+example+value+is%3A+%26lt%3BCODE%26gt%3Bjdbc%2FSampleDataSourceName%26lt%3B%2FCODE%26gt%3B%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E22%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%2F%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.ap
 ache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EjdbcDriver%3C%2Fname%3E%0A++++++%3CdisplayName%3EJDBC+Driver%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BJDBC+Driver%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BSpecify+the+JDBC+Driver+class+name.+Oracle+is+oracle.jdbc.driver.OracleDriver.+MySQL+is+org.gjt.mm.mysql.Driver.%26lt%3Bbr%26gt%3BCould+be+empty+if+datasource+is+provided.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E14%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%3E%0A++++++%3Cstring%3Eorg.h2.Driver%3C%2Fstring%3E%0A++++%3C%2Fvalues%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EvalidConnectionQuery%3C%2Fname%3E%0A++++++%3CdisplayName%3EVal
 idate+Connection+Query%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BValidate+Connection+Query%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BThere+can+be+specified+the+check+connection+alive+query.+If+empty%2C+default+implementation+will+test+it+using+the+switch+on%2Foff+the+autocommit.+Some+select+1+from+dummy+table+could+be+more+efficient.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E20%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%2F%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EenabledStatusValue%3C%2Fname%3E%0A++++++%3CdisplayName%3EEnabled+Status+Value%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BEnabled+Status+Value%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BE
 nter+the+value+for+enabled+status.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E12%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%2F%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EpwdEncodeToUpperCase%3C%2Fname%3E%0A++++++%3CdisplayName%3EForce+password+encoding+to+upper+case%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3EForce+password+encoding+to+upper+case.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Eboolean%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E25%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%3E%0A++++++%3Cstring%3Efalse%3C%2Fstring%3E%0A++++%3C%2Fvalues%3E%0A++++%3Coverridable%3Efalse%3C%2Fove
 rridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3ErethrowAllSQLExceptions%3C%2Fname%3E%0A++++++%3CdisplayName%3ERethrow+all+SQLExceptions%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3EIf+this+is+not+checked%2C+SQL+statements+which+throw+SQLExceptions+with+a+0+ErrorCode+will+be+have+the+exception+caught+and+suppressed.+Check+it+to+have+exceptions+with+0+ErrorCodes+rethrown.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Eboolean%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E17%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%3E%0A++++++%3Cstring%3Efalse%3C%2Fstring%3E%0A++++%3C%2Fvalues%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EchangeLogColumn%3C
 %2Fname%3E%0A++++++%3CdisplayName%3EChange+Log+Column+%28Sync%29%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%3D%26lt%3Bb%26gt%3BChange+Log+Column%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BThe+change+log+column+store+the+latest+change+time.+Providing+this+value+the+Sync+capabilities+are+activated.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E21%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%2F%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EenableEmptyString%3C%2Fname%3E%0A++++++%3CdisplayName%3EEnable+writing+empty+string%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BEnable+writing+empty+string%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BSelect+to+enable+support+for+writing+an+empt
 y+strings%2C+instead+of+a+NULL+value%2C+in+character+based+columns+defined+as+not-null+in+the+table+schema.+This+option+does+not+influence+the+way+strings+are+written+for+Oracle+based+tables.+By+default+empty+strings+are+written+as+a+NULL+value.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Eboolean%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E16%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%3E%0A++++++%3Cstring%3Efalse%3C%2Fstring%3E%0A++++%3C%2Fvalues%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EallNative%3C%2Fname%3E%0A++++++%3CdisplayName%3EAll+native%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BAll+native%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BSelect+to+retrieve+all+data+type+of+the+columns+in+a+native+format+from+the+database
 +table.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Eboolean%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E19%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%3E%0A++++++%3Cstring%3Efalse%3C%2Fstring%3E%0A++++%3C%2Fvalues%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3Edatabase%3C%2Fname%3E%0A++++++%3CdisplayName%3EDatabase%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BDatabase%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BEnter+the+name+of+the+database+on+the+database+server+that+contains+the+table.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E6%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%2F%3E%0A+
 +++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EdisabledStatusValue%3C%2Fname%3E%0A++++++%3CdisplayName%3EDisabled+Status+Value%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BDisabled+Status+Value%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BEnter+the+value+for+disabled+status.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E11%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%2F%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EpasswordColumn%3C%2Fname%3E%0A++++++%3CdisplayName%3EPassword+Column%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3B
 b%26gt%3BPassword+Column%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BEnter+the+name+of+the+column+in+the+table+that+will+hold+the+password+values.+If+empty%2C+no+validation+on+resource+and+passwords+are+activated.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E9%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%2F%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EjdbcUrlTemplate%3C%2Fname%3E%0A++++++%3CdisplayName%3EJDBC+Connection+URL%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BJDBC+Connection+URL%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BSpecify+the+JDBC+Driver+Connection+URL.%26lt%3Bbr%26gt%3B+Oracle+template+is+jdbc%3Aoracle%3Athin%3A%40%5Bhost%5D%3A%5Bport%281521%29%5D%3A%5BDB%5D.%26
 lt%3Bbr%26gt%3B++MySQL+template+is+jdbc%3Amysql%3A%2F%2F%5Bhost%5D%3A%5Bport%283306%29%5D%2F%5Bdb%5D%2C+for+more+info%2C+read+the+JDBC+driver+documentation.%26lt%3Bbr%26gt%3BCould+be+empty+if+datasource+is+provided.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E15%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%3E%0A++++++%3Cstring%3Ejdbc%3Ah2%3Atcp%3A%2F%2Flocalhost%3A9092%2Ftestdb%3C%2Fstring%3E%0A++++%3C%2Fvalues%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3Eport%3C%2Fname%3E%0A++++++%3CdisplayName%3EPort%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BTCP+Port%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BEnter+the+port+number+the+database+server+is+listening+on.%3C%2FhelpMessag
 e%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E3%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%2F%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EkeyColumn%3C%2Fname%3E%0A++++++%3CdisplayName%3EKey+Column%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BKey+Column%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BThis+mandatory+column+value+will+be+used+as+the+unique+identifier+for+rows+in+the+table.%26lt%3Bbr%26gt%3B%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Etrue%3C%2Frequired%3E%0A++++++%3Corder%3E8%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%3E%0A++++++%3Cstring%3Eid%3C%2Fstring%3E%0A++++%3C%2
 Fvalues%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EnativeTimestamps%3C%2Fname%3E%0A++++++%3CdisplayName%3ENative+Timestamps+%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BNative+Timestamps%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BSelect+to+retrieve+Timestamp+data+type+of+the+columns+in+java.sql.Timestamp+format+from+the+database+table.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Eboolean%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E18%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%3E%0A++++++%3Cstring%3Efalse%3C%2Fstring%3E%0A++++%3C%2Fvalues%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cnam
 e%3EstatusColumn%3C%2Fname%3E%0A++++++%3CdisplayName%3EStatus+Column%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BStatus+Column%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BEnter+the+name+of+the+column+in+the+table+that+will+hold+the+status+values.+If+empty+enabled+and+disabled+operation+wont+be+performed.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E10%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%2F%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3Euser%3C%2Fname%3E%0A++++++%3CdisplayName%3EUser%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BUser%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BEnter+the+name+of+the+mandatory+Database+user+with+permission+to+account+table.%3
 C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E4%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%3E%0A++++++%3Cstring%3Esa%3C%2Fstring%3E%0A++++%3C%2Fvalues%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3Epassword%3C%2Fname%3E%0A++++++%3CdisplayName%3EUser+Password%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BUser+Password%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BEnter+a+user+account+that+has+permission+to+access+accounts+table.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Eorg.identityconnectors.common.security.GuardedString%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E5%3C%2Forder%3E%0A++++++%3Cconfidential%3Etrue%3C%2Fconfidential%3E%0A++++%3C%2Fschema
 %3E%0A++++%3Cvalues%3E%0A++++++%3Cstring%3Esa%3C%2Fstring%3E%0A++++%3C%2Fvalues%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3Equoting%3C%2Fname%3E%0A++++++%3CdisplayName%3EName+Quoting%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BName+Quoting%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BSelect+whether+database+column+names+for+this+resource+should+be+quoted%2C+and+the+quoting+characters.+By+default%2C+database+column+names+are+not+quoted+%28None%29.+For+other+selections+%28Single%2C+Double%2C+Back%2C+or+Brackets%29%2C+column+names+will+appear+between+single+quotes%2C+double+quotes%2C+back+quotes%2C+or+brackets+in+the+SQL+generated+to+access+the+database.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E1%3C%2Forder%3E%0A++++++%3Cconfiden
 tial%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%2F%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EcipherAlgorithm%3C%2Fname%3E%0A++++++%3CdisplayName%3EPassword+cipher+algorithm+%28defaults+to+CLEARTEXT%29%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3ECipher+algorithm+used+to+encode+password+before+to+store+it+onto+the+database+table.%0ASpecify+one+of+the+values+among+CLEARTEXT%2CAES%2C+MD5%2C+SHA1%2C+SHA256+or+a+custom+implementation+identified+by+its+class+name.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E24%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%2F%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3
 E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EpwdEncodeToLowerCase%3C%2Fname%3E%0A++++++%3CdisplayName%3EForce+password+encoding+to+lower+case%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3EForce+password+encoding+to+lower+case.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Eboolean%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E26%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%3E%0A++++++%3Cstring%3Efalse%3C%2Fstring%3E%0A++++%3C%2Fvalues%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EcipherKey%3C%2Fname%3E%0A++++++%3CdisplayName%3EPassword+cipher+key%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3ESpecify+key+in+case+of+reversible+algorithm.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0
 A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E25%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%2F%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EdefaultStatusValue%3C%2Fname%3E%0A++++++%3CdisplayName%3EDefault+Status+Value%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BDefault+Status+Value%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BEnter+the+value+for+status+in+case+of+status+not+specified.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E13%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%2F%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.
 apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3Etable%3C%2Fname%3E%0A++++++%3CdisplayName%3ETable%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BTable%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BEnter+the+name+of+the+table+in+the+database+that+contains+the+accounts.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Etrue%3C%2Frequired%3E%0A++++++%3Corder%3E7%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%3E%0A++++++%3Cstring%3Etestsync%3C%2Fstring%3E%0A++++%3C%2Fvalues%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EjndiProperties%3C%2Fname%3E%0A++++++%3CdisplayName%3EInitial+JNDI+Properties%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BInitial+JNDI+Properties%26lt%3B%2Fb%26gt%3B%2
 6lt%3Bbr%26gt%3BCould+be+empty+or+enter+the+JDBC+JNDI+Initial+context+factory%2C+context+provider+in+a+format%3A+key+%3D+value.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3E%5BLjava.lang.String%3B%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E23%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%2F%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EretrievePassword%3C%2Fname%3E%0A++++++%3CdisplayName%3ERetrieve+password%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3ESpecify+if+password+must+be+retrieved+by+default.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Eboolean%3C%2Ftype%3E%0A++++++%3Crequired%3Etrue%3C%2Frequired%3E%0A++++++%3Corder%3E27%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%3E%0A++++++%3Cstr
 ing%3Efalse%3C%2Fstring%3E%0A++++%3C%2Fvalues%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3Ehost%3C%2Fname%3E%0A++++++%3CdisplayName%3EHost%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%26gt%3BHost%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BEnter+the+name+of+the+host+where+the+database+is+running.%3C%2FhelpMessage%3E%0A++++++%3Ctype%3Ejava.lang.String%3C%2Ftype%3E%0A++++++%3Crequired%3Efalse%3C%2Frequired%3E%0A++++++%3Corder%3E2%3C%2Forder%3E%0A++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%2F%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.types.ConnConfProperty%3E%0A%3C%2Fset%3E"/>
+  <ConnInstance_capabilities ConnInstance_id="107" capabilities="ONE_PHASE_UPDATE"/>
+  <ConnInstance_capabilities ConnInstance_id="107" capabilities="ONE_PHASE_DELETE"/>
+  <ConnInstance_capabilities ConnInstance_id="107" capabilities="TWO_PHASES_CREATE"/>
+  <ConnInstance_capabilities ConnInstance_id="107" capabilities="SEARCH"/>
+  <ConnInstance_capabilities ConnInstance_id="107" capabilities="TWO_PHASES_DELETE"/>
+  <ConnInstance_capabilities ConnInstance_id="107" capabilities="ONE_PHASE_CREATE"/>
+  <ConnInstance_capabilities ConnInstance_id="107" capabilities="TWO_PHASES_UPDATE"/>
+
   <ExternalResource name="ws-target-resource-1" connector_id="100" forceMandatoryConstraint="0" propagationMode="TWO_PHASES"
                     propagationPriority="0" propagationPrimary="1" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"/>
   <ExternalResource name="ws-target-resource-2" connector_id="100" forceMandatoryConstraint="1" propagationMode="TWO_PHASES"
@@ -353,6 +365,12 @@ under the License.
   <ExternalResource name="ws-target-resource-nopropagation4" connector_id="103" forceMandatoryConstraint="1" propagationMode="TWO_PHASES"
                     propagationPriority="0" propagationPrimary="0" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL" />
                     
+  <!-- External resource for issue SYNCOPE-230 -->
+  <ExternalResource name="resource-db-sync" connector_id="107"
+                    createTraceLevel="ALL" deleteTraceLevel="ALL" syncTraceLevel="ALL" updateTraceLevel="ALL"
+                    forceMandatoryConstraint="0" 
+                    propagationMode="TWO_PHASES" propagationPrimary="0" propagationPriority="0"/>
+  
   <SyncopeUser_ExternalResource user_id="3" resource_name="ws-target-resource-delete" />
   <SyncopeRole_ExternalResource role_id="3" resource_name="ws-target-resource-list-mappings-1" />
   <SyncopeUser_ExternalResource user_id="3" resource_name="ws-target-resource-2" />
@@ -554,6 +572,19 @@ under the License.
                  extAttrName="postalAddress" intAttrName="postalAddress" intMappingType="MembershipSchema"
                  mandatoryCondition="false" resource_name="resource-ldap"/>
                    
+  <SchemaMapping id="321" accountid="0" extAttrName="EMAIL" intAttrName="email" intMappingType="UserSchema" 
+                 mandatoryCondition="false" password="0" resource_name="resource-db-sync"/>
+  <SchemaMapping id="322" accountid="0" extAttrName="SURNAME" intAttrName="fullname" intMappingType="UserSchema" 
+                 mandatoryCondition="false" password="0" resource_name="resource-db-sync"/>
+  <SchemaMapping id="323" accountid="1" intAttrName="aLong" intMappingType="UserSchema" 
+                 mandatoryCondition="false" password="0" resource_name="resource-db-sync"/>
+  <SchemaMapping id="324" accountid="0" extAttrName="SURNAME" intAttrName="surname" intMappingType="UserSchema" 
+                 mandatoryCondition="false" password="0" resource_name="resource-db-sync"/>
+  <SchemaMapping id="325" accountid="0" extAttrName="USERNAME" intAttrName="Username" intMappingType="Username" 
+                 mandatoryCondition="false" password="0" resource_name="resource-db-sync"/>
+  <SchemaMapping id="326" accountid="0" extAttrName="EMAIL" intAttrName="userId" intMappingType="UserSchema" 
+                 mandatoryCondition="false" password="0" resource_name="resource-db-sync"/>
+  
   <Task DTYPE="PropagationTask" id="1" propagationMode="TWO_PHASES" propagationOperation="UPDATE"
         resource_name="ws-target-resource-2" syncopeUser_id="1"
         xmlAttributes="%3Cset%3E%0A++%3Corg.identityconnectors.framework.common.objects.Name%3E%0A++++%3Cname%3E__NAME__%3C%2Fname%3E%0A++++%3Cvalue+class%3D%22java.util.Collections%24UnmodifiableRandomAccessList%22+resolves-to%3D%22java.util.Collections%24UnmodifiableList%22%3E%0A++++++%3Cc+class%3D%22list%22%3E%0A++++++++%3Cstring%3EuserId%3C%2Fstring%3E%0A++++++%3C%2Fc%3E%0A++++++%3Clist+reference%3D%22..%2Fc%22%2F%3E%0A++++%3C%2Fvalue%3E%0A++%3C%2Forg.identityconnectors.framework.common.objects.Name%3E%0A++%3Corg.identityconnectors.framework.common.objects.Attribute%3E%0A++++%3Cname%3E__PASSWORD__%3C%2Fname%3E%0A++++%3Cvalue+class%3D%22java.util.Collections%24UnmodifiableRandomAccessList%22+resolves-to%3D%22java.util.Collections%24UnmodifiableList%22%3E%0A++++++%3Cc+class%3D%22list%22%3E%0A++++++++%3Corg.identityconnectors.common.security.GuardedString%3E%0A++++++++++%3C__readOnly%3Efalse%3C%2F__readOnly%3E%0A++++++++++%3C__disposed%3Efalse%3C%2F__disposed%3E%0A+++++++++
 +%3C__encryptedBytes%3EQTOgwEhIHqtAI%2FYlgDhYc37esEF8VLDMU2IY1ciltrg%3D%3C%2F__encryptedBytes%3E%0A++++++++++%3C__base64SHA1Hash%3EW5%2FrwtdCnI8gAnIUhKcahMEnMMc%3D%3C%2F__base64SHA1Hash%3E%0A++++++++%3C%2Forg.identityconnectors.common.security.GuardedString%3E%0A++++++%3C%2Fc%3E%0A++++++%3Clist+reference%3D%22..%2Fc%22%2F%3E%0A++++%3C%2Fvalue%3E%0A++%3C%2Forg.identityconnectors.framework.common.objects.Attribute%3E%0A++%3Corg.identityconnectors.framework.common.objects.Attribute%3E%0A++++%3Cname%3Etype%3C%2Fname%3E%0A++++%3Cvalue+class%3D%22java.util.Collections%24UnmodifiableRandomAccessList%22+resolves-to%3D%22java.util.Collections%24UnmodifiableList%22%3E%0A++++++%3Cc+class%3D%22list%22%3E%0A++++++++%3Cstring%3Etype%3C%2Fstring%3E%0A++++++%3C%2Fc%3E%0A++++++%3Clist+reference%3D%22..%2Fc%22%2F%3E%0A++++%3C%2Fvalue%3E%0A++%3C%2Forg.identityconnectors.framework.common.objects.Attribute%3E%0A++%3Corg.identityconnectors.framework.common.objects.Attribute%3E%0A++++%3Cname%3Eful
 lname%3C%2Fname%3E%0A++++%3Cvalue+class%3D%22java.util.Collections%24UnmodifiableRandomAccessList%22+resolves-to%3D%22java.util.Collections%24UnmodifiableList%22%3E%0A++++++%3Cc+class%3D%22list%22%3E%0A++++++++%3Cstring%3Efullname%3C%2Fstring%3E%0A++++++%3C%2Fc%3E%0A++++++%3Clist+reference%3D%22..%2Fc%22%2F%3E%0A++++%3C%2Fvalue%3E%0A++%3C%2Forg.identityconnectors.framework.common.objects.Attribute%3E%0A%3C%2Fset%3E%0A"/>
@@ -579,6 +610,9 @@ under the License.
   <Task DTYPE="SyncTask" id="9" resource_name="resource-testdb2"
         performCreate="1" performUpdate="1" performDelete="0" syncStatus="1" fullReconciliation="1"
         jobClassName="org.apache.syncope.core.scheduling.SyncJob"/>
+  <Task DTYPE="SyncTask" id="10" resource_name="resource-db-sync"
+        fullReconciliation="1" performCreate="1" performDelete="1" performUpdate="1" syncStatus="0"
+        jobClassName="org.apache.syncope.core.scheduling.SyncJob"/>
         
   <NotificationTask_recipients notificationtask_id="8" address="recipient@prova.org"/>