You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by fm...@apache.org on 2013/02/13 19:41:32 UTC

svn commit: r1445825 - in /syncope/trunk: ./ core/src/main/java/org/apache/syncope/core/connid/ core/src/main/java/org/apache/syncope/core/propagation/impl/ core/src/test/java/org/apache/syncope/core/persistence/dao/ core/src/test/java/org/apache/synco...

Author: fmartelli
Date: Wed Feb 13 18:41:32 2013
New Revision: 1445825

URL: http://svn.apache.org/r1445825
Log:
SYNCOPE-307 merged from the branch 1_0_X

Modified:
    syncope/trunk/   (props changed)
    syncope/trunk/core/src/main/java/org/apache/syncope/core/connid/ConnObjectUtil.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/PropagationManager.java
    syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/dao/TaskTest.java
    syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java
    syncope/trunk/core/src/test/resources/content.xml

Propchange: syncope/trunk/
------------------------------------------------------------------------------
  Merged /syncope/branches/1_0_X:r1445544-1445754

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/connid/ConnObjectUtil.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/connid/ConnObjectUtil.java?rev=1445825&r1=1445824&r2=1445825&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/connid/ConnObjectUtil.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/connid/ConnObjectUtil.java Wed Feb 13 18:41:32 2013
@@ -474,59 +474,77 @@ public class ConnObjectUtil {
         final ConfigurableApplicationContext context = ApplicationContextProvider.getApplicationContext();
         final ConnectorFactory connInstanceLoader = context.getBean(ConnectorFactory.class);
 
-        final IntMappingType type = owner instanceof SyncopeUser
-                ? IntMappingType.UserVirtualSchema : IntMappingType.RoleVirtualSchema;
+        final IntMappingType type = attrUtil.getType() == AttributableType.USER
+                ? IntMappingType.UserVirtualSchema : attrUtil.getType() == AttributableType.ROLE
+                ? IntMappingType.RoleVirtualSchema : IntMappingType.MembershipVirtualSchema;
 
         final Map<String, ConnectorObject> externalResources = new HashMap<String, ConnectorObject>();
 
         // -----------------------
-        // Retrieve virtual attribute values
+        // Retrieve virtual attribute values if and only if they have not been retrieved yet
         // -----------------------
         for (AbstractVirAttr virAttr : owner.getVirtualAttributes()) {
-            final String schemaName = virAttr.getVirtualSchema().getName();
-            final List<String> values = virAttrCache.get(attrUtil.getType(), owner.getId(), schemaName);
-
-            LOG.debug("Retrieve values for virtual attribute {}", schemaName);
+            // reset value set
+            if (virAttr.getValues().isEmpty()) {
+                retrieveVirAttrValue(owner, virAttr, attrUtil, type, externalResources, connInstanceLoader);
+            }
+        }
+        // -----------------------
+    }
 
-            if (values == null) {
-                // non cached ...
-                LOG.debug("Need one or more remote connections");
-                for (ExternalResource resource : getTargetResource(virAttr, type, attrUtil)) {
-                    LOG.debug("Seach values into {}", resource.getName());
-                    try {
-                        final ConnectorObject connectorObject;
-
-                        if (externalResources.containsKey(resource.getName())) {
-                            connectorObject = externalResources.get(resource.getName());
-                        } else {
-                            LOG.debug("Perform connection to {}", resource.getName());
-                            final String accountId = attrUtil.getAccountIdItem(resource) == null
-                                    ? null
-                                    : MappingUtil.getAccountIdValue(
-                                    owner, resource, attrUtil.getAccountIdItem(resource));
+    private void retrieveVirAttrValue(
+            final AbstractAttributable owner,
+            final AbstractVirAttr virAttr,
+            final AttributableUtil attrUtil,
+            final IntMappingType type,
+            final Map<String, ConnectorObject> externalResources,
+            final ConnectorFactory connInstanceLoader) {
+
+        final String schemaName = virAttr.getVirtualSchema().getName();
+        final List<String> values = virAttrCache.get(attrUtil.getType(), owner.getId(), schemaName);
+
+        LOG.debug("Retrieve values for virtual attribute {} ({})", schemaName, type);
+
+        if (values == null) {
+            // non cached ...
+            LOG.debug("Need one or more remote connections");
+            for (ExternalResource resource : getTargetResource(virAttr, type, attrUtil)) {
+                LOG.debug("Seach values into {}", resource.getName());
+                try {
+                    final ConnectorObject connectorObject;
+
+                    if (externalResources.containsKey(resource.getName())) {
+                        connectorObject = externalResources.get(resource.getName());
+                    } else {
+                        LOG.debug("Perform connection to {}", resource.getName());
+                        final String accountId = attrUtil.getAccountIdItem(resource) == null
+                                ? null
+                                : MappingUtil.getAccountIdValue(
+                                owner, resource, attrUtil.getAccountIdItem(resource));
 
-                            if (StringUtils.isBlank(accountId)) {
-                                throw new IllegalArgumentException("No AccountId found for " + resource.getName());
-                            }
+                        if (StringUtils.isBlank(accountId)) {
+                            throw new IllegalArgumentException("No AccountId found for " + resource.getName());
+                        }
 
-                            final Set<String> extAttrNames = new HashSet<String>();
+                        final Set<String> extAttrNames = new HashSet<String>();
 
-                            // retrieve all mapped virtual attribute values
-                            for (AbstractMappingItem item :
-                                    MappingUtil.getMatchingMappingItems(attrUtil.getMappingItems(resource), type)) {
-                                extAttrNames.add(item.getExtAttrName());
-                            }
+                        // retrieve all mapped virtual attribute values
+                        for (AbstractMappingItem item :
+                                MappingUtil.getMatchingMappingItems(attrUtil.getMappingItems(resource), type)) {
+                            extAttrNames.add(item.getExtAttrName());
+                        }
 
-                            LOG.debug("External attribute ({}) names to get '{}'", type, extAttrNames);
+                        LOG.debug("External attribute ({}) names to get '{}'", type, extAttrNames);
 
-                            final OperationOptionsBuilder oob = new OperationOptionsBuilder();
-                            oob.setAttributesToGet(extAttrNames);
+                        final OperationOptionsBuilder oob = new OperationOptionsBuilder();
+                        oob.setAttributesToGet(extAttrNames);
 
-                            final SyncopeConnector connector = connInstanceLoader.getConnector(resource);
-                            connectorObject = connector.getObject(ObjectClass.ACCOUNT, new Uid(accountId), oob.build());
-                            externalResources.put(resource.getName(), connectorObject);
-                        }
+                        final SyncopeConnector connector = connInstanceLoader.getConnector(resource);
+                        connectorObject = connector.getObject(fromAttributable(owner), new Uid(accountId), oob.build());
+                        externalResources.put(resource.getName(), connectorObject);
+                    }
 
+                    if (connectorObject != null) {
                         // ask for searched virtual attribute value
                         final List<AbstractMappingItem> mappings = MappingUtil.getMatchingMappingItems(
                                 attrUtil.getMappingItems(resource), schemaName, type);
@@ -543,21 +561,20 @@ public class ConnObjectUtil {
                                 }
                             }
                         }
-
-                        LOG.debug("Retrieved values {}", virAttr.getValues());
-                    } catch (Exception e) {
-                        LOG.error("Error reading connector object from {}", resource.getName(), e);
                     }
+                    
+                    LOG.debug("Retrieved values {}", virAttr.getValues());
+                } catch (Exception e) {
+                    LOG.error("Error reading connector object from {}", resource.getName(), e);
                 }
-
-                virAttrCache.put(attrUtil.getType(), owner.getId(), schemaName, virAttr.getValues());
-            } else {
-                // cached ...
-                LOG.debug("Values found in cache {}", values);
-                virAttr.setValues(values);
             }
+
+            virAttrCache.put(attrUtil.getType(), owner.getId(), schemaName, virAttr.getValues());
+        } else {
+            // cached ...
+            LOG.debug("Values found in cache {}", values);
+            virAttr.setValues(values);
         }
-        // -----------------------
     }
 
     private Set<ExternalResource> getTargetResource(

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/PropagationManager.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/PropagationManager.java?rev=1445825&r1=1445824&r2=1445825&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/PropagationManager.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/PropagationManager.java Wed Feb 13 18:41:32 2013
@@ -35,6 +35,7 @@ import org.apache.syncope.core.connid.Co
 import org.apache.syncope.core.connid.PasswordGenerator;
 import org.apache.syncope.core.persistence.beans.AbstractAttributable;
 import org.apache.syncope.core.persistence.beans.AbstractMappingItem;
+import org.apache.syncope.core.persistence.beans.AbstractVirAttr;
 import org.apache.syncope.core.persistence.beans.ExternalResource;
 import org.apache.syncope.core.persistence.beans.PropagationTask;
 import org.apache.syncope.core.persistence.beans.role.SyncopeRole;
@@ -523,16 +524,20 @@ public class PropagationManager {
 
         final List<PropagationTask> tasks = new ArrayList<PropagationTask>();
 
+        boolean virAttrRerieved = false;
+
         for (ResourceOperation operation : ResourceOperation.values()) {
             for (String resourceName : propByRes.get(operation)) {
                 final ExternalResource resource = resourceDAO.find(resourceName);
                 if (resource == null) {
                     LOG.error("Invalid resource name specified: {}, ignoring...", resourceName);
                 } else {
+                    AttributableUtil attrUtil = AttributableUtil.getInstance(subject);
+
                     PropagationTask task = new PropagationTask();
                     task.setResource(resource);
                     task.setObjectClassName(connObjectUtil.fromAttributable(subject).getObjectClassValue());
-                    task.setSubjectType(AttributableUtil.getInstance(subject).getType());
+                    task.setSubjectType(attrUtil.getType());
                     if (!deleteOnResource) {
                         task.setSubjectId(subject.getId());
                     }
@@ -540,6 +545,23 @@ public class PropagationManager {
                     task.setPropagationMode(resource.getPropagationMode());
                     task.setOldAccountId(propByRes.getOldAccountId(resource.getName()));
 
+                    if (operation == ResourceOperation.CREATE && !virAttrRerieved
+                            && vAttrsToBeRemoved != null && vAttrsToBeUpdated != null) {
+                        connObjectUtil.retrieveVirAttrValues(subject, attrUtil);
+                        virAttrRerieved = true;
+
+                        // update vAttrsToBeUpdated as well
+                        for (AbstractVirAttr virAttr : subject.getVirtualAttributes()) {
+                            final String schema = virAttr.getVirtualSchema().getName();
+
+                            final AttributeMod attributeMod = new AttributeMod();
+                            attributeMod.setSchema(schema);
+                            attributeMod.setValuesToBeAdded(virAttr.getValues());
+
+                            vAttrsToBeUpdated.put(schema, attributeMod);
+                        }
+                    }
+
                     Map.Entry<String, Set<Attribute>> preparedAttrs = prepareAttributes(subject, password,
                             vAttrsToBeRemoved, vAttrsToBeUpdated, enable, resource);
                     task.setAccountId(preparedAttrs.getKey());

Modified: syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/dao/TaskTest.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/dao/TaskTest.java?rev=1445825&r1=1445824&r2=1445825&view=diff
==============================================================================
--- syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/dao/TaskTest.java (original)
+++ syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/dao/TaskTest.java Wed Feb 13 18:41:32 2013
@@ -69,7 +69,7 @@ public class TaskTest extends AbstractDA
         assertEquals(1, sclist.size());
 
         List<SyncTask> sylist = taskDAO.findAll(SyncTask.class);
-        assertEquals(5, sylist.size());
+        assertEquals(6, sylist.size());
     }
 
     @Test

Modified: syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java?rev=1445825&r1=1445824&r2=1445825&view=diff
==============================================================================
--- syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java (original)
+++ syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/TaskTestITCase.java Wed Feb 13 18:41:32 2013
@@ -61,6 +61,7 @@ import org.apache.syncope.core.sync.impl
 import org.junit.FixMethodOrder;
 import org.junit.Test;
 import org.junit.runners.MethodSorters;
+import org.springframework.dao.EmptyResultDataAccessException;
 import org.springframework.http.HttpStatus;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.client.HttpStatusCodeException;
@@ -789,11 +790,11 @@ public class TaskTestITCase extends Abst
         // Add a custom correlation rule
         // -----------------------------
         SyncPolicyTO policyTO = policyService.read(PolicyType.SYNC, 9L);
-        ((SyncPolicySpec)policyTO.getSpecification()).setUserJavaRule(TestSyncRule.class.getName());
-        
+        ((SyncPolicySpec) policyTO.getSpecification()).setUserJavaRule(TestSyncRule.class.getName());
+
         policyService.update(PolicyType.SYNC, policyTO.getId(), policyTO);
         // -----------------------------
-        
+
         SyncTaskTO task = new SyncTaskTO();
         task.setName("Test Sync Rule");
         task.setResource("ws-target-resource-2");
@@ -836,6 +837,52 @@ public class TaskTestITCase extends Abst
                 executed.getExecutions().get(0).getMessage().contains("[updated/failures]: 1/0"));
     }
 
+    @Test
+    public void issueSYNCOPE307() {
+        UserTO userTO = UserTestITCase.getUniqueSampleTO("s307@apache.org");
+
+        AttributeTO csvuserid = new AttributeTO();
+        csvuserid.setSchema("csvuserid");
+        userTO.addDerivedAttribute(csvuserid);
+
+        userTO.getResources().clear();
+        userTO.addResource("ws-target-resource-2");
+        userTO.addResource("resource-csv");
+
+        userTO = createUser(userTO);
+        assertNotNull(userTO);
+
+        userTO = userService.read(userTO.getId());
+        assertEquals("virtualvalue", userTO.getVirtualAttributeMap().get("virtualdata").getValues().get(0));
+
+        // Update sync task
+        SyncTaskTO task = taskService.read(TaskType.SYNCHRONIZATION, 12L);
+        assertNotNull(task);
+
+        //  add user template
+        UserTO template = new UserTO();
+        template.addResource("resource-db-virattr");
+
+        task.setUserTemplate(template);
+
+        taskService.update(task.getId(), task);
+        execSyncTask(task.getId(), 50, false);
+
+        // check for sync policy
+        userTO = userService.read(userTO.getId());
+        assertEquals("virtualvalue", userTO.getVirtualAttributeMap().get("virtualdata").getValues().get(0));
+
+        try {
+            final JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
+
+            String value = jdbcTemplate.queryForObject(
+                    "SELECT USERNAME FROM testsync WHERE ID=?", String.class, userTO.getId());
+            assertEquals("virtualvalue", value);
+        } catch (EmptyResultDataAccessException e) {
+            assertTrue(false);
+        }
+    }
+
     /**
      * remove initial and synchronized users to make test re-runnable
      */

Modified: syncope/trunk/core/src/test/resources/content.xml
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/test/resources/content.xml?rev=1445825&r1=1445824&r2=1445825&view=diff
==============================================================================
--- syncope/trunk/core/src/test/resources/content.xml (original)
+++ syncope/trunk/core/src/test/resources/content.xml Wed Feb 13 18:41:32 2013
@@ -331,14 +331,14 @@ under the License.
                 connectorName="org.connid.bundles.db.table.DatabaseTableConnector" 
                 displayName="H2-testsync" version="${connid.db.table.version}"
                 xmlConfiguration="%3Cset%3E%0A++%3Corg.apache.syncope.common.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.common.types.ConnConfProperty%3E
 %0A++%3Corg.apache.syncope.common.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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EvalidConnectionQuery%3C%2Fn
 ame%3E%0A++++++%3CdisplayName%3EValidate+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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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+St
 atus+Value%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BEnter+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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.synco
 pe.common.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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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%3BEnab
 le+writing+empty+string%26lt%3B%2Fb%26gt%3B%26lt%3Bbr%26gt%3BSelect+to+enable+support+for+writing+an+empty+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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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%26
 lt%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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.types.ConnConfProperty%3
 E%0A++++%3Cschema%3E%0A++++++%3Cname%3EpasswordColumn%3C%2Fname%3E%0A++++++%3CdisplayName%3EPassword+Column%3C%2FdisplayName%3E%0A++++++%3ChelpMessage%3E%26lt%3Bb%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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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%2
 6gt%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.%26lt%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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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%2FhelpMessage%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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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%2Fvalues%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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%2Fstri
 ng%3E%0A++++%3C%2Fvalues%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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.%3C%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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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+ta
 ble.%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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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++++++%3Cconfidential%3Efalse%3C%2Fconfidential%3E%0A++++%3C%2Fschema%3E%0A++++%3Cvalues%2F%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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%2Ft
 ype%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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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.common.types.ConnConfProperty%3E%0A++%3Co
 rg.apache.syncope.common.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%0A++++++%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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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++++++%3Ct
 ype%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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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%2F
 overridable%3E%0A++%3C%2Forg.apache.syncope.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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%26lt%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.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.types.ConnConfProperty%3E%0A++++%3Cschema%3E%0A++++++%3Cname%3EretrievePassword%3C%2Fname%3E%0A++++++%3Cdis
 playName%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++++++%3Cstring%3Efalse%3C%2Fstring%3E%0A++++%3C%2Fvalues%3E%0A++++%3Coverridable%3Efalse%3C%2Foverridable%3E%0A++%3C%2Forg.apache.syncope.common.types.ConnConfProperty%3E%0A++%3Corg.apache.syncope.common.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.common.types.ConnConfProperty%3E%0A%3C%2Fset%3E"/>
+  <ConnInstance_capabilities ConnInstance_id="107" capabilities="ONE_PHASE_CREATE"/>
+  <ConnInstance_capabilities ConnInstance_id="107" capabilities="TWO_PHASES_CREATE"/>
   <ConnInstance_capabilities ConnInstance_id="107" capabilities="ONE_PHASE_UPDATE"/>
+  <ConnInstance_capabilities ConnInstance_id="107" capabilities="TWO_PHASES_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"/>
-
+  <ConnInstance_capabilities ConnInstance_id="107" capabilities="SEARCH"/>
+  
   <ExternalResource name="ws-target-resource-1" connector_id="100"
                     randomPwdIfNotProvided="0" enforceMandatoryCondition="0" propagationMode="TWO_PHASES"
                     propagationPriority="0" propagationPrimary="1" createTraceLevel="ALL" deleteTraceLevel="ALL" updateTraceLevel="ALL" syncTraceLevel="ALL"/>
@@ -655,6 +655,9 @@ under the License.
         fullReconciliation="1" performCreate="1" performDelete="1" performUpdate="1" syncStatus="0"
         actionsClassName="org.apache.syncope.core.sync.impl.LDAPMembershipSyncActions"  
         jobClassName="org.apache.syncope.core.sync.impl.SyncJob"/>
+  <Task DTYPE="SyncTask" id="12" name="VirAttrCache test" resource_name="resource-csv"
+        performCreate="0" performUpdate="1" performDelete="0" syncStatus="0" fullReconciliation="1"
+        jobClassName="org.apache.syncope.core.sync.impl.SyncJob"/>
         
   <NotificationTask_recipients notificationtask_id="8" address="recipient@prova.org"/>