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/02/28 16:36:05 UTC

svn commit: r1294694 - in /incubator/syncope/trunk/core/src: main/java/org/syncope/core/propagation/ main/java/org/syncope/core/rest/controller/ main/java/org/syncope/core/rest/data/ test/java/org/syncope/core/rest/

Author: fmartelli
Date: Tue Feb 28 15:36:04 2012
New Revision: 1294694

URL: http://svn.apache.org/viewvc?rev=1294694&view=rev
Log:
SYNCOPE-10 #resolve #time 4h

Modified:
    incubator/syncope/trunk/core/src/main/java/org/syncope/core/propagation/ConnectorFacadeProxy.java
    incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/controller/ConnInstanceController.java
    incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/controller/ResourceController.java
    incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/data/ResourceDataBinder.java
    incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/ConnInstanceTestITCase.java
    incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/ResourceTestITCase.java

Modified: incubator/syncope/trunk/core/src/main/java/org/syncope/core/propagation/ConnectorFacadeProxy.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/main/java/org/syncope/core/propagation/ConnectorFacadeProxy.java?rev=1294694&r1=1294693&r2=1294694&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/main/java/org/syncope/core/propagation/ConnectorFacadeProxy.java (original)
+++ incubator/syncope/trunk/core/src/main/java/org/syncope/core/propagation/ConnectorFacadeProxy.java Tue Feb 28 15:36:04 2012
@@ -78,11 +78,11 @@ public class ConnectorFacadeProxy {
     private final ConnectorFacade connector;
 
     /**
-     * Set of configure connecto instance capabilities.
+     * Active connecto instance.
      *
      * @see org.syncope.core.persistence.beans.ConnInstance
      */
-    private final Set<ConnectorCapability> capabitilies;
+    private final ConnInstance activeConnInstance;
 
     /**
      * Use the passed connector instance to build a ConnectorFacade that will be
@@ -102,6 +102,8 @@ public class ConnectorFacadeProxy {
             final ConnBundleManager connBundleManager)
             throws NotFoundException {
 
+        this.activeConnInstance = connInstance;
+
         // specify a connector.
         ConnectorKey key = new ConnectorKey(
                 connInstance.getBundleName(),
@@ -248,8 +250,6 @@ public class ConnectorFacadeProxy {
 
         // Make sure we have set up the Configuration properly
         connector.validate();
-
-        this.capabitilies = connInstance.getCapabilities();
     }
 
     /**
@@ -273,9 +273,9 @@ public class ConnectorFacadeProxy {
         Uid result = null;
 
         if (propagationMode == PropagationMode.ONE_PHASE
-                ? capabitilies.contains(
+                ? activeConnInstance.getCapabilities().contains(
                 ConnectorCapability.ONE_PHASE_CREATE)
-                : capabitilies.contains(
+                : activeConnInstance.getCapabilities().contains(
                 ConnectorCapability.TWO_PHASES_CREATE)) {
 
             propagationAttempted.add("create");
@@ -284,7 +284,7 @@ public class ConnectorFacadeProxy {
         } else {
             LOG.info("Create was attempted, although the "
                     + "connector only has these capabilities: {}. No action.",
-                    capabitilies);
+                    activeConnInstance.getCapabilities());
         }
 
         return result;
@@ -312,9 +312,9 @@ public class ConnectorFacadeProxy {
         Uid result = null;
 
         if (propagationMode == PropagationMode.ONE_PHASE
-                ? capabitilies.contains(
+                ? activeConnInstance.getCapabilities().contains(
                 ConnectorCapability.ONE_PHASE_UPDATE)
-                : capabitilies.contains(
+                : activeConnInstance.getCapabilities().contains(
                 ConnectorCapability.TWO_PHASES_UPDATE)) {
 
             propagationAttempted.add("update");
@@ -324,7 +324,7 @@ public class ConnectorFacadeProxy {
         } else {
             LOG.info("Update for {} was attempted, although the "
                     + "connector only has these capabilities: {}. No action.",
-                    uid.getUidValue(), capabitilies);
+                    uid.getUidValue(), activeConnInstance.getCapabilities());
         }
 
         return result;
@@ -347,9 +347,9 @@ public class ConnectorFacadeProxy {
             final Set<String> propagationAttempted) {
 
         if (propagationMode == PropagationMode.ONE_PHASE
-                ? capabitilies.contains(
+                ? activeConnInstance.getCapabilities().contains(
                 ConnectorCapability.ONE_PHASE_DELETE)
-                : capabitilies.contains(
+                : activeConnInstance.getCapabilities().contains(
                 ConnectorCapability.TWO_PHASES_DELETE)) {
 
             propagationAttempted.add("delete");
@@ -358,7 +358,7 @@ public class ConnectorFacadeProxy {
         } else {
             LOG.info("Delete for {} was attempted, although the "
                     + "connector only has these capabilities: {}. No action.",
-                    uid.getUidValue(), capabitilies);
+                    uid.getUidValue(), activeConnInstance.getCapabilities());
         }
     }
 
@@ -370,12 +370,13 @@ public class ConnectorFacadeProxy {
      */
     public void sync(final SyncToken token, final SyncResultsHandler handler) {
 
-        if (capabitilies.contains(ConnectorCapability.SYNC)) {
+        if (activeConnInstance.getCapabilities().contains(
+                ConnectorCapability.SYNC)) {
             connector.sync(ObjectClass.ACCOUNT, token, handler, null);
         } else {
             LOG.info("Sync was attempted, although the "
                     + "connector only has these capabilities: {}. No action.",
-                    capabitilies);
+                    activeConnInstance.getCapabilities());
         }
     }
 
@@ -387,12 +388,13 @@ public class ConnectorFacadeProxy {
     public SyncToken getLatestSyncToken() {
         SyncToken result = null;
 
-        if (capabitilies.contains(ConnectorCapability.SYNC)) {
+        if (activeConnInstance.getCapabilities().contains(
+                ConnectorCapability.SYNC)) {
             result = connector.getLatestSyncToken(ObjectClass.ACCOUNT);
         } else {
             LOG.info("getLatestSyncToken was attempted, although the "
                     + "connector only has these capabilities: {}. No action.",
-                    capabitilies);
+                    activeConnInstance.getCapabilities());
         }
 
         return result;
@@ -434,7 +436,8 @@ public class ConnectorFacadeProxy {
 
         ConnectorObject result = null;
 
-        if (capabitilies.contains(ConnectorCapability.SEARCH)) {
+        if (activeConnInstance.getCapabilities().contains(
+                ConnectorCapability.SEARCH)) {
             if (operationType == null) {
                 result = connector.getObject(objectClass, uid, options);
             } else {
@@ -442,9 +445,9 @@ public class ConnectorFacadeProxy {
                     case CREATE:
                         if (propagationMode == null
                                 || (propagationMode == PropagationMode.ONE_PHASE
-                                ? capabitilies.contains(
+                                ? activeConnInstance.getCapabilities().contains(
                                 ConnectorCapability.ONE_PHASE_CREATE)
-                                : capabitilies.contains(
+                                : activeConnInstance.getCapabilities().contains(
                                 ConnectorCapability.TWO_PHASES_CREATE))) {
 
                             result = connector.getObject(
@@ -454,9 +457,9 @@ public class ConnectorFacadeProxy {
                     case UPDATE:
                         if (propagationMode == null
                                 || (propagationMode == PropagationMode.ONE_PHASE
-                                ? capabitilies.contains(
+                                ? activeConnInstance.getCapabilities().contains(
                                 ConnectorCapability.ONE_PHASE_UPDATE)
-                                : capabitilies.contains(
+                                : activeConnInstance.getCapabilities().contains(
                                 ConnectorCapability.TWO_PHASES_UPDATE))) {
 
                             result = connector.getObject(
@@ -470,7 +473,7 @@ public class ConnectorFacadeProxy {
         } else {
             LOG.info("Search was attempted, although the "
                     + "connector only has these capabilities: {}. No action.",
-                    capabitilies);
+                    activeConnInstance.getCapabilities());
         }
 
         return result;
@@ -489,7 +492,8 @@ public class ConnectorFacadeProxy {
             final SyncResultsHandler handler,
             final OperationOptions options) {
 
-        if (capabitilies.contains(ConnectorCapability.SEARCH)) {
+        if (activeConnInstance.getCapabilities().contains(
+                ConnectorCapability.SEARCH)) {
             connector.search(objectClass, null,
                     new ResultsHandler() {
 
@@ -508,7 +512,7 @@ public class ConnectorFacadeProxy {
         } else {
             LOG.info("Search was attempted, although the "
                     + "connector only has these capabilities: {}. No action.",
-                    capabitilies);
+                    activeConnInstance.getCapabilities());
         }
     }
 
@@ -623,6 +627,15 @@ public class ConnectorFacadeProxy {
     public String toString() {
         return "ConnectorFacadeProxy{"
                 + "connector=" + connector
-                + "capabitilies=" + capabitilies + '}';
+                + "capabitilies=" + activeConnInstance.getCapabilities() + '}';
+    }
+
+    /**
+     * Getter for active connector instance.
+     *
+     * @return active connector instance.
+     */
+    public ConnInstance getActiveConnInstance() {
+        return activeConnInstance;
     }
 }

Modified: incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/controller/ConnInstanceController.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/controller/ConnInstanceController.java?rev=1294694&r1=1294693&r2=1294694&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/controller/ConnInstanceController.java (original)
+++ incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/controller/ConnInstanceController.java Tue Feb 28 15:36:04 2012
@@ -53,6 +53,7 @@ import org.syncope.core.persistence.bean
 import org.syncope.core.persistence.beans.ExternalResource;
 import org.syncope.core.persistence.dao.ConnInstanceDAO;
 import org.syncope.core.persistence.dao.MissingConfKeyException;
+import org.syncope.core.persistence.dao.ResourceDAO;
 import org.syncope.core.propagation.ConnectorFacadeProxy;
 import org.syncope.core.rest.data.ConnInstanceDataBinder;
 import org.syncope.core.util.ConnBundleManager;
@@ -65,6 +66,9 @@ import org.syncope.types.SyncopeClientEx
 public class ConnInstanceController extends AbstractController {
 
     @Autowired
+    private ResourceDAO resourceDAO;
+
+    @Autowired
     private ConnInstanceDAO connInstanceDAO;
 
     @Autowired
@@ -427,4 +431,24 @@ public class ConnInstanceController exte
 
         return conf;
     }
+
+    @PreAuthorize("hasRole('CONNECTOR_READ')")
+    @RequestMapping(method = RequestMethod.GET,
+    value = "/{resourceName}/connectorBean")
+    @Transactional(readOnly = true)
+    public ConnInstanceTO readConnectorBean(
+            @PathVariable("resourceName") String resourceName)
+            throws NotFoundException {
+
+        ExternalResource resource = resourceDAO.find(resourceName);
+
+        if (resource == null) {
+            LOG.error("Could not find resource '" + resourceName + "'");
+            throw new NotFoundException("Resource '" + resourceName + "'");
+        }
+
+        final ConnectorFacadeProxy connector = connLoader.getConnector(resource);
+
+        return binder.getConnInstanceTO(connector.getActiveConnInstance());
+    }
 }

Modified: incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/controller/ResourceController.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/controller/ResourceController.java?rev=1294694&r1=1294693&r2=1294694&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/controller/ResourceController.java (original)
+++ incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/controller/ResourceController.java Tue Feb 28 15:36:04 2012
@@ -38,14 +38,17 @@ import org.springframework.web.bind.anno
 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.syncope.client.to.ConnObjectTO;
 import org.syncope.client.to.ResourceTO;
 import org.syncope.client.to.SchemaMappingTO;
 import org.syncope.client.validation.SyncopeClientCompositeErrorException;
 import org.syncope.client.validation.SyncopeClientException;
 import org.syncope.core.init.ConnInstanceLoader;
+import org.syncope.core.persistence.beans.ConnInstance;
 import org.syncope.core.persistence.beans.ExternalResource;
 import org.syncope.core.persistence.beans.role.SyncopeRole;
+import org.syncope.core.persistence.dao.ConnInstanceDAO;
 import org.syncope.core.persistence.dao.ResourceDAO;
 import org.syncope.core.persistence.dao.RoleDAO;
 import org.syncope.core.propagation.ConnectorFacadeProxy;
@@ -61,6 +64,9 @@ public class ResourceController extends 
     private ResourceDAO resourceDAO;
 
     @Autowired
+    private ConnInstanceDAO connInstanceDAO;
+
+    @Autowired
     private RoleDAO roleDAO;
 
     @Autowired
@@ -195,10 +201,20 @@ public class ResourceController extends 
     @Transactional(readOnly = true)
     @RequestMapping(method = RequestMethod.GET,
     value = "/list")
-    public List<ResourceTO> list(HttpServletResponse response)
+    public List<ResourceTO> list(
+            @RequestParam(required = false, value = "connInstanceId")
+            final Long connInstanceId)
             throws NotFoundException {
 
-        List<ExternalResource> resources = resourceDAO.findAll();
+        final List<ExternalResource> resources;
+
+        if (connInstanceId == null) {
+            resources = resourceDAO.findAll();
+        } else {
+            ConnInstance connInstance = connInstanceDAO.find(connInstanceId);
+            resources = connInstance.getResources();
+        }
+
         if (resources == null) {
             LOG.error("No resources found");
             throw new NotFoundException("No resources found");

Modified: incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/data/ResourceDataBinder.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/data/ResourceDataBinder.java?rev=1294694&r1=1294693&r2=1294694&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/data/ResourceDataBinder.java (original)
+++ incubator/syncope/trunk/core/src/main/java/org/syncope/core/rest/data/ResourceDataBinder.java Tue Feb 28 15:36:04 2012
@@ -87,6 +87,10 @@ public class ResourceDataBinder {
             ConnInstance connector =
                     connectorInstanceDAO.find(resourceTO.getConnectorId());
             resource.setConnector(connector);
+
+            if (!connector.getResources().contains(resource)) {
+                connector.addResource(resource);
+            }
         }
 
         resource.setForceMandatoryConstraint(

Modified: incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/ConnInstanceTestITCase.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/ConnInstanceTestITCase.java?rev=1294694&r1=1294693&r2=1294694&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/ConnInstanceTestITCase.java (original)
+++ incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/ConnInstanceTestITCase.java Tue Feb 28 15:36:04 2012
@@ -18,11 +18,7 @@
  */
 package org.syncope.core.rest;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -42,6 +38,7 @@ import org.springframework.http.HttpStat
 import org.springframework.web.client.HttpStatusCodeException;
 import org.syncope.client.to.ConnBundleTO;
 import org.syncope.client.to.ConnInstanceTO;
+import org.syncope.client.to.ResourceTO;
 import org.syncope.client.validation.SyncopeClientCompositeErrorException;
 import org.syncope.types.ConnConfPropSchema;
 import org.syncope.types.ConnConfProperty;
@@ -251,6 +248,99 @@ public class ConnInstanceTestITCase exte
     }
 
     @Test
+    public void issueSYNCOPE10() {
+        // ----------------------------------
+        // Copy resource and connector in order to create new objects.
+        // ----------------------------------
+        // Retrieve a connector instance template.
+        ConnInstanceTO connInstanceTO = restTemplate.getForObject(
+                BASE_URL + "connector/read/{connectorId}",
+                ConnInstanceTO.class, 103L);
+
+        assertNotNull(connInstanceTO);
+
+        // check for resource
+        List<ResourceTO> resources = Arrays.asList(restTemplate.getForObject(
+                BASE_URL + "resource/list.json?connInstanceId=103",
+                ResourceTO[].class));
+
+        assertEquals(1, resources.size());
+
+        // Retrieve a resource TO template.
+        ResourceTO resourceTO = resources.get(0);
+
+        // Make it new.
+        resourceTO.setName("newAbout103");
+
+        // Make it new.
+        connInstanceTO.setId(0);
+        // ----------------------------------
+
+        // ----------------------------------
+        // Create a new connector instance.
+        // ----------------------------------
+        connInstanceTO = restTemplate.postForObject(
+                BASE_URL + "connector/create.json",
+                connInstanceTO, ConnInstanceTO.class);
+
+        assertNotNull(connInstanceTO);
+        assertTrue(connInstanceTO.getCapabilities().isEmpty());
+
+        long connId = connInstanceTO.getId();
+
+        // Link resourceTO to the new connector instance.
+        resourceTO.setConnectorId(connId);
+        // ----------------------------------
+
+        // ----------------------------------
+        // Check for connector instance update after resource creation.
+        // ----------------------------------
+        resourceTO = restTemplate.postForObject(
+                BASE_URL + "resource/create.json",
+                resourceTO, ResourceTO.class);
+
+        assertNotNull(resourceTO);
+
+        resources = Arrays.asList(restTemplate.getForObject(
+                BASE_URL + "resource/list.json?connInstanceId=" + connId,
+                ResourceTO[].class));
+
+        assertEquals(1, resources.size());
+        // ----------------------------------
+
+        // ----------------------------------
+        // Check for spring bean.
+        // ----------------------------------
+        ConnInstanceTO connInstanceBean = restTemplate.getForObject(
+                BASE_URL + "connector/{resourceName}/connectorBean",
+                ConnInstanceTO.class, resourceTO.getName());
+
+        assertNotNull(connInstanceBean);
+        assertTrue(connInstanceBean.getCapabilities().isEmpty());
+        // ----------------------------------
+
+        // ----------------------------------
+        // Check for spring bean update after connector instance update.
+        // ----------------------------------
+        connInstanceTO.addCapability(ConnectorCapability.SEARCH);
+
+        ConnInstanceTO actual = (ConnInstanceTO) restTemplate.postForObject(
+                BASE_URL + "connector/update.json",
+                connInstanceTO, ConnInstanceTO.class);
+
+        assertNotNull(actual);
+        assertFalse(connInstanceTO.getCapabilities().isEmpty());
+
+        // check for spring bean update
+        connInstanceBean = restTemplate.getForObject(
+                BASE_URL + "connector/{resourceName}/connectorBean",
+                ConnInstanceTO.class, resourceTO.getName());
+
+        assertFalse(connInstanceBean.getCapabilities().isEmpty());
+        // ----------------------------------
+    }
+
+    @Test
     public void deleteWithException() {
         try {
             restTemplate.delete(

Modified: incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/ResourceTestITCase.java
URL: http://svn.apache.org/viewvc/incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/ResourceTestITCase.java?rev=1294694&r1=1294693&r2=1294694&view=diff
==============================================================================
--- incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/ResourceTestITCase.java (original)
+++ incubator/syncope/trunk/core/src/test/java/org/syncope/core/rest/ResourceTestITCase.java Tue Feb 28 15:36:04 2012
@@ -398,6 +398,17 @@ public class ResourceTestITCase extends 
     }
 
     @Test
+    public void listByType() {
+        List<ResourceTO> actuals = Arrays.asList(restTemplate.getForObject(
+                BASE_URL + "resource/list.json?connInstanceId=105",
+                ResourceTO[].class));
+
+        assertNotNull(actuals);
+        assertEquals(1, actuals.size());
+        assertNotNull(actuals.get(0));
+    }
+
+    @Test
     public void read() {
         ResourceTO actual = restTemplate.getForObject(
                 BASE_URL + "/resource/read/{resourceName}.json",