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