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 2012/07/17 12:57:47 UTC

svn commit: r1362443 - in /incubator/syncope/trunk: client/src/main/java/org/apache/syncope/client/util/ console/src/main/java/org/apache/syncope/console/pages/panels/ console/src/main/java/org/apache/syncope/console/rest/ console/src/test/java/org/apa...

Author: fmartelli
Date: Tue Jul 17 10:57:46 2012
New Revision: 1362443

URL: http://svn.apache.org/viewvc?rev=1362443&view=rev
Log:
SYNCOPE-112 #comment modified connector bean creation + some selenium tests fixed

Removed:
    incubator/syncope/trunk/client/src/main/java/org/apache/syncope/client/util/ConnConfPropUtils.java
Modified:
    incubator/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ResourceConnConfPanel.java
    incubator/syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java
    incubator/syncope/trunk/console/src/test/java/org/apache/syncope/console/ConnInstanceTestITCase.java
    incubator/syncope/trunk/console/src/test/java/org/apache/syncope/console/RoleTestITCase.java
    incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ConnInstanceLoader.java
    incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/ConnInstanceController.java
    incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/ResourceController.java
    incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java
    incubator/syncope/trunk/core/src/test/java/org/apache/syncope/core/init/ConnInstanceLoaderTest.java
    incubator/syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/ConnInstanceTestITCase.java

Modified: incubator/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ResourceConnConfPanel.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ResourceConnConfPanel.java?rev=1362443&r1=1362442&r2=1362443&view=diff
==============================================================================
--- incubator/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ResourceConnConfPanel.java (original)
+++ incubator/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ResourceConnConfPanel.java Tue Jul 17 10:57:46 2012
@@ -41,9 +41,7 @@ import org.apache.wicket.spring.injectio
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.util.ClassUtils;
-import org.apache.syncope.client.to.ConnInstanceTO;
 import org.apache.syncope.client.to.ResourceTO;
-import org.apache.syncope.client.util.ConnConfPropUtils;
 import org.apache.syncope.console.pages.BaseModalPage;
 import org.apache.syncope.console.pages.ResourceModalPage.ResourceEvent;
 import org.apache.syncope.console.pages.panels.ResourceDetailsPanel.DetailsModEvent;
@@ -116,13 +114,7 @@ public class ResourceConnConfPanel exten
             @Override
             public void onClick(final AjaxRequestTarget target) {
 
-                ConnInstanceTO connectorTO = connRestClient.read(resourceTO.getConnectorId());
-
-                connectorTO.setConfiguration(ConnConfPropUtils.joinConnInstanceProperties(connectorTO.
-                        getConfigurationMap(),
-                        ConnConfPropUtils.getConnConfPropertyMap(resourceTO.getConnConfProperties())));
-
-                if (connRestClient.check(connectorTO).booleanValue()) {
+                if (connRestClient.check(resourceTO).booleanValue()) {
                     info(getString("success_connection"));
                 } else {
                     error(getString("error_connection"));

Modified: incubator/syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java?rev=1362443&r1=1362442&r2=1362443&view=diff
==============================================================================
--- incubator/syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java (original)
+++ incubator/syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java Tue Jul 17 10:57:46 2012
@@ -28,6 +28,7 @@ import org.springframework.beans.BeanUti
 import org.springframework.stereotype.Component;
 import org.apache.syncope.client.to.ConnBundleTO;
 import org.apache.syncope.client.to.ConnInstanceTO;
+import org.apache.syncope.client.to.ResourceTO;
 import org.apache.syncope.client.validation.SyncopeClientCompositeErrorException;
 import org.apache.syncope.console.SyncopeSession;
 import org.apache.syncope.types.ConnConfProperty;
@@ -144,7 +145,7 @@ public class ConnectorRestClient extends
     }
 
     /**
-     * Test connection.
+     * Test connector connection.
      *
      * @param connectorTO connector.
      * @return Connection status.
@@ -165,6 +166,23 @@ public class ConnectorRestClient extends
         }
     }
 
+    /**
+     * Test resource connection.
+     *
+     * @param connectorTO connector.
+     * @return Connection status.
+     */
+    public Boolean check(final ResourceTO resourceTO) {
+
+        try {
+            return SyncopeSession.get().getRestTemplate().postForObject(
+                    baseURL + "resource/check.json", resourceTO, Boolean.class);
+        } catch (Exception e) {
+            LOG.error("Connector not found {}", resourceTO.getConnectorId(), e);
+            return false;
+        }
+    }
+
     public List<String> getSchemaNames(final ConnInstanceTO connectorTO) {
         List<String> schemaNames = null;
 

Modified: incubator/syncope/trunk/console/src/test/java/org/apache/syncope/console/ConnInstanceTestITCase.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/console/src/test/java/org/apache/syncope/console/ConnInstanceTestITCase.java?rev=1362443&r1=1362442&r2=1362443&view=diff
==============================================================================
--- incubator/syncope/trunk/console/src/test/java/org/apache/syncope/console/ConnInstanceTestITCase.java (original)
+++ incubator/syncope/trunk/console/src/test/java/org/apache/syncope/console/ConnInstanceTestITCase.java Tue Jul 17 10:57:46 2012
@@ -32,7 +32,7 @@ public class ConnInstanceTestITCase exte
 
         selenium.waitForCondition("selenium.isElementPresent(" + "\"//input[@name='version:textField']\");", "30000");
 
-        selenium.select("//select[@name='bundle:dropDownChoiceField']", "label=org.connid.bundles.soap 1.2");
+        selenium.select("//select[@name='bundle:dropDownChoiceField']", "label=org.connid.bundles.soap 1.2.2");
 
         selenium.click("//div[@id='tabs']/ul/li[2]/a/span");
         selenium.click("//form/div[@id='tabs']/ul/li[1]/a/span");
@@ -55,7 +55,7 @@ public class ConnInstanceTestITCase exte
 
         assertEquals("ConnInstance103", selenium.getAttribute("//input[@name='displayName:textField']/@value"));
 
-        assertEquals("org.connid.bundles.soap#1.2", selenium
+        assertEquals("org.connid.bundles.soap#1.2.2", selenium
                 .getSelectedValue("//select[@name='bundle:dropDownChoiceField']"));
 
         selenium.click("//div[@id='tabs']/ul/li[2]/a/span");

Modified: incubator/syncope/trunk/console/src/test/java/org/apache/syncope/console/RoleTestITCase.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/console/src/test/java/org/apache/syncope/console/RoleTestITCase.java?rev=1362443&r1=1362442&r2=1362443&view=diff
==============================================================================
--- incubator/syncope/trunk/console/src/test/java/org/apache/syncope/console/RoleTestITCase.java (original)
+++ incubator/syncope/trunk/console/src/test/java/org/apache/syncope/console/RoleTestITCase.java Tue Jul 17 10:57:46 2012
@@ -168,7 +168,7 @@ public class RoleTestITCase extends Abst
 
         selenium.waitForCondition("selenium.isElementPresent(\"//div[@id='navigationPane']\");", "30000");
 
-        selenium.click("//div[3]/span/div/div/table[12]/tbody/tr/td[6]/table/tbody/tr/td[2]/a");
+        selenium.click("//div[3]/span/div/div/table[12]/tbody/tr/td[5]/table/tbody/tr/td[2]/a");
 
         selenium.waitForCondition("selenium.isElementPresent(\"//div/p/span[2]/span/a[3]\");", "30000");
 

Modified: incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ConnInstanceLoader.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ConnInstanceLoader.java?rev=1362443&r1=1362442&r2=1362443&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ConnInstanceLoader.java (original)
+++ incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ConnInstanceLoader.java Tue Jul 17 10:57:46 2012
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.core.init;
 
-import java.util.HashSet;
 import java.util.Locale;
 import java.util.Set;
 import javassist.NotFoundException;
@@ -27,6 +26,7 @@ import org.apache.syncope.core.persisten
 import org.apache.syncope.core.persistence.beans.ExternalResource;
 import org.apache.syncope.core.persistence.dao.ResourceDAO;
 import org.apache.syncope.core.propagation.ConnectorFacadeProxy;
+import org.apache.syncope.core.rest.data.ResourceDataBinder;
 import org.apache.syncope.core.util.ApplicationContextProvider;
 import org.apache.syncope.core.util.ConnBundleManager;
 import org.apache.syncope.types.ConnConfProperty;
@@ -54,6 +54,9 @@ public class ConnInstanceLoader {
     @Autowired
     private ConnBundleManager connBundleManager;
 
+    @Autowired
+    private ResourceDataBinder resourceDataBinder;
+
     private DefaultListableBeanFactory getBeanFactory() {
         ConfigurableApplicationContext context = ApplicationContextProvider.getApplicationContext();
 
@@ -71,7 +74,8 @@ public class ConnInstanceLoader {
      * @return live connector bran for given resource
      * @throws BeansException in case the connector is not registered in the context
      */
-    public ConnectorFacadeProxy getConnector(final ExternalResource resource) throws BeansException, NotFoundException {
+    public ConnectorFacadeProxy getConnector(final ExternalResource resource)
+            throws BeansException, NotFoundException {
 
         // Try to re-create connector bean from underlying resource
         // (useful for managing failover scenarios)
@@ -82,32 +86,11 @@ public class ConnInstanceLoader {
         return (ConnectorFacadeProxy) getBeanFactory().getBean(getBeanName(resource));
     }
 
-    public ConnectorFacadeProxy createConnectorBean(final ExternalResource resource) throws NotFoundException {
-
-        final Set<ConnConfProperty> configuration = new HashSet<ConnConfProperty>();
-
-        // to be used to control managed prop (needed by overridden mechanism)
-        final Set<String> propertyNames = new HashSet<String>();
-
-        // get overridden connector configuration properties
-        for (ConnConfProperty prop : resource.getConfiguration()) {
-            if (!propertyNames.contains(prop.getSchema().getName())) {
-                configuration.add(prop);
-                propertyNames.add(prop.getSchema().getName());
-            }
-        }
-
-        final ConnInstance connInstance = resource.getConnector();
-
-        // get connector configuration properties
-        for (ConnConfProperty prop : connInstance.getConfiguration()) {
-            if (!propertyNames.contains(prop.getSchema().getName())) {
-                configuration.add(prop);
-                propertyNames.add(prop.getSchema().getName());
-            }
-        }
+    public ConnectorFacadeProxy createConnectorBean(final ExternalResource resource)
+            throws NotFoundException {
 
-        return createConnectorBean(connInstance, configuration);
+        final ConnInstance connInstanceClone = resourceDataBinder.getConnInstance(resource);
+        return createConnectorBean(resource.getConnector(), connInstanceClone.getConfiguration());
     }
 
     /**
@@ -120,7 +103,8 @@ public class ConnInstanceLoader {
      * @throws NotFoundException when not able to fetch all the required data.
      */
     public ConnectorFacadeProxy createConnectorBean(final ConnInstance connInstance,
-            final Set<ConnConfProperty> configuration) throws NotFoundException {
+            final Set<ConnConfProperty> configuration)
+            throws NotFoundException {
 
         final ConnInstance connInstanceClone = (ConnInstance) SerializationUtils.clone(connInstance);
 
@@ -129,7 +113,8 @@ public class ConnInstanceLoader {
         return new ConnectorFacadeProxy(connInstanceClone, connBundleManager);
     }
 
-    public void registerConnector(final ExternalResource resource) throws NotFoundException {
+    public void registerConnector(final ExternalResource resource)
+            throws NotFoundException {
 
         final ConnectorFacadeProxy connector = createConnectorBean(resource);
         LOG.debug("Connector to be registered: {}", connector);
@@ -160,8 +145,8 @@ public class ConnInstanceLoader {
                 LOG.info("Registering resource-connector pair {}-{}", resource, resource.getConnector());
                 registerConnector(resource);
             } catch (Exception e) {
-                LOG.error("While registering resource-connector pair {}-{}", new Object[] { resource,
-                        resource.getConnector(), e });
+                LOG.error("While registering resource-connector pair {}-{}", new Object[]{resource,
+                            resource.getConnector(), e});
             }
         }
 

Modified: incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/ConnInstanceController.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/ConnInstanceController.java?rev=1362443&r1=1362442&r2=1362443&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/ConnInstanceController.java (original)
+++ incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/ConnInstanceController.java Tue Jul 17 10:57:46 2012
@@ -27,22 +27,6 @@ import java.util.Set;
 import javassist.NotFoundException;
 import javax.servlet.http.HttpServletResponse;
 import org.apache.commons.lang.StringUtils;
-import org.identityconnectors.common.l10n.CurrentLocale;
-import org.identityconnectors.framework.api.ConfigurationProperties;
-import org.identityconnectors.framework.api.ConnectorInfo;
-import org.identityconnectors.framework.api.ConnectorInfoManager;
-import org.identityconnectors.framework.api.ConnectorKey;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.servlet.ModelAndView;
 import org.apache.syncope.client.to.ConnBundleTO;
 import org.apache.syncope.client.to.ConnInstanceTO;
 import org.apache.syncope.client.validation.SyncopeClientCompositeErrorException;
@@ -63,7 +47,23 @@ import org.apache.syncope.types.AuditEle
 import org.apache.syncope.types.ConnConfPropSchema;
 import org.apache.syncope.types.ConnConfProperty;
 import org.apache.syncope.types.SyncopeClientExceptionType;
+import org.identityconnectors.common.l10n.CurrentLocale;
+import org.identityconnectors.framework.api.ConfigurationProperties;
+import org.identityconnectors.framework.api.ConnectorInfo;
+import org.identityconnectors.framework.api.ConnectorInfoManager;
+import org.identityconnectors.framework.api.ConnectorKey;
 import org.identityconnectors.framework.impl.api.ConfigurationPropertyImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.ModelAndView;
 
 @Controller
 @RequestMapping("/connector")

Modified: incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/ResourceController.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/ResourceController.java?rev=1362443&r1=1362442&r2=1362443&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/ResourceController.java (original)
+++ incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/ResourceController.java Tue Jul 17 10:57:46 2012
@@ -51,11 +51,15 @@ import org.apache.syncope.core.persisten
 import org.apache.syncope.core.persistence.dao.ResourceDAO;
 import org.apache.syncope.core.persistence.dao.RoleDAO;
 import org.apache.syncope.core.propagation.ConnectorFacadeProxy;
+import org.apache.syncope.core.rest.data.ConnInstanceDataBinder;
 import org.apache.syncope.core.rest.data.ResourceDataBinder;
+import org.apache.syncope.core.util.ConnBundleManager;
 import org.apache.syncope.core.util.ConnObjectUtil;
+import org.apache.syncope.types.AuditElements;
 import org.apache.syncope.types.AuditElements.Category;
 import org.apache.syncope.types.AuditElements.ResourceSubCategory;
 import org.apache.syncope.types.AuditElements.Result;
+import org.springframework.web.servlet.ModelAndView;
 
 @Controller
 @RequestMapping("/resource")
@@ -76,6 +80,9 @@ public class ResourceController extends 
     @Autowired
     private ResourceDataBinder binder;
 
+    @Autowired
+    private ConnInstanceDataBinder connInstancebinder;
+
     /**
      * ConnectorObject util.
      */
@@ -85,6 +92,9 @@ public class ResourceController extends 
     @Autowired
     private ConnInstanceLoader connLoader;
 
+    @Autowired
+    private ConnBundleManager bundleManager;
+
     @PreAuthorize("hasRole('RESOURCE_CREATE')")
     @RequestMapping(method = RequestMethod.POST, value = "/create")
     public ResourceTO create(final HttpServletResponse response, @RequestBody final ResourceTO resourceTO)
@@ -131,14 +141,14 @@ public class ResourceController extends 
         if (resource == null) {
             throw new NotFoundException("Resource '" + resourceName + "'");
         }
-        
+
         ResourceTO resourceToDelete = binder.getResourceTO(resource);
 
         auditManager.audit(Category.resource, ResourceSubCategory.delete, Result.success,
                 "Successfully deleted resource: " + resource.getName());
 
         resourceDAO.delete(resourceName);
-        
+
         return resourceToDelete;
     }
 
@@ -241,4 +251,33 @@ public class ResourceController extends 
 
         return connObjectUtil.getConnObjectTO(connectorObject);
     }
+
+    @PreAuthorize("hasRole('CONNECTOR_READ')")
+    @RequestMapping(method = RequestMethod.POST, value = "/check")
+    @Transactional(readOnly = true)
+    public ModelAndView check(final HttpServletResponse response, @RequestBody final ResourceTO resourceTO)
+            throws SyncopeClientCompositeErrorException, NotFoundException {
+
+        final ConnInstance connInstance = binder.getConnInstance(resourceTO);
+
+        final ConnectorFacadeProxy connector =
+                new ConnectorFacadeProxy(connInstance, bundleManager);
+
+        boolean result;
+        try {
+            connector.test();
+            result = true;
+
+            auditManager.audit(Category.connector, AuditElements.ConnectorSubCategory.check, Result.success,
+                    "Successfully checked connector: " + resourceTO);
+        } catch (Exception ex) {
+            auditManager.audit(Category.connector, AuditElements.ConnectorSubCategory.check, Result.failure,
+                    "Unsuccessful check for connector: " + resourceTO, ex);
+
+            LOG.error("Test connection failure {}", ex);
+            result = false;
+        }
+
+        return new ModelAndView().addObject(result);
+    }
 }

Modified: incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java?rev=1362443&r1=1362442&r2=1362443&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java (original)
+++ incubator/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/data/ResourceDataBinder.java Tue Jul 17 10:57:46 2012
@@ -20,9 +20,12 @@ package org.apache.syncope.core.rest.dat
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import javassist.NotFoundException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -54,10 +57,10 @@ public class ResourceDataBinder {
      */
     private static final Logger LOG = LoggerFactory.getLogger(ResourceDataBinder.class);
 
-    private static final String[] MAPPING_IGNORE_PROPERTIES = { "id", "resource", "syncToken" };
+    private static final String[] MAPPING_IGNORE_PROPERTIES = {"id", "resource", "syncToken"};
 
     @Autowired
-    private ConnInstanceDAO connectorInstanceDAO;
+    private ConnInstanceDAO connInstanceDAO;
 
     @Autowired
     private JexlUtil jexlUtil;
@@ -65,7 +68,11 @@ public class ResourceDataBinder {
     @Autowired
     private PolicyDAO policyDAO;
 
-    public ExternalResource create(final ResourceTO resourceTO) throws SyncopeClientCompositeErrorException {
+    @Autowired
+    private ConnInstanceDataBinder connInstancebinder;
+
+    public ExternalResource create(final ResourceTO resourceTO)
+            throws SyncopeClientCompositeErrorException {
 
         return update(new ExternalResource(), resourceTO);
     }
@@ -80,7 +87,7 @@ public class ResourceDataBinder {
         resource.setName(resourceTO.getName());
 
         if (resourceTO.getConnectorId() != null) {
-            ConnInstance connector = connectorInstanceDAO.find(resourceTO.getConnectorId());
+            ConnInstance connector = connInstanceDAO.find(resourceTO.getConnectorId());
             resource.setConnector(connector);
 
             if (!connector.getResources().contains(resource)) {
@@ -312,4 +319,59 @@ public class ResourceDataBinder {
 
         return schemaMappingTO;
     }
+
+    public ConnInstance getConnInstance(ExternalResource resource)
+            throws NotFoundException {
+
+        final ConnInstance connInstanceClone =
+                (ConnInstance) org.apache.commons.lang.SerializationUtils.clone(resource.getConnector());
+
+        return getConnInstance(connInstanceClone, resource.getConfiguration());
+    }
+
+    public ConnInstance getConnInstance(final ResourceTO resourceTO)
+            throws NotFoundException {
+        ConnInstance connInstance = connInstanceDAO.find(resourceTO.getConnectorId());
+
+        final ConnInstance connInstanceClone =
+                (ConnInstance) org.apache.commons.lang.SerializationUtils.clone(connInstance);
+
+        if (connInstance == null) {
+            throw new NotFoundException("Connector '" + resourceTO.getConnectorId() + "'");
+        }
+
+        return getConnInstance(connInstanceClone, resourceTO.getConnConfProperties());
+    }
+
+    private ConnInstance getConnInstance(
+            final ConnInstance connInstance, final Set<ConnConfProperty> overridden)
+            throws NotFoundException {
+
+        final Set<ConnConfProperty> configuration = new HashSet<ConnConfProperty>();
+        final Map<String, ConnConfProperty> overridable = new HashMap<String, ConnConfProperty>();
+
+        // add not overridable properties
+        for (ConnConfProperty prop : connInstance.getConfiguration()) {
+            if (prop.isOverridable()) {
+                overridable.put(prop.getSchema().getName(), prop);
+            } else {
+                configuration.add(prop);
+            }
+        }
+
+        // add overridden properties
+        for (ConnConfProperty prop : overridden) {
+            if (overridable.containsKey(prop.getSchema().getName()) && !prop.getValues().isEmpty()) {
+                configuration.add(prop);
+                overridable.remove(prop.getSchema().getName());
+            }
+        }
+
+        // add overridable properties not overridden
+        configuration.addAll(overridable.values());
+
+        connInstance.setConfiguration(configuration);
+
+        return connInstance;
+    }
 }

Modified: incubator/syncope/trunk/core/src/test/java/org/apache/syncope/core/init/ConnInstanceLoaderTest.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/test/java/org/apache/syncope/core/init/ConnInstanceLoaderTest.java?rev=1362443&r1=1362442&r2=1362443&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/test/java/org/apache/syncope/core/init/ConnInstanceLoaderTest.java (original)
+++ incubator/syncope/trunk/core/src/test/java/org/apache/syncope/core/init/ConnInstanceLoaderTest.java Tue Jul 17 10:57:46 2012
@@ -28,6 +28,7 @@ import org.springframework.transaction.a
 import org.apache.syncope.core.AbstractTest;
 import org.apache.syncope.core.persistence.dao.ResourceDAO;
 import org.apache.syncope.core.propagation.ConnectorFacadeProxy;
+import org.apache.syncope.core.rest.data.ResourceDataBinder;
 import org.apache.syncope.core.util.ApplicationContextProvider;
 import org.apache.syncope.core.util.ConnBundleManager;
 
@@ -42,11 +43,15 @@ public class ConnInstanceLoaderTest exte
     @Autowired
     private ConnBundleManager connBundleManager;
 
+    @Autowired
+    private ResourceDataBinder resourceDataBinder;
+
     @Before
     public void before() {
         cil = new ConnInstanceLoader();
         ReflectionTestUtils.setField(cil, "resourceDAO", resourceDAO);
         ReflectionTestUtils.setField(cil, "connBundleManager", connBundleManager);
+        ReflectionTestUtils.setField(cil, "resourceDataBinder", resourceDataBinder);
 
         // Remove any other connector instance bean set up by
         // standard ConnInstanceLoader.load()

Modified: incubator/syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/ConnInstanceTestITCase.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/ConnInstanceTestITCase.java?rev=1362443&r1=1362442&r2=1362443&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/ConnInstanceTestITCase.java (original)
+++ incubator/syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/ConnInstanceTestITCase.java Tue Jul 17 10:57:46 2012
@@ -39,10 +39,12 @@ import org.springframework.web.client.Ht
 import org.apache.syncope.client.to.ConnBundleTO;
 import org.apache.syncope.client.to.ConnInstanceTO;
 import org.apache.syncope.client.to.ResourceTO;
+import org.apache.syncope.client.to.SchemaMappingTO;
 import org.apache.syncope.client.validation.SyncopeClientCompositeErrorException;
 import org.apache.syncope.types.ConnConfPropSchema;
 import org.apache.syncope.types.ConnConfProperty;
 import org.apache.syncope.types.ConnectorCapability;
+import org.apache.syncope.types.IntMappingType;
 
 public class ConnInstanceTestITCase extends AbstractTest {
 
@@ -535,4 +537,88 @@ public class ConnInstanceTestITCase exte
         assertNotNull(schemaNames);
         assertFalse(schemaNames.isEmpty());
     }
+
+    @Test
+    public void issueSYNCOPE112() {
+
+        // ----------------------------------------
+        // Create a new connector
+        // ----------------------------------------
+        ConnInstanceTO connectorTO = new ConnInstanceTO();
+
+        // set connector version
+        connectorTO.setVersion(connidSoapVersion);
+
+        // set connector name
+        connectorTO.setConnectorName(WebServiceConnector.class.getName());
+
+        // set bundle name
+        connectorTO.setBundleName("org.connid.bundles.soap");
+
+        // set display name
+        connectorTO.setDisplayName("WSSoap");
+
+        // set the connector configuration using PropertyTO
+        Set<ConnConfProperty> conf = new HashSet<ConnConfProperty>();
+
+        ConnConfPropSchema userSchema = new ConnConfPropSchema();
+        userSchema.setName("endpoint");
+        userSchema.setType(String.class.getName());
+        userSchema.setRequired(true);
+        ConnConfProperty endpoint = new ConnConfProperty();
+        endpoint.setSchema(userSchema);
+        endpoint.setValues(Collections.singletonList("http://localhost:9080/does_not_work"));
+        endpoint.setOverridable(true);
+
+        ConnConfPropSchema keyColumnSchema = new ConnConfPropSchema();
+        keyColumnSchema.setName("servicename");
+        keyColumnSchema.setType(String.class.getName());
+        keyColumnSchema.setRequired(true);
+        ConnConfProperty servicename = new ConnConfProperty();
+        servicename.setSchema(keyColumnSchema);
+        servicename.setValues(
+                Collections.singletonList("org.connid.bundles.soap.provisioning.interfaces.Provisioning"));
+        servicename.setOverridable(false);
+
+        conf.add(endpoint);
+        conf.add(servicename);
+
+        // set connector configuration
+        connectorTO.setConfiguration(conf);
+
+        assertFalse(restTemplate.postForObject(BASE_URL + "connector/check.json", connectorTO, Boolean.class));
+
+        connectorTO = restTemplate.postForObject(BASE_URL + "connector/create.json", connectorTO, ConnInstanceTO.class);
+        assertNotNull(connectorTO);
+        // ----------------------------------------
+
+        // ----------------------------------------
+        // create a resourceTO
+        // ----------------------------------------
+        String resourceName = "checkForPropOverriding";
+        ResourceTO resourceTO = new ResourceTO();
+
+        resourceTO.setName(resourceName);
+        resourceTO.setConnectorId(connectorTO.getId());
+
+        conf = new HashSet<ConnConfProperty>();
+        endpoint.setValues(Collections.singletonList("http://localhost:9080/wssample/services/provisioning"));
+        conf.add(endpoint);
+
+        resourceTO.setConnectorConfigurationProperties(conf);
+
+        SchemaMappingTO schemaMappingTO = new SchemaMappingTO();
+        schemaMappingTO.setExtAttrName("uid");
+        schemaMappingTO.setIntAttrName("userId");
+        schemaMappingTO.setIntMappingType(IntMappingType.UserSchema);
+        schemaMappingTO.setAccountid(true);
+        resourceTO.addMapping(schemaMappingTO);
+        // ----------------------------------------
+
+        // ----------------------------------------
+        // Check connection without saving the resource ....
+        // ----------------------------------------
+        assertTrue(restTemplate.postForObject(BASE_URL + "resource/check.json", resourceTO, Boolean.class));
+        // ----------------------------------------
+    }
 }