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"/>