Enhancing Swagger friendliness for REST services
authorFrancesco Chicchiriccò <ilgrosso@apache.org>
Tue, 26 Dec 2017 15:53:45 +0000 (16:53 +0100)
committerFrancesco Chicchiriccò <ilgrosso@apache.org>
Tue, 26 Dec 2017 16:25:46 +0000 (17:25 +0100)
89 files changed:
client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
client/console/src/main/java/org/apache/syncope/client/console/commons/AnyDataProvider.java
client/console/src/main/java/org/apache/syncope/client/console/commons/ResourceStatusDataProvider.java
client/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java
client/console/src/main/java/org/apache/syncope/client/console/panels/search/AnySelectionDirectoryPanel.java
client/console/src/main/java/org/apache/syncope/client/console/rest/AbstractAnyRestClient.java
client/console/src/main/java/org/apache/syncope/client/console/rest/AnyObjectRestClient.java
client/console/src/main/java/org/apache/syncope/client/console/rest/GroupRestClient.java
client/console/src/main/java/org/apache/syncope/client/console/rest/UserRestClient.java
client/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusDirectoryPanel.java
client/console/src/main/java/org/apache/syncope/client/console/status/AnyStatusModal.java
client/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusDirectoryPanel.java
client/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusModal.java
client/console/src/main/java/org/apache/syncope/client/console/status/StatusModal.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AccessTokenService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyObjectService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeClassService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/AnyTypeService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConfigurationService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorHistoryService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ConnectorService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/DomainService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/DynRealmService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ExecutableService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/GroupService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ImplementationService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/LoggerService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/MailTemplateService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/NotificationService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/PolicyService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/RelationshipTypeService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ReportService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ReportTemplateService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceHistoryService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ResourceService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/RoleService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SchemaService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SecurityQuestionService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/TaskService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/UserSelfService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/UserService.java
common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/WorkflowService.java
core/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java
core/logic/src/main/java/org/apache/syncope/core/logic/AnyObjectLogic.java
core/logic/src/main/java/org/apache/syncope/core/logic/GroupLogic.java
core/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractAnyService.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractExecutableService.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AccessTokenServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AnyObjectServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AnyTypeClassServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AnyTypeServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConfigurationServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorHistoryServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ConnectorServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/DomainServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/DynRealmServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/GroupServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ImplementationServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/LoggerServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/MailTemplateServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/NotificationServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/PolicyServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RelationshipTypeServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ReportServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ReportTemplateServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceHistoryServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RoleServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SchemaServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SecurityQuestionServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/TaskServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserSelfServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserServiceImpl.java
core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/WorkflowServiceImpl.java
ext/camel/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/CamelRouteService.java
ext/camel/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/CamelRouteServiceImpl.java
ext/saml2sp/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SAML2IdPService.java
ext/saml2sp/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SAML2SPService.java
ext/saml2sp/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SAML2IdPServiceImpl.java
ext/saml2sp/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SAML2SPServiceImpl.java
ext/scimv2/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SCIMConfService.java
ext/scimv2/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SCIMConfServiceImpl.java
ext/scimv2/scim-rest-cxf/src/main/java/org/apache/syncope/ext/scimv2/cxf/service/UserServiceImpl.java
fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthenticationITCase.java
fit/core-reference/src/test/java/org/apache/syncope/fit/core/MultitenancyITCase.java
fit/core-reference/src/test/java/org/apache/syncope/fit/core/SCIMITCase.java
fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserITCase.java

index 0445f83..b941280 100644 (file)
@@ -184,8 +184,8 @@ public class BulkContent<T extends Serializable, S> extends MultilevelPanel.Seco
                                 throw new IllegalArgumentException("Invalid bulk action executor");
                             }
 
-                            final AbstractAnyRestClient<?, ?> anyRestClient = AbstractAnyRestClient.class.cast(
-                                    bulkActionExecutor);
+                            final AbstractAnyRestClient<?> anyRestClient = AbstractAnyRestClient.class.
+                                    cast(bulkActionExecutor);
 
                             // Group bean information by anyKey
                             final Map<String, List<StatusBean>> beans = new HashMap<>();
index 8b3c67b..ff4161c 100644 (file)
@@ -42,7 +42,7 @@ public class AnyDataProvider<A extends AnyTO> extends DirectoryDataProvider<A> {
 
     private final SortableAnyProviderComparator<A> comparator;
 
-    private final AbstractAnyRestClient<A, ?> restClient;
+    private final AbstractAnyRestClient<A> restClient;
 
     protected String fiql;
 
@@ -55,7 +55,7 @@ public class AnyDataProvider<A extends AnyTO> extends DirectoryDataProvider<A> {
     private final PageReference pageRef;
 
     public AnyDataProvider(
-            final AbstractAnyRestClient<A, ?> restClient,
+            final AbstractAnyRestClient<A> restClient,
             final int paginatorRows,
             final boolean filtered,
             final String realm,
index f925271..3ce39ea 100644 (file)
@@ -48,7 +48,7 @@ public class ResourceStatusDataProvider extends DirectoryDataProvider<StatusBean
 
     private final SortableDataProviderComparator<StatusBean> comparator;
 
-    private final AbstractAnyRestClient<? extends AnyTO, ?> restClient;
+    private final AbstractAnyRestClient<? extends AnyTO> restClient;
 
     protected String fiql;
 
index bc2e99f..427953b 100644 (file)
@@ -61,7 +61,7 @@ import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.model.util.ListModel;
 import org.springframework.util.ReflectionUtils;
 
-public abstract class AnyDirectoryPanel<A extends AnyTO, E extends AbstractAnyRestClient<A, ?>>
+public abstract class AnyDirectoryPanel<A extends AnyTO, E extends AbstractAnyRestClient<A>>
         extends DirectoryPanel<A, AnyWrapper<A>, AnyDataProvider<A>, E> {
 
     private static final long serialVersionUID = -1100228004207271270L;
@@ -234,7 +234,7 @@ public abstract class AnyDirectoryPanel<A extends AnyTO, E extends AbstractAnyRe
         List<AnyTypeClassTO> getAnyTypeClassTOs();
     }
 
-    public abstract static class Builder<A extends AnyTO, E extends AbstractAnyRestClient<A, ?>>
+    public abstract static class Builder<A extends AnyTO, E extends AbstractAnyRestClient<A>>
             extends DirectoryPanel.Builder<A, AnyWrapper<A>, E>
             implements AnyDirectoryPanelBuilder {
 
index 7eeb59c..3ce4143 100644 (file)
@@ -35,7 +35,7 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.model.IModel;
 
-public abstract class AnySelectionDirectoryPanel<A extends AnyTO, E extends AbstractAnyRestClient<A, ?>>
+public abstract class AnySelectionDirectoryPanel<A extends AnyTO, E extends AbstractAnyRestClient<A>>
         extends AnyDirectoryPanel<A, E> {
 
     private static final long serialVersionUID = -1100228004207271272L;
@@ -71,7 +71,7 @@ public abstract class AnySelectionDirectoryPanel<A extends AnyTO, E extends Abst
         return Collections.<ActionType>emptyList();
     }
 
-    public abstract static class Builder<A extends AnyTO, E extends AbstractAnyRestClient<A, ?>>
+    public abstract static class Builder<A extends AnyTO, E extends AbstractAnyRestClient<A>>
             extends AnyDirectoryPanel.Builder<A, E> {
 
         private static final long serialVersionUID = 5460024856989891156L;
index 4796ddb..4cfdddb 100644 (file)
@@ -20,10 +20,8 @@ package org.apache.syncope.client.console.rest;
 
 import java.util.List;
 import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
 import org.apache.syncope.client.console.commons.status.StatusBean;
 import org.apache.syncope.client.console.commons.status.StatusUtils;
-import org.apache.syncope.common.lib.patch.AnyPatch;
 import org.apache.syncope.common.lib.patch.AssociationPatch;
 import org.apache.syncope.common.lib.patch.DeassociationPatch;
 import org.apache.syncope.common.lib.patch.StatusPatch;
@@ -36,11 +34,11 @@ import org.apache.syncope.common.lib.types.ResourceDeassociationAction;
 import org.apache.syncope.common.rest.api.service.AnyService;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 
-public abstract class AbstractAnyRestClient<TO extends AnyTO, P extends AnyPatch> extends BaseRestClient {
+public abstract class AbstractAnyRestClient<TO extends AnyTO> extends BaseRestClient {
 
     private static final long serialVersionUID = 1962529678091410544L;
 
-    protected abstract Class<? extends AnyService<TO, P>> getAnyServiceClass();
+    protected abstract Class<? extends AnyService<TO>> getAnyServiceClass();
 
     public abstract int searchCount(String realm, String fiql, String type);
 
@@ -50,23 +48,6 @@ public abstract class AbstractAnyRestClient<TO extends AnyTO, P extends AnyPatch
         return getService(getAnyServiceClass()).read(key);
     }
 
-    public ProvisioningResult<TO> create(final TO to) {
-        Response response = getService(getAnyServiceClass()).create(to);
-        return response.readEntity(new GenericType<ProvisioningResult<TO>>() {
-        });
-    }
-
-    public ProvisioningResult<TO> update(final String etag, final P patch) {
-        ProvisioningResult<TO> result;
-        synchronized (this) {
-            result = getService(etag, getAnyServiceClass()).update(patch).
-                    readEntity(new GenericType<ProvisioningResult<TO>>() {
-                    });
-            resetClient(getAnyServiceClass());
-        }
-        return result;
-    }
-
     public ProvisioningResult<TO> delete(final String etag, final String key) {
         ProvisioningResult<TO> result;
         synchronized (this) {
@@ -81,7 +62,7 @@ public abstract class AbstractAnyRestClient<TO extends AnyTO, P extends AnyPatch
     public BulkActionResult unlink(final String etag, final String key, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
-            AnyService<?, ?> service = getService(etag, getAnyServiceClass());
+            AnyService<?> service = getService(etag, getAnyServiceClass());
 
             DeassociationPatch deassociationPatch = new DeassociationPatch.Builder().key(key).
                     action(ResourceDeassociationAction.UNLINK).
@@ -97,7 +78,7 @@ public abstract class AbstractAnyRestClient<TO extends AnyTO, P extends AnyPatch
     public BulkActionResult link(final String etag, final String key, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
-            AnyService<?, ?> service = getService(etag, getAnyServiceClass());
+            AnyService<?> service = getService(etag, getAnyServiceClass());
 
             StatusPatch statusPatch = StatusUtils.buildStatusPatch(statuses);
 
@@ -116,7 +97,7 @@ public abstract class AbstractAnyRestClient<TO extends AnyTO, P extends AnyPatch
     public BulkActionResult deprovision(final String etag, final String key, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
-            AnyService<?, ?> service = getService(etag, getAnyServiceClass());
+            AnyService<?> service = getService(etag, getAnyServiceClass());
 
             DeassociationPatch deassociationPatch = new DeassociationPatch.Builder().key(key).
                     action(ResourceDeassociationAction.DEPROVISION).
@@ -132,7 +113,7 @@ public abstract class AbstractAnyRestClient<TO extends AnyTO, P extends AnyPatch
     public BulkActionResult provision(final String etag, final String key, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
-            AnyService<?, ?> service = getService(etag, getAnyServiceClass());
+            AnyService<?> service = getService(etag, getAnyServiceClass());
 
             StatusPatch statusPatch = StatusUtils.buildStatusPatch(statuses);
 
@@ -151,7 +132,7 @@ public abstract class AbstractAnyRestClient<TO extends AnyTO, P extends AnyPatch
     public BulkActionResult unassign(final String etag, final String key, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
-            AnyService<?, ?> service = getService(etag, getAnyServiceClass());
+            AnyService<?> service = getService(etag, getAnyServiceClass());
 
             DeassociationPatch deassociationPatch = new DeassociationPatch.Builder().key(key).
                     action(ResourceDeassociationAction.UNASSIGN).
@@ -167,7 +148,7 @@ public abstract class AbstractAnyRestClient<TO extends AnyTO, P extends AnyPatch
     public BulkActionResult assign(final String etag, final String key, final List<StatusBean> statuses) {
         BulkActionResult result;
         synchronized (this) {
-            AnyService<?, ?> service = getService(etag, getAnyServiceClass());
+            AnyService<?> service = getService(etag, getAnyServiceClass());
 
             StatusPatch statusPatch = StatusUtils.buildStatusPatch(statuses);
 
index 4e6092c..31cd3a8 100644 (file)
  */
 package org.apache.syncope.client.console.rest;
 
+import static org.apache.syncope.client.console.rest.BaseRestClient.getService;
+
 import java.util.List;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.patch.AnyObjectPatch;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
+import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.rest.api.beans.AnyQuery;
 import org.apache.syncope.common.rest.api.service.AnyObjectService;
 import org.apache.syncope.common.rest.api.service.AnyService;
@@ -29,15 +34,32 @@ import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 /**
  * Console client for invoking Rest any type class services.
  */
-public class AnyObjectRestClient extends AbstractAnyRestClient<AnyObjectTO, AnyObjectPatch> {
+public class AnyObjectRestClient extends AbstractAnyRestClient<AnyObjectTO> {
 
     private static final long serialVersionUID = -8874495991295283249L;
 
     @Override
-    protected Class<? extends AnyService<AnyObjectTO, AnyObjectPatch>> getAnyServiceClass() {
+    protected Class<? extends AnyService<AnyObjectTO>> getAnyServiceClass() {
         return AnyObjectService.class;
     }
 
+    public ProvisioningResult<AnyObjectTO> create(final AnyObjectTO anyObjectTO) {
+        Response response = getService(AnyObjectService.class).create(anyObjectTO);
+        return response.readEntity(new GenericType<ProvisioningResult<AnyObjectTO>>() {
+        });
+    }
+
+    public ProvisioningResult<AnyObjectTO> update(final String etag, final AnyObjectPatch patch) {
+        ProvisioningResult<AnyObjectTO> result;
+        synchronized (this) {
+            result = getService(etag, AnyObjectService.class).update(patch).
+                    readEntity(new GenericType<ProvisioningResult<AnyObjectTO>>() {
+                    });
+            resetClient(getAnyServiceClass());
+        }
+        return result;
+    }
+
     @Override
     public int searchCount(final String realm, final String fiql, final String type) {
         return getService(AnyObjectService.class).
@@ -52,6 +74,6 @@ public class AnyObjectRestClient extends AbstractAnyRestClient<AnyObjectTO, AnyO
 
         return getService(AnyObjectService.class).search(
                 new AnyQuery.Builder().realm(realm).fiql(fiql).page(page).size(size).
-                orderBy(toOrderBy(sort)).details(false).build()).getResult();
+                        orderBy(toOrderBy(sort)).details(false).build()).getResult();
     }
 }
index 60ec367..c7ff004 100644 (file)
@@ -20,9 +20,12 @@ package org.apache.syncope.client.console.rest;
 
 import java.util.ArrayList;
 import java.util.List;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.patch.GroupPatch;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.PagedResult;
+import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.types.BulkMembersActionType;
 import org.apache.syncope.common.rest.api.beans.AnyQuery;
 import org.apache.syncope.common.rest.api.service.AnyService;
@@ -32,15 +35,32 @@ import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 /**
  * Console client for invoking Rest Group's services.
  */
-public class GroupRestClient extends AbstractAnyRestClient<GroupTO, GroupPatch> {
+public class GroupRestClient extends AbstractAnyRestClient<GroupTO> {
 
     private static final long serialVersionUID = -8549081557283519638L;
 
     @Override
-    protected Class<? extends AnyService<GroupTO, GroupPatch>> getAnyServiceClass() {
+    protected Class<? extends AnyService<GroupTO>> getAnyServiceClass() {
         return GroupService.class;
     }
 
+    public ProvisioningResult<GroupTO> create(final GroupTO groupTO) {
+        Response response = getService(GroupService.class).create(groupTO);
+        return response.readEntity(new GenericType<ProvisioningResult<GroupTO>>() {
+        });
+    }
+
+    public ProvisioningResult<GroupTO> update(final String etag, final GroupPatch patch) {
+        ProvisioningResult<GroupTO> result;
+        synchronized (this) {
+            result = getService(etag, GroupService.class).update(patch).
+                    readEntity(new GenericType<ProvisioningResult<GroupTO>>() {
+                    });
+            resetClient(getAnyServiceClass());
+        }
+        return result;
+    }
+
     @Override
     public int searchCount(final String realm, final String fiql, final String type) {
         return getService(GroupService.class).
index 68e3a01..b64ff9b 100644 (file)
@@ -42,12 +42,12 @@ import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 /**
  * Console client for invoking rest users services.
  */
-public class UserRestClient extends AbstractAnyRestClient<UserTO, UserPatch> {
+public class UserRestClient extends AbstractAnyRestClient<UserTO> {
 
     private static final long serialVersionUID = -1575748964398293968L;
 
     @Override
-    protected Class<? extends AnyService<UserTO, UserPatch>> getAnyServiceClass() {
+    protected Class<? extends AnyService<UserTO>> getAnyServiceClass() {
         return UserService.class;
     }
 
@@ -57,6 +57,17 @@ public class UserRestClient extends AbstractAnyRestClient<UserTO, UserPatch> {
         });
     }
 
+    public ProvisioningResult<UserTO> update(final String etag, final UserPatch patch) {
+        ProvisioningResult<UserTO> result;
+        synchronized (this) {
+            result = getService(etag, UserService.class).update(patch).
+                    readEntity(new GenericType<ProvisioningResult<UserTO>>() {
+                    });
+            resetClient(getAnyServiceClass());
+        }
+        return result;
+    }
+
     @Override
     public int searchCount(final String realm, final String fiql, final String type) {
         return getService(UserService.class).
index 124a3c4..9f9dbd8 100644 (file)
@@ -59,7 +59,7 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.StringResourceModel;
 
 public class AnyStatusDirectoryPanel
-        extends DirectoryPanel<StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?, ?>>
+        extends DirectoryPanel<StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?>>
         implements ModalPanel {
 
     private static final long serialVersionUID = -9148734710505211261L;
index 3d069f0..c51981c 100644 (file)
@@ -42,7 +42,7 @@ public class AnyStatusModal<T extends AnyTO> extends StatusModal<T> {
 
     @Override
     protected DirectoryPanel<
-        StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?, ?>> getStatusDirectoryPanel(
+        StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?>> getStatusDirectoryPanel(
             final MultilevelPanel mlp,
             final BaseModal<?> baseModal,
             final PageReference pageReference,
index 3d50d63..a37ab4a 100644 (file)
@@ -50,7 +50,7 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.StringResourceModel;
 
 public class ResourceStatusDirectoryPanel
-        extends DirectoryPanel<StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?, ?>>
+        extends DirectoryPanel<StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?>>
         implements ModalPanel {
 
     private static final long serialVersionUID = -9148734710505211261L;
index 0596ea3..25badd6 100644 (file)
@@ -74,7 +74,7 @@ public class ResourceStatusModal extends StatusModal<ResourceTO> {
 
     @Override
     protected DirectoryPanel<
-        StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?, ?>> getStatusDirectoryPanel(
+        StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?>> getStatusDirectoryPanel(
             final MultilevelPanel mlp,
             final BaseModal<?> baseModal,
             final PageReference pageReference,
index 1059919..baba5a5 100644 (file)
@@ -52,7 +52,7 @@ public abstract class StatusModal<T extends Serializable> extends Panel implemen
     }
 
     protected abstract DirectoryPanel<
-        StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?, ?>> getStatusDirectoryPanel(
+        StatusBean, StatusBean, DirectoryDataProvider<StatusBean>, AbstractAnyRestClient<?>> getStatusDirectoryPanel(
             final MultilevelPanel mlp,
             final BaseModal<?> baseModal,
             final PageReference pageReference,
index e9f5ff3..c66b7f3 100644 (file)
@@ -57,10 +57,12 @@ public interface AccessTokenService extends JAXRSService {
 
     /**
      * Invalidates the access token of the requesting user.
+     *
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("logout")
-    void logout();
+    Response logout();
 
     /**
      * Returns a paged list of existing access tokens matching the given query.
@@ -75,8 +77,9 @@ public interface AccessTokenService extends JAXRSService {
      * Invalidates the access token matching the provided key.
      *
      * @param key access token key
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@PathParam("key") String key);
+    Response delete(@PathParam("key") String key);
 }
index 4127345..144fcf2 100644 (file)
  */
 package org.apache.syncope.common.rest.api.service;
 
+import javax.validation.constraints.NotNull;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.apache.cxf.jaxrs.ext.PATCH;
 import org.apache.syncope.common.lib.patch.AnyObjectPatch;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 
@@ -26,5 +34,43 @@ import org.apache.syncope.common.lib.to.AnyObjectTO;
  * REST operations for anyObjects.
  */
 @Path("anyObjects")
-public interface AnyObjectService extends AnyService<AnyObjectTO, AnyObjectPatch> {
+public interface AnyObjectService extends AnyService<AnyObjectTO> {
+
+    /**
+     * Creates a new any object.
+     *
+     * @param anyObjectTO any object to be created
+     * @return Response object featuring Location header of created any object as well as the any
+     * object itself enriched with propagation status information - ProvisioningResult as Entity
+     */
+    @POST
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    Response create(@NotNull AnyObjectTO anyObjectTO);
+
+    /**
+     * Updates any object matching the provided key.
+     *
+     * @param anyObjectPatch modification to be applied to any object matching the provided key
+     * @return Response object featuring the updated any object enriched with propagation status information
+     * - ProvisioningResult as Entity
+     */
+    @PATCH
+    @Path("{key}")
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    Response update(@NotNull AnyObjectPatch anyObjectPatch);
+
+    /**
+     * Updates any object matching the provided key.
+     *
+     * @param anyObjectTO complete update
+     * @return Response object featuring the updated any object enriched with propagation status information
+     * - ProvisioningResult as Entity
+     */
+    @PUT
+    @Path("{key}")
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    Response update(@NotNull AnyObjectTO anyObjectTO);
 }
index ac2fc20..a72cc16 100644 (file)
@@ -31,8 +31,6 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import org.apache.cxf.jaxrs.ext.PATCH;
-import org.apache.syncope.common.lib.patch.AnyPatch;
 import org.apache.syncope.common.lib.patch.AssociationPatch;
 import org.apache.syncope.common.lib.patch.DeassociationPatch;
 import org.apache.syncope.common.lib.to.AnyTO;
@@ -42,7 +40,7 @@ import org.apache.syncope.common.lib.to.PagedResult;
 import org.apache.syncope.common.lib.types.SchemaType;
 import org.apache.syncope.common.rest.api.beans.AnyQuery;
 
-public interface AnyService<TO extends AnyTO, P extends AnyPatch> extends JAXRSService {
+public interface AnyService<TO extends AnyTO> extends JAXRSService {
 
     /**
      * Reads the list of attributes owned by the given any object for the given schema type.
@@ -103,31 +101,6 @@ public interface AnyService<TO extends AnyTO, P extends AnyPatch> extends JAXRSS
     PagedResult<TO> search(@BeanParam AnyQuery anyQuery);
 
     /**
-     * Creates a new any object.
-     *
-     * @param anyTO any object to be created
-     * @return Response object featuring Location header of created any object as well as the any
-     * object itself enriched with propagation status information - ProvisioningResult as Entity
-     */
-    @POST
-    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    Response create(@NotNull TO anyTO);
-
-    /**
-     * Updates any object matching the provided key.
-     *
-     * @param anyPatch modification to be applied to any object matching the provided key
-     * @return Response object featuring the updated any object enriched with propagation status information
-     * - ProvisioningResult as Entity
-     */
-    @PATCH
-    @Path("{key}")
-    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    Response update(@NotNull P anyPatch);
-
-    /**
      * Adds or replaces the attribute, owned by the given any object, for the given schema type and schema.
      *
      * @param key any object key or name
@@ -145,30 +118,18 @@ public interface AnyService<TO extends AnyTO, P extends AnyPatch> extends JAXRSS
             @NotNull AttrTO attrTO);
 
     /**
-     * Updates any object matching the provided key.
-     *
-     * @param anyTO complete update
-     * @return Response object featuring the updated any object enriched with propagation status information
-     * - ProvisioningResult as Entity
-     */
-    @PUT
-    @Path("{key}")
-    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    Response update(@NotNull TO anyTO);
-
-    /**
      * Deletes the attribute, owned by the given any object, for the given schema type and schema.
      *
      * @param key any object key or name
      * @param schemaType schema type
      * @param schema schema
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}/{schemaType}/{schema}")
     @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void delete(
+    Response delete(
             @NotNull @PathParam("key") String key,
             @NotNull @PathParam("schemaType") SchemaType schemaType,
             @NotNull @PathParam("schema") String schema);
index 3a91e4a..74846a1 100644 (file)
@@ -72,18 +72,20 @@ public interface AnyTypeClassService extends JAXRSService {
      * Updates the anyTypeClass matching the provided key.
      *
      * @param anyTypeClassTO anyTypeClass to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull AnyTypeClassTO anyTypeClassTO);
+    Response update(@NotNull AnyTypeClassTO anyTypeClassTO);
 
     /**
      * Deletes the anyTypeClass matching the provided key.
      *
      * @param key anyTypeClass key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 }
index aa639e8..667009c 100644 (file)
@@ -72,18 +72,20 @@ public interface AnyTypeService extends JAXRSService {
      * Updates the anyType matching the provided key.
      *
      * @param anyTypeTO anyType to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull AnyTypeTO anyTypeTO);
+    Response update(@NotNull AnyTypeTO anyTypeTO);
 
     /**
      * Deletes the anyType matching the provided key.
      *
      * @param key anyType key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 }
index 41466e2..add8bd2 100644 (file)
@@ -70,19 +70,21 @@ public interface ConfigurationService extends JAXRSService {
      * Creates / updates the configuration parameter with the given schema.
      *
      * @param value parameter value
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{schema}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void set(@NotNull AttrTO value);
+    Response set(@NotNull AttrTO value);
 
     /**
      * Deletes the configuration parameter with matching schema.
      *
      * @param schema configuration parameter schema
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{schema}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void delete(@NotNull @PathParam("schema") String schema);
+    Response delete(@NotNull @PathParam("schema") String schema);
 }
index 1825d08..f7f0466 100644 (file)
@@ -27,6 +27,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.to.ConnInstanceHistoryConfTO;
 
 /**
@@ -50,17 +51,19 @@ public interface ConnectorHistoryService extends JAXRSService {
      * Restores the connector configuration history instance matching the provided key.
      *
      * @param key connector configuration history instance key to be restored
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("{key}")
-    void restore(@NotNull @PathParam("key") String key);
+    Response restore(@NotNull @PathParam("key") String key);
 
     /**
      * Deletes the connector configuration history instance matching the provided key.
      *
      * @param key connector configuration history instance key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 }
index 4c63bd2..4a1adfe 100644 (file)
@@ -123,35 +123,40 @@ public interface ConnectorService extends JAXRSService {
      * Updates the connector instance matching the provided key.
      *
      * @param connInstanceTO connector instance to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull ConnInstanceTO connInstanceTO);
+    Response update(@NotNull ConnInstanceTO connInstanceTO);
 
     /**
      * Deletes the connector instance matching the provided key.
      *
      * @param key connector instance key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Checks whether the connection to resource could be established.
      *
      * @param connInstanceTO connector instance to be used for connection check
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("check")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void check(@NotNull ConnInstanceTO connInstanceTO);
+    Response check(@NotNull ConnInstanceTO connInstanceTO);
 
     /**
      * Reload all connector bundles and instances.
+     *
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("reload")
-    void reload();
+    Response reload();
 }
index 3443ff6..2e343b9 100644 (file)
@@ -72,18 +72,20 @@ public interface DomainService extends JAXRSService {
      * Updates the domain matching the provided key.
      *
      * @param domainTO domain to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull DomainTO domainTO);
+    Response update(@NotNull DomainTO domainTO);
 
     /**
      * Deletes the domain matching the provided key.
      *
      * @param key domain key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 }
index dc9836d..1ebea81 100644 (file)
@@ -72,19 +72,21 @@ public interface DynRealmService extends JAXRSService {
      * Updates the dynamic realm matching the provided key.
      *
      * @param dynDynRealmTO dynamic realm to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull DynRealmTO dynDynRealmTO);
+    Response update(@NotNull DynRealmTO dynDynRealmTO);
 
     /**
      * Deletes the dynamic realm matching the provided key.
      *
      * @param key dynamic realm key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
 }
index b97f252..11fd1dc 100644 (file)
@@ -31,6 +31,7 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ExecTO;
 import org.apache.syncope.common.lib.to.JobTO;
@@ -68,10 +69,11 @@ public interface ExecutableService extends JAXRSService {
      * Deletes the executable execution matching the provided key.
      *
      * @param executionKey key of executable execution to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("executions/{executionKey}")
-    void deleteExecution(@NotNull @PathParam("executionKey") String executionKey);
+    Response deleteExecution(@NotNull @PathParam("executionKey") String executionKey);
 
     /**
      * Deletes the executions belonging matching the given query.
@@ -110,8 +112,9 @@ public interface ExecutableService extends JAXRSService {
      *
      * @param key executable key
      * @param action action to execute
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("jobs/{key}")
-    void actionJob(@NotNull @PathParam("key") String key, @QueryParam("action") JobAction action);
+    Response actionJob(@NotNull @PathParam("key") String key, @QueryParam("action") JobAction action);
 }
index 549b41a..c060bdb 100644 (file)
@@ -20,12 +20,16 @@ package org.apache.syncope.common.rest.api.service;
 
 import java.util.List;
 import javax.validation.constraints.NotNull;
+import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.apache.cxf.jaxrs.ext.PATCH;
 import org.apache.syncope.common.lib.patch.GroupPatch;
 import org.apache.syncope.common.lib.to.ExecTO;
 import org.apache.syncope.common.lib.to.GroupTO;
@@ -35,10 +39,48 @@ import org.apache.syncope.common.lib.types.BulkMembersActionType;
  * REST operations for groups.
  */
 @Path("groups")
-public interface GroupService extends AnyService<GroupTO, GroupPatch> {
+public interface GroupService extends AnyService<GroupTO> {
 
     /**
-     * This method is similar to read() but uses different authentication handling to ensure that a user
+     * Creates a new group.
+     *
+     * @param groupTO group to be created
+     * @return Response object featuring Location header of created group as well as the any
+     * object itself enriched with propagation status information - ProvisioningResult as Entity
+     */
+    @POST
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    Response create(@NotNull GroupTO groupTO);
+
+    /**
+     * Updates group matching the provided key.
+     *
+     * @param groupPatch modification to be applied to group matching the provided key
+     * @return Response object featuring the updated group enriched with propagation status information
+     * - ProvisioningResult as Entity
+     */
+    @PATCH
+    @Path("{key}")
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    Response update(@NotNull GroupPatch groupPatch);
+
+    /**
+     * Updates group matching the provided key.
+     *
+     * @param groupTO complete update
+     * @return Response object featuring the updated group enriched with propagation status information
+     * - ProvisioningResult as Entity
+     */
+    @PUT
+    @Path("{key}")
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    Response update(@NotNull GroupTO groupTO);
+
+    /**
+     * This method is similar to read() but uses different authentication handling to ensure that a group
      * can read his own groups.
      *
      * @return own groups
index 4dffa0d..9ff8413 100644 (file)
@@ -75,18 +75,20 @@ public interface ImplementationService extends JAXRSService {
      * Updates an existing implementation.
      *
      * @param implementationTO implementation.
+     * @return an empty response if operation was successful
      */
     @PUT
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull ImplementationTO implementationTO);
+    Response update(@NotNull ImplementationTO implementationTO);
 
     /**
      * Deletes the implementation matching the given key.
      *
      * @param key key for implementation to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
 }
index 4b9aa83..b1d889c 100644 (file)
@@ -28,6 +28,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.log.EventCategoryTO;
 import org.apache.syncope.common.lib.log.LogAppender;
 import org.apache.syncope.common.lib.log.LogStatementTO;
@@ -99,20 +100,22 @@ public interface LoggerService extends JAXRSService {
      *
      * @param type LoggerType to be selected
      * @param logger Logger to be created or updated
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{type}/{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull @PathParam("type") LoggerType type, @NotNull LoggerTO logger);
+    Response update(@NotNull @PathParam("type") LoggerType type, @NotNull LoggerTO logger);
 
     /**
      * Deletes the logger with matching name.
      *
      * @param type LoggerType to be selected
      * @param name Logger name to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{type}/{name}")
-    void delete(@NotNull @PathParam("type") LoggerType type, @NotNull @PathParam("name") String name);
+    Response delete(@NotNull @PathParam("type") LoggerType type, @NotNull @PathParam("name") String name);
 
 }
index 15f7703..1cd8e73 100644 (file)
@@ -74,10 +74,11 @@ public interface MailTemplateService extends JAXRSService {
      * Deletes the mail template matching the given key.
      *
      * @param key key for mail template to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Gets the template for the given key and format, if available.
@@ -98,10 +99,11 @@ public interface MailTemplateService extends JAXRSService {
      * @param key mail template
      * @param format template format
      * @param templateIn template to be set
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}/{format}")
-    void setFormat(
+    Response setFormat(
             @NotNull @PathParam("key") String key,
             @NotNull @PathParam("format") MailTemplateFormat format,
             InputStream templateIn);
@@ -111,10 +113,11 @@ public interface MailTemplateService extends JAXRSService {
      *
      * @param key mail template
      * @param format template format
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}/{format}")
-    void removeFormat(
+    Response removeFormat(
             @NotNull @PathParam("key") String key,
             @NotNull @PathParam("format") MailTemplateFormat format);
 
index 3baf310..458ae63 100644 (file)
@@ -75,20 +75,22 @@ public interface NotificationService extends JAXRSService {
      * Updates the notification matching the given key.
      *
      * @param notificationTO notification to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull NotificationTO notificationTO);
+    Response update(@NotNull NotificationTO notificationTO);
 
     /**
      * Deletes the notification matching the given key.
      *
      * @param key key for notification to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Returns details about notification job.
@@ -104,8 +106,9 @@ public interface NotificationService extends JAXRSService {
      * Executes an action on the notification job.
      *
      * @param action action to execute
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("job")
-    void actionJob(@QueryParam("action") JobAction action);
+    Response actionJob(@QueryParam("action") JobAction action);
 }
index 2177d51..7c62196 100644 (file)
@@ -77,19 +77,21 @@ public interface PolicyService extends JAXRSService {
      * Updates policy matching the given key.
      *
      * @param policyTO Policy to replace existing policy
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull AbstractPolicyTO policyTO);
+    Response update(@NotNull AbstractPolicyTO policyTO);
 
     /**
      * Delete policy matching the given key.
      *
      * @param key key of policy to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
 }
index 4b3c640..dfd516f 100644 (file)
@@ -72,18 +72,20 @@ public interface RelationshipTypeService extends JAXRSService {
      * Updates the relationshipType matching the provided key.
      *
      * @param relationshipTypeTO relationshipType to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull RelationshipTypeTO relationshipTypeTO);
+    Response update(@NotNull RelationshipTypeTO relationshipTypeTO);
 
     /**
      * Deletes the relationshipType matching the provided key.
      *
      * @param key relationshipType key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 }
index cf79682..4db9321 100644 (file)
@@ -74,20 +74,22 @@ public interface ReportService extends ExecutableService {
      * Updates report with matching key.
      *
      * @param reportTO report to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull ReportTO reportTO);
+    Response update(@NotNull ReportTO reportTO);
 
     /**
      * Deletes report with matching key.
      *
      * @param key Deletes report with matching key
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Exports the report execution with matching key in the requested format.
index 12c197a..6bfb151 100644 (file)
@@ -74,10 +74,11 @@ public interface ReportTemplateService extends JAXRSService {
      * Deletes the report template matching the given key.
      *
      * @param key key for report template to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Gets the template for the given key and format, if available.
@@ -85,6 +86,7 @@ public interface ReportTemplateService extends JAXRSService {
      * @param key report template
      * @param format template format
      * @return report template with matching key and format, if available
+     * @return an empty response if operation was successful
      */
     @GET
     @Path("{key}/{format}")
@@ -98,10 +100,11 @@ public interface ReportTemplateService extends JAXRSService {
      * @param key report template
      * @param format template format
      * @param templateIn template to be set
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}/{format}")
-    void setFormat(
+    Response setFormat(
             @NotNull @PathParam("key") String key,
             @NotNull @PathParam("format") ReportTemplateFormat format,
             InputStream templateIn);
@@ -111,10 +114,11 @@ public interface ReportTemplateService extends JAXRSService {
      *
      * @param key report template
      * @param format template format
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}/{format}")
-    void removeFormat(
+    Response removeFormat(
             @NotNull @PathParam("key") String key,
             @NotNull @PathParam("format") ReportTemplateFormat format);
 
index fbf748a..67c8d58 100644 (file)
@@ -27,6 +27,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.to.ResourceHistoryConfTO;
 
 /**
@@ -50,17 +51,19 @@ public interface ResourceHistoryService extends JAXRSService {
      * Restores the resource configuration history matching the provided key.
      *
      * @param key resource configuration history key to be restored
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("{key}")
-    void restore(@NotNull @PathParam("key") String key);
+    Response restore(@NotNull @PathParam("key") String key);
 
     /**
      * Deletes the resource configuration history matching the provided key.
      *
      * @param key resource configuration history key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 }
index 1ec1f4f..e6adc5a 100644 (file)
@@ -111,11 +111,12 @@ public interface ResourceService extends JAXRSService {
      * Updates the resource matching the given name.
      *
      * @param resourceTO resource to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull ResourceTO resourceTO);
+    Response update(@NotNull ResourceTO resourceTO);
 
     /**
      * Queries the connector underlying the given resource for the latest sync token value associated to the given any
@@ -123,41 +124,49 @@ public interface ResourceService extends JAXRSService {
      *
      * @param key resource
      * @param anyTypeKey any type
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("{key}/{anyTypeKey}")
-    void setLatestSyncToken(@NotNull @PathParam("key") String key, @NotNull @PathParam("anyTypeKey") String anyTypeKey);
+    Response setLatestSyncToken(
+            @NotNull @PathParam("key") String key,
+            @NotNull @PathParam("anyTypeKey") String anyTypeKey);
 
     /**
      * Removes the sync token value associated to the given any type from the given resource.
      *
      * @param key resource
      * @param anyTypeKey any type
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}/{anyTypeKey}")
-    void removeSyncToken(@NotNull @PathParam("key") String key, @NotNull @PathParam("anyTypeKey") String anyTypeKey);
+    Response removeSyncToken(
+            @NotNull @PathParam("key") String key,
+            @NotNull @PathParam("anyTypeKey") String anyTypeKey);
 
     /**
      * Deletes the resource matching the given name.
      *
      * @param key name of resource to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Checks whether the connection to resource could be established.
      *
      * @param resourceTO resource to be checked
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("check")
     @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void check(@NotNull ResourceTO resourceTO);
+    Response check(@NotNull ResourceTO resourceTO);
 
     /**
      * De-associate any objects from the given resource.
index 782a3d2..557db76 100644 (file)
@@ -73,20 +73,22 @@ public interface RoleService extends JAXRSService {
      * Updates the role matching the provided key.
      *
      * @param roleTO role to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull RoleTO roleTO);
+    Response update(@NotNull RoleTO roleTO);
 
     /**
      * Deletes the role matching the provided key.
      *
      * @param key role key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Gets the console layout information as JSON string for the role with the given key, if available.
@@ -104,18 +106,20 @@ public interface RoleService extends JAXRSService {
      *
      * @param key role key
      * @param consoleLayoutInfoIn console layout information to be set
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}/consoleLayout")
     @Consumes({ MediaType.APPLICATION_JSON })
-    void setConsoleLayoutInfo(@NotNull @PathParam("key") String key, InputStream consoleLayoutInfoIn);
+    Response setConsoleLayoutInfo(@NotNull @PathParam("key") String key, InputStream consoleLayoutInfoIn);
 
     /**
      * Removes the console layout information for the role with the given key, if available.
      *
      * @param key role key
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}/consoleLayout")
-    void removeConsoleLayoutInfo(@NotNull @PathParam("key") String key);
+    Response removeConsoleLayoutInfo(@NotNull @PathParam("key") String key);
 }
index 1f9f9a0..51403bd 100644 (file)
@@ -84,19 +84,21 @@ public interface SchemaService extends JAXRSService {
      *
      * @param type type for schemas to be updated
      * @param schemaTO updated schema to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{type}/{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull @PathParam("type") SchemaType type, @NotNull AbstractSchemaTO schemaTO);
+    Response update(@NotNull @PathParam("type") SchemaType type, @NotNull AbstractSchemaTO schemaTO);
 
     /**
      * Deletes the schema matching the given type and key.
      *
      * @param type type for schema to be deleted
      * @param key name of schema to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{type}/{key}")
-    void delete(@NotNull @PathParam("type") SchemaType type, @NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("type") SchemaType type, @NotNull @PathParam("key") String key);
 }
index 08ebbfe..9b43250 100644 (file)
@@ -72,20 +72,22 @@ public interface SecurityQuestionService extends JAXRSService {
      * Updates the security question matching the provided key.
      *
      * @param securityQuestionTO security question to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull SecurityQuestionTO securityQuestionTO);
+    Response update(@NotNull SecurityQuestionTO securityQuestionTO);
 
     /**
      * Deletes the security question matching the provided key.
      *
      * @param key security question key to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Ask for security question configured for the user matching the given username, if any.
index 0d1bf41..205e6cd 100644 (file)
@@ -85,20 +85,22 @@ public interface TaskService extends ExecutableService {
      * Updates the task matching the provided key.
      *
      * @param taskTO updated task to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull AbstractTaskTO taskTO);
+    Response update(@NotNull AbstractTaskTO taskTO);
 
     /**
      * Deletes the task matching the provided key.
      *
      * @param key key of task to be deleted
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@NotNull @PathParam("key") String key);
+    Response delete(@NotNull @PathParam("key") String key);
 
     /**
      * Executes the provided bulk action.
index ff95a55..651c9d0 100644 (file)
@@ -116,10 +116,11 @@ public interface UserSelfService extends JAXRSService {
      *
      * @param username username for which the security answer is provided
      * @param securityAnswer actual answer text
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("requestPasswordReset")
-    void requestPasswordReset(@NotNull @QueryParam("username") String username, String securityAnswer);
+    Response requestPasswordReset(@NotNull @QueryParam("username") String username, String securityAnswer);
 
     /**
      * Reset the password value for the user matching the provided token, if available and still valid.
@@ -129,8 +130,9 @@ public interface UserSelfService extends JAXRSService {
      *
      * @param token password reset token
      * @param password new password to be set
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("confirmPasswordReset")
-    void confirmPasswordReset(@NotNull @QueryParam("token") String token, String password);
+    Response confirmPasswordReset(@NotNull @QueryParam("token") String token, String password);
 }
index 9157b27..310e631 100644 (file)
@@ -22,11 +22,13 @@ import javax.validation.constraints.NotNull;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DefaultValue;
 import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import org.apache.cxf.jaxrs.ext.PATCH;
 import org.apache.syncope.common.lib.patch.StatusPatch;
 import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.to.UserTO;
@@ -35,7 +37,7 @@ import org.apache.syncope.common.lib.to.UserTO;
  * REST operations for users.
  */
 @Path("users")
-public interface UserService extends AnyService<UserTO, UserPatch> {
+public interface UserService extends AnyService<UserTO> {
 
     /**
      * Creates a new user.
@@ -53,6 +55,32 @@ public interface UserService extends AnyService<UserTO, UserPatch> {
             @DefaultValue("true") @QueryParam("storePassword") boolean storePassword);
 
     /**
+     * Updates user matching the provided key.
+     *
+     * @param userPatch modification to be applied to user matching the provided key
+     * @return Response object featuring the updated user enriched with propagation status information
+     * - ProvisioningResult as Entity
+     */
+    @PATCH
+    @Path("{key}")
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    Response update(@NotNull UserPatch userPatch);
+
+    /**
+     * Updates user matching the provided key.
+     *
+     * @param userTO complete update
+     * @return Response object featuring the updated user enriched with propagation status information
+     * - ProvisioningResult as Entity
+     */
+    @PUT
+    @Path("{key}")
+    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+    Response update(@NotNull UserTO userTO);
+
+    /**
      * Performs a status update on given user.
      *
      * @param statusPatch status update details
index cb1cc4a..fcd6751 100644 (file)
@@ -83,11 +83,12 @@ public interface WorkflowService extends JAXRSService {
      * @param anyType any object type
      * @param key workflow definition key
      * @param definition workflow definition for matching kind
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{anyType}/{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void set(
+    Response set(
             @NotNull @PathParam("anyType") String anyType,
             @NotNull @PathParam("key") String key,
             @NotNull String definition);
@@ -97,10 +98,11 @@ public interface WorkflowService extends JAXRSService {
      *
      * @param anyType any object type
      * @param key workflow definition key
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{anyType}/{key}")
-    void delete(
+    Response delete(
             @NotNull @PathParam("anyType") String anyType,
             @NotNull @PathParam("key") String key);
 }
index fa3ca98..abff7a3 100644 (file)
@@ -247,15 +247,13 @@ public abstract class AbstractAnyLogic<TO extends AnyTO, P extends AnyPatch> ext
 
     public abstract TO read(String key);
 
-    public abstract ProvisioningResult<TO> create(TO anyTO, boolean nullPriorityAsync);
-
-    public abstract ProvisioningResult<TO> update(P anyPatch, boolean nullPriorityAsync);
-
-    public abstract ProvisioningResult<TO> delete(String key, boolean nullPriorityAsync);
-
     public abstract Pair<Integer, List<TO>> search(
             SearchCond searchCond,
             int page, int size, List<OrderByClause> orderBy,
             String realm,
             boolean details);
+
+    public abstract ProvisioningResult<TO> update(P anyPatch, boolean nullPriorityAsync);
+
+    public abstract ProvisioningResult<TO> delete(String key, boolean nullPriorityAsync);
 }
index 5857513..3acbc20 100644 (file)
@@ -99,7 +99,6 @@ public class AnyObjectLogic extends AbstractAnyLogic<AnyObjectTO, AnyObjectPatch
         return Pair.of(count, result);
     }
 
-    @Override
     public ProvisioningResult<AnyObjectTO> create(final AnyObjectTO anyObjectTO, final boolean nullPriorityAsync) {
         Pair<AnyObjectTO, List<LogicActions>> before = beforeCreate(anyObjectTO);
 
index 103dae8..cbda5b6 100644 (file)
@@ -173,7 +173,6 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, GroupPatch> {
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.GROUP_CREATE + "')")
-    @Override
     public ProvisioningResult<GroupTO> create(final GroupTO groupTO, final boolean nullPriorityAsync) {
         Pair<GroupTO, List<LogicActions>> before = beforeCreate(groupTO);
 
index 2b0b5cc..b4fb038 100644 (file)
@@ -125,12 +125,6 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserPatch> {
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.USER_CREATE + "')")
-    @Override
-    public ProvisioningResult<UserTO> create(final UserTO userTO, final boolean nullPriorityAsync) {
-        return doCreate(userTO, true, false, nullPriorityAsync);
-    }
-
-    @PreAuthorize("hasRole('" + StandardEntitlement.USER_CREATE + "')")
     public ProvisioningResult<UserTO> create(
             final UserTO userTO, final boolean storePassword, final boolean nullPriorityAsync) {
 
index ee8489c..c8c0572 100644 (file)
@@ -26,7 +26,6 @@ import javax.ws.rs.BadRequestException;
 import javax.ws.rs.core.Response;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.syncope.common.lib.AnyOperations;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.patch.AnyPatch;
 import org.apache.syncope.common.lib.patch.AssociationPatch;
@@ -57,7 +56,7 @@ import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
 
 public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
         extends AbstractServiceImpl
-        implements AnyService<TO, P> {
+        implements AnyService<TO> {
 
     protected abstract AnyDAO<?> getAnyDAO();
 
@@ -65,7 +64,7 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
 
     protected abstract P newPatch(String key);
 
-    private String getActualKey(final String key) {
+    protected String getActualKey(final String key) {
         String actualKey = key;
         if (!SyncopeConstants.UUID_PATTERN.matcher(key).matches()) {
             actualKey = getAnyDAO().findKey(key);
@@ -152,12 +151,6 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
         return buildPagedResult(result.getRight(), anyQuery.getPage(), anyQuery.getSize(), result.getLeft());
     }
 
-    @Override
-    public Response create(final TO anyTO) {
-        ProvisioningResult<TO> created = getAnyLogic().create(anyTO, isNullPriorityAsync());
-        return createResponse(created);
-    }
-
     protected Date findLastChange(final String key) {
         Date lastChange = getAnyDAO().findLastChange(key);
         if (lastChange == null) {
@@ -167,8 +160,7 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
         return lastChange;
     }
 
-    @Override
-    public Response update(final P anyPatch) {
+    protected Response doUpdate(final P anyPatch) {
         anyPatch.setKey(getActualKey(anyPatch.getKey()));
         Date etagDate = findLastChange(anyPatch.getKey());
         checkETag(String.valueOf(etagDate.getTime()));
@@ -199,7 +191,7 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
             default:
         }
 
-        update(patch);
+        doUpdate(patch);
     }
 
     @Override
@@ -210,22 +202,11 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
     }
 
     @Override
-    public Response update(final TO anyTO) {
-        anyTO.setKey(getActualKey(anyTO.getKey()));
-        TO before = getAnyLogic().read(anyTO.getKey());
-
-        checkETag(before.getETagValue());
-
-        ProvisioningResult<TO> updated = getAnyLogic().update(AnyOperations.<TO, P>diff(anyTO, before, false),
-                isNullPriorityAsync());
-        return modificationResponse(updated);
-    }
-
-    @Override
-    public void delete(final String key, final SchemaType schemaType, final String schema) {
+    public Response delete(final String key, final SchemaType schemaType, final String schema) {
         String actualKey = getActualKey(key);
         addUpdateOrReplaceAttr(
                 actualKey, schemaType, new AttrTO.Builder().schema(schema).build(), PatchOperation.DELETE);
+        return Response.noContent().build();
     }
 
     @Override
index aadbaf3..c5f3c89 100644 (file)
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.rest.cxf.service;
 
 import java.util.List;
+import javax.ws.rs.core.Response;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ExecTO;
@@ -51,8 +52,9 @@ public abstract class AbstractExecutableService extends AbstractServiceImpl impl
     }
 
     @Override
-    public void deleteExecution(final String executionKey) {
+    public Response deleteExecution(final String executionKey) {
         getExecutableLogic().deleteExecution(executionKey);
+        return Response.noContent().build();
     }
 
     @Override
@@ -76,8 +78,9 @@ public abstract class AbstractExecutableService extends AbstractServiceImpl impl
     }
 
     @Override
-    public void actionJob(final String key, final JobAction action) {
+    public Response actionJob(final String key, final JobAction action) {
         getExecutableLogic().actionJob(key, action);
+        return Response.noContent().build();
     }
 
 }
index 2b09324..1508298 100644 (file)
@@ -59,8 +59,9 @@ public class AccessTokenServiceImpl extends AbstractServiceImpl implements Acces
     }
 
     @Override
-    public void logout() {
+    public Response logout() {
         logic.logout();
+        return Response.noContent().build();
     }
 
     @Override
@@ -73,8 +74,9 @@ public class AccessTokenServiceImpl extends AbstractServiceImpl implements Acces
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
 }
index cf17f80..961a328 100644 (file)
  */
 package org.apache.syncope.core.rest.cxf.service;
 
+import javax.ws.rs.core.Response;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.AnyOperations;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.patch.AnyObjectPatch;
 import org.apache.syncope.common.lib.search.SpecialAttr;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.PagedResult;
+import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.rest.api.beans.AnyQuery;
 import org.apache.syncope.common.rest.api.service.AnyObjectService;
@@ -61,6 +64,29 @@ public class AnyObjectServiceImpl extends AbstractAnyService<AnyObjectTO, AnyObj
     }
 
     @Override
+    public Response create(final AnyObjectTO anyObjectTO) {
+        ProvisioningResult<AnyObjectTO> created = logic.create(anyObjectTO, isNullPriorityAsync());
+        return createResponse(created);
+    }
+
+    @Override
+    public Response update(final AnyObjectTO anyObjectTO) {
+        anyObjectTO.setKey(getActualKey(anyObjectTO.getKey()));
+        AnyObjectTO before = logic.read(anyObjectTO.getKey());
+
+        checkETag(before.getETagValue());
+
+        ProvisioningResult<AnyObjectTO> updated =
+                logic.update(AnyOperations.diff(anyObjectTO, before, false), isNullPriorityAsync());
+        return modificationResponse(updated);
+    }
+
+    @Override
+    public Response update(final AnyObjectPatch anyObjectPatch) {
+        return doUpdate(anyObjectPatch);
+    }
+
+    @Override
     public PagedResult<AnyObjectTO> search(final AnyQuery anyQuery) {
         if (StringUtils.isBlank(anyQuery.getFiql())
                 || -1 == anyQuery.getFiql().indexOf(SpecialAttr.TYPE.toString())) {
index bd3149f..336cea4 100644 (file)
@@ -54,13 +54,15 @@ public class AnyTypeClassServiceImpl extends AbstractServiceImpl implements AnyT
     }
 
     @Override
-    public void update(final AnyTypeClassTO anyTypeTO) {
+    public Response update(final AnyTypeClassTO anyTypeTO) {
         logic.update(anyTypeTO);
+        return Response.noContent().build();
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
 }
index 9dd4982..c580241 100644 (file)
@@ -54,13 +54,15 @@ public class AnyTypeServiceImpl extends AbstractServiceImpl implements AnyTypeSe
     }
 
     @Override
-    public void update(final AnyTypeTO anyTypeTO) {
+    public Response update(final AnyTypeTO anyTypeTO) {
         logic.update(anyTypeTO);
+        return Response.noContent().build();
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
 }
index 4a40a75..befd5b3 100644 (file)
@@ -50,8 +50,9 @@ public class ConfigurationServiceImpl extends AbstractServiceImpl implements Con
     }
 
     @Override
-    public void delete(final String schema) {
+    public Response delete(final String schema) {
         logic.delete(schema);
+        return Response.noContent().build();
     }
 
     @Override
@@ -65,7 +66,8 @@ public class ConfigurationServiceImpl extends AbstractServiceImpl implements Con
     }
 
     @Override
-    public void set(final AttrTO value) {
+    public Response set(final AttrTO value) {
         logic.set(value);
+        return Response.noContent().build();
     }
 }
index 3424c5e..205b3e0 100644 (file)
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.rest.cxf.service;
 
 import java.util.List;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.to.ConnInstanceHistoryConfTO;
 import org.apache.syncope.common.rest.api.service.ConnectorHistoryService;
 import org.apache.syncope.core.logic.ConnectorHistoryLogic;
@@ -37,13 +38,15 @@ public class ConnectorHistoryServiceImpl extends AbstractServiceImpl implements
     }
 
     @Override
-    public void restore(final String key) {
+    public Response restore(final String key) {
         logic.restore(key);
+        return Response.noContent().build();
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
 }
index 45da758..082d89e 100644 (file)
@@ -46,8 +46,9 @@ public class ConnectorServiceImpl extends AbstractServiceImpl implements Connect
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
     @Override
@@ -78,17 +79,20 @@ public class ConnectorServiceImpl extends AbstractServiceImpl implements Connect
     }
 
     @Override
-    public void update(final ConnInstanceTO connInstanceTO) {
+    public Response update(final ConnInstanceTO connInstanceTO) {
         logic.update(connInstanceTO);
+        return Response.noContent().build();
     }
 
     @Override
-    public void check(final ConnInstanceTO connInstanceTO) {
+    public Response check(final ConnInstanceTO connInstanceTO) {
         logic.check(connInstanceTO);
+        return Response.noContent().build();
     }
 
     @Override
-    public void reload() {
+    public Response reload() {
         logic.reload();
+        return Response.noContent().build();
     }
 }
index daa8aad..168c3cd 100644 (file)
@@ -54,13 +54,15 @@ public class DomainServiceImpl extends AbstractServiceImpl implements DomainServ
     }
 
     @Override
-    public void update(final DomainTO anyTypeTO) {
+    public Response update(final DomainTO anyTypeTO) {
         logic.update(anyTypeTO);
+        return Response.noContent().build();
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
 }
index 41e3bad..dec464b 100644 (file)
@@ -54,13 +54,15 @@ public class DynRealmServiceImpl extends AbstractServiceImpl implements DynRealm
     }
 
     @Override
-    public void update(final DynRealmTO roleTO) {
+    public Response update(final DynRealmTO roleTO) {
         logic.update(roleTO);
+        return Response.noContent().build();
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
 }
index 94c41c4..4e23d22 100644 (file)
 package org.apache.syncope.core.rest.cxf.service;
 
 import java.util.List;
+import javax.ws.rs.core.Response;
+import org.apache.syncope.common.lib.AnyOperations;
 import org.apache.syncope.common.lib.patch.GroupPatch;
 import org.apache.syncope.common.lib.to.ExecTO;
 import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.types.BulkMembersActionType;
 import org.apache.syncope.common.rest.api.service.GroupService;
 import org.apache.syncope.core.logic.AbstractAnyLogic;
@@ -58,6 +61,29 @@ public class GroupServiceImpl extends AbstractAnyService<GroupTO, GroupPatch> im
     }
 
     @Override
+    public Response create(final GroupTO groupTO) {
+        ProvisioningResult<GroupTO> created = logic.create(groupTO, isNullPriorityAsync());
+        return createResponse(created);
+    }
+
+    @Override
+    public Response update(final GroupTO groupTO) {
+        groupTO.setKey(getActualKey(groupTO.getKey()));
+        GroupTO before = logic.read(groupTO.getKey());
+
+        checkETag(before.getETagValue());
+
+        ProvisioningResult<GroupTO> updated =
+                logic.update(AnyOperations.diff(groupTO, before, false), isNullPriorityAsync());
+        return modificationResponse(updated);
+    }
+
+    @Override
+    public Response update(final GroupPatch groupPatch) {
+        return doUpdate(groupPatch);
+    }
+
+    @Override
     public List<GroupTO> own() {
         return logic.own();
     }
index c3190af..c85793b 100644 (file)
@@ -55,13 +55,15 @@ public class ImplementationServiceImpl extends AbstractServiceImpl implements Im
     }
 
     @Override
-    public void update(final ImplementationTO implementationTO) {
+    public Response update(final ImplementationTO implementationTO) {
         logic.update(implementationTO);
+        return Response.noContent().build();
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
 }
index c62a55c..4f8c2f4 100644 (file)
@@ -21,6 +21,7 @@ package org.apache.syncope.core.rest.cxf.service;
 import java.text.ParseException;
 import java.util.List;
 import javax.ws.rs.BadRequestException;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.log.EventCategoryTO;
 import org.apache.syncope.common.lib.log.LogAppender;
 import org.apache.syncope.common.lib.log.LogStatementTO;
@@ -50,7 +51,7 @@ public class LoggerServiceImpl extends AbstractServiceImpl implements LoggerServ
     }
 
     @Override
-    public void delete(final LoggerType type, final String name) {
+    public Response delete(final LoggerType type, final String name) {
         switch (type) {
             case LOG:
                 logic.deleteLog(name);
@@ -67,7 +68,7 @@ public class LoggerServiceImpl extends AbstractServiceImpl implements LoggerServ
             default:
                 throw new BadRequestException();
         }
-
+        return Response.noContent().build();
     }
 
     @Override
@@ -100,7 +101,7 @@ public class LoggerServiceImpl extends AbstractServiceImpl implements LoggerServ
     }
 
     @Override
-    public void update(final LoggerType type, final LoggerTO logger) {
+    public Response update(final LoggerType type, final LoggerTO logger) {
         switch (type) {
             case LOG:
                 logic.setLogLevel(logger.getKey(), logger.getLevel().getLevel());
@@ -117,6 +118,7 @@ public class LoggerServiceImpl extends AbstractServiceImpl implements LoggerServ
             default:
                 throw new BadRequestException();
         }
+        return Response.noContent().build();
     }
 
     @Override
index 2c1a434..ff5cb13 100644 (file)
@@ -61,8 +61,9 @@ public class MailTemplateServiceImpl extends AbstractServiceImpl implements Mail
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
     @Override
@@ -76,9 +77,10 @@ public class MailTemplateServiceImpl extends AbstractServiceImpl implements Mail
     }
 
     @Override
-    public void setFormat(final String key, final MailTemplateFormat format, final InputStream templateIn) {
+    public Response setFormat(final String key, final MailTemplateFormat format, final InputStream templateIn) {
         try {
             logic.setFormat(key, format, IOUtils.toString(templateIn, StandardCharsets.UTF_8));
+            return Response.noContent().build();
         } catch (final IOException e) {
             LOG.error("While setting format {} for mail template {}", format, key, e);
             throw new InternalServerErrorException("Could not read entity", e);
@@ -86,7 +88,8 @@ public class MailTemplateServiceImpl extends AbstractServiceImpl implements Mail
     }
 
     @Override
-    public void removeFormat(final String key, final MailTemplateFormat format) {
+    public Response removeFormat(final String key, final MailTemplateFormat format) {
         logic.setFormat(key, format, null);
+        return Response.noContent().build();
     }
 }
index 874f138..9671f93 100644 (file)
@@ -56,13 +56,15 @@ public class NotificationServiceImpl extends AbstractServiceImpl implements Noti
     }
 
     @Override
-    public void update(final NotificationTO notificationTO) {
+    public Response update(final NotificationTO notificationTO) {
         logic.update(notificationTO);
+        return Response.noContent().build();
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
     @Override
@@ -71,7 +73,8 @@ public class NotificationServiceImpl extends AbstractServiceImpl implements Noti
     }
 
     @Override
-    public void actionJob(final JobAction action) {
+    public Response actionJob(final JobAction action) {
         logic.actionJob(action);
+        return Response.noContent().build();
     }
 }
index 8d6709a..64f765d 100644 (file)
@@ -45,8 +45,9 @@ public class PolicyServiceImpl extends AbstractServiceImpl implements PolicyServ
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
     @Override
@@ -60,7 +61,8 @@ public class PolicyServiceImpl extends AbstractServiceImpl implements PolicyServ
     }
 
     @Override
-    public void update(final AbstractPolicyTO policyTO) {
+    public Response update(final AbstractPolicyTO policyTO) {
         logic.update(policyTO);
+        return Response.noContent().build();
     }
 }
index 1cdc1d4..ffff1b3 100644 (file)
@@ -54,13 +54,15 @@ public class RelationshipTypeServiceImpl extends AbstractServiceImpl implements
     }
 
     @Override
-    public void update(final RelationshipTypeTO anyTypeTO) {
+    public Response update(final RelationshipTypeTO anyTypeTO) {
         logic.update(anyTypeTO);
+        return Response.noContent().build();
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
 }
index 5a44cb0..65e1b43 100644 (file)
@@ -54,8 +54,9 @@ public class ReportServiceImpl extends AbstractExecutableService implements Repo
     }
 
     @Override
-    public void update(final ReportTO reportTO) {
+    public Response update(final ReportTO reportTO) {
         logic.update(reportTO);
+        return Response.noContent().build();
     }
 
     @Override
@@ -81,7 +82,8 @@ public class ReportServiceImpl extends AbstractExecutableService implements Repo
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 }
index 9fc47d0..98dbc16 100644 (file)
@@ -62,8 +62,9 @@ public class ReportTemplateServiceImpl extends AbstractServiceImpl implements Re
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
     @Override
@@ -77,9 +78,10 @@ public class ReportTemplateServiceImpl extends AbstractServiceImpl implements Re
     }
 
     @Override
-    public void setFormat(final String key, final ReportTemplateFormat format, final InputStream templateIn) {
+    public Response setFormat(final String key, final ReportTemplateFormat format, final InputStream templateIn) {
         try {
             logic.setFormat(key, format, IOUtils.toString(templateIn, StandardCharsets.UTF_8.name()));
+            return Response.noContent().build();
         } catch (final IOException e) {
             LOG.error("While setting format {} for report template {}", format, key, e);
             throw new InternalServerErrorException("Could not read entity", e);
@@ -87,7 +89,8 @@ public class ReportTemplateServiceImpl extends AbstractServiceImpl implements Re
     }
 
     @Override
-    public void removeFormat(final String key, final ReportTemplateFormat format) {
+    public Response removeFormat(final String key, final ReportTemplateFormat format) {
         logic.setFormat(key, format, null);
+        return Response.noContent().build();
     }
 }
index b69b5be..ef5aead 100644 (file)
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.rest.cxf.service;
 
 import java.util.List;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.to.ResourceHistoryConfTO;
 import org.apache.syncope.common.rest.api.service.ResourceHistoryService;
 import org.apache.syncope.core.logic.ResourceHistoryLogic;
@@ -37,13 +38,15 @@ public class ResourceHistoryServiceImpl extends AbstractServiceImpl implements R
     }
 
     @Override
-    public void restore(final String key) {
+    public Response restore(final String key) {
         logic.restore(key);
+        return Response.noContent().build();
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
 }
index 2b76dfc..e3c9992 100644 (file)
@@ -72,23 +72,27 @@ public class ResourceServiceImpl extends AbstractServiceImpl implements Resource
     }
 
     @Override
-    public void update(final ResourceTO resourceTO) {
+    public Response update(final ResourceTO resourceTO) {
         logic.update(resourceTO);
+        return Response.noContent().build();
     }
 
     @Override
-    public void setLatestSyncToken(final String key, final String anyTypeKey) {
+    public Response setLatestSyncToken(final String key, final String anyTypeKey) {
         logic.setLatestSyncToken(key, anyTypeKey);
+        return Response.noContent().build();
     }
 
     @Override
-    public void removeSyncToken(final String key, final String anyTypeKey) {
+    public Response removeSyncToken(final String key, final String anyTypeKey) {
         logic.removeSyncToken(key, anyTypeKey);
+        return Response.noContent().build();
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
     @Override
@@ -138,8 +142,9 @@ public class ResourceServiceImpl extends AbstractServiceImpl implements Resource
     }
 
     @Override
-    public void check(final ResourceTO resourceTO) {
+    public Response check(final ResourceTO resourceTO) {
         logic.check(resourceTO);
+        return Response.noContent().build();
     }
 
     @Override
index 6a0a75a..b31b4e1 100644 (file)
@@ -61,13 +61,15 @@ public class RoleServiceImpl extends AbstractServiceImpl implements RoleService
     }
 
     @Override
-    public void update(final RoleTO roleTO) {
+    public Response update(final RoleTO roleTO) {
         logic.update(roleTO);
+        return Response.noContent().build();
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
     @Override
@@ -81,9 +83,10 @@ public class RoleServiceImpl extends AbstractServiceImpl implements RoleService
     }
 
     @Override
-    public void setConsoleLayoutInfo(final String key, final InputStream consoleLayoutIn) {
+    public Response setConsoleLayoutInfo(final String key, final InputStream consoleLayoutIn) {
         try {
             logic.setConsoleLayoutInfo(key, IOUtils.toString(consoleLayoutIn, StandardCharsets.UTF_8.name()));
+            return Response.noContent().build();
         } catch (final IOException e) {
             LOG.error("While setting console layout info for role {}", key, e);
             throw new InternalServerErrorException("Could not read entity", e);
@@ -91,8 +94,9 @@ public class RoleServiceImpl extends AbstractServiceImpl implements RoleService
     }
 
     @Override
-    public void removeConsoleLayoutInfo(final String key) {
+    public Response removeConsoleLayoutInfo(final String key) {
         logic.setConsoleLayoutInfo(key, null);
+        return Response.noContent().build();
     }
 
 }
index 810c520..b6c7397 100644 (file)
@@ -47,8 +47,9 @@ public class SchemaServiceImpl extends AbstractServiceImpl implements SchemaServ
     }
 
     @Override
-    public void delete(final SchemaType schemaType, final String key) {
+    public Response delete(final SchemaType schemaType, final String key) {
         logic.delete(schemaType, key);
+        return Response.noContent().build();
     }
 
     @Override
@@ -62,7 +63,8 @@ public class SchemaServiceImpl extends AbstractServiceImpl implements SchemaServ
     }
 
     @Override
-    public void update(final SchemaType schemaType, final AbstractSchemaTO schemaTO) {
+    public Response update(final SchemaType schemaType, final AbstractSchemaTO schemaTO) {
         logic.update(schemaType, schemaTO);
+        return Response.noContent().build();
     }
 }
index 5dca503..fbfd00a 100644 (file)
@@ -55,13 +55,15 @@ public class SecurityQuestionServiceImpl extends AbstractServiceImpl implements
     }
 
     @Override
-    public void update(final SecurityQuestionTO securityQuestionTO) {
+    public Response update(final SecurityQuestionTO securityQuestionTO) {
         logic.update(securityQuestionTO);
+        return Response.noContent().build();
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
     @Override
index ea9f5af..47a860c 100644 (file)
@@ -63,8 +63,9 @@ public class TaskServiceImpl extends AbstractExecutableService implements TaskSe
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
     @SuppressWarnings("unchecked")
@@ -89,9 +90,10 @@ public class TaskServiceImpl extends AbstractExecutableService implements TaskSe
     }
 
     @Override
-    public void update(final AbstractTaskTO taskTO) {
+    public Response update(final AbstractTaskTO taskTO) {
         if (taskTO instanceof SchedTaskTO) {
             logic.updateSchedTask((SchedTaskTO) taskTO);
+            return Response.noContent().build();
         } else {
             throw new BadRequestException();
         }
index c76986e..f6a800f 100644 (file)
@@ -89,7 +89,7 @@ public class UserSelfServiceImpl extends AbstractServiceImpl implements UserSelf
     }
 
     @Override
-    public void requestPasswordReset(final String username, final String securityAnswer) {
+    public Response requestPasswordReset(final String username, final String securityAnswer) {
         if (!syncopeLogic.isPwdResetAllowed()) {
             SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.DelegatedAdministration);
             sce.getElements().add("Password reset forbidden by configuration");
@@ -97,10 +97,11 @@ public class UserSelfServiceImpl extends AbstractServiceImpl implements UserSelf
         }
 
         logic.requestPasswordReset(username, securityAnswer);
+        return Response.noContent().build();
     }
 
     @Override
-    public void confirmPasswordReset(final String token, final String password) {
+    public Response confirmPasswordReset(final String token, final String password) {
         if (!syncopeLogic.isPwdResetAllowed()) {
             SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.DelegatedAdministration);
             sce.getElements().add("Password reset forbidden by configuration");
@@ -108,6 +109,7 @@ public class UserSelfServiceImpl extends AbstractServiceImpl implements UserSelf
         }
 
         logic.confirmPasswordReset(token, password);
+        return Response.noContent().build();
     }
 
 }
index 90c706a..4af144b 100644 (file)
@@ -20,6 +20,7 @@ package org.apache.syncope.core.rest.cxf.service;
 
 import java.util.Date;
 import javax.ws.rs.core.Response;
+import org.apache.syncope.common.lib.AnyOperations;
 import org.apache.syncope.common.lib.patch.StatusPatch;
 import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.to.ProvisioningResult;
@@ -65,6 +66,23 @@ public class UserServiceImpl extends AbstractAnyService<UserTO, UserPatch> imple
     }
 
     @Override
+    public Response update(final UserTO userTO) {
+        userTO.setKey(getActualKey(userTO.getKey()));
+        UserTO before = logic.read(userTO.getKey());
+
+        checkETag(before.getETagValue());
+
+        ProvisioningResult<UserTO> updated =
+                logic.update(AnyOperations.diff(userTO, before, false), isNullPriorityAsync());
+        return modificationResponse(updated);
+    }
+
+    @Override
+    public Response update(final UserPatch userPatch) {
+        return doUpdate(userPatch);
+    }
+
+    @Override
     public Response status(final StatusPatch statusPatch) {
         Date etagDate = findLastChange(statusPatch.getKey());
         checkETag(String.valueOf(etagDate.getTime()));
index 2321e0a..b67e5bb 100644 (file)
@@ -66,18 +66,20 @@ public class WorkflowServiceImpl extends AbstractServiceImpl implements Workflow
     }
 
     @Override
-    public void set(final String anyType, final String key, final String definition) {
+    public Response set(final String anyType, final String key, final String definition) {
         WorkflowDefinitionFormat format =
                 messageContext.getHttpHeaders().getMediaType().equals(MediaType.APPLICATION_JSON_TYPE)
                 ? WorkflowDefinitionFormat.JSON
                 : WorkflowDefinitionFormat.XML;
 
         logic.importDefinition(anyType, key, format, definition);
+        return Response.noContent().build();
     }
 
     @Override
-    public void delete(final String anyType, final String key) {
+    public Response delete(final String anyType, final String key) {
         logic.delete(anyType, key);
+        return Response.noContent().build();
     }
 
 }
index 3346c5c..e576b52 100644 (file)
@@ -29,6 +29,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.to.CamelMetrics;
 import org.apache.syncope.common.lib.to.CamelRouteTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
@@ -64,18 +65,21 @@ public interface CamelRouteService extends JAXRSService {
      * Update the given route.
      *
      * @param route to be updated
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull CamelRouteTO route);
+    Response update(@NotNull CamelRouteTO route);
 
     /**
      * Restart the underlying Apache Camel context.
+     *
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("restartContext")
-    void restartContext();
+    Response restartContext();
 
     /**
      * Provides Camel metrics.
index 163847f..a7f6fbd 100644 (file)
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.rest.cxf.service;
 
 import java.util.List;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.to.CamelMetrics;
 import org.apache.syncope.common.lib.to.CamelRouteTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
@@ -44,13 +45,15 @@ public class CamelRouteServiceImpl extends AbstractServiceImpl implements CamelR
     }
 
     @Override
-    public void update(final CamelRouteTO route) {
+    public Response update(final CamelRouteTO route) {
         logic.update(route);
+        return Response.noContent().build();
     }
 
     @Override
-    public void restartContext() {
+    public Response restartContext() {
         logic.restartContext();
+        return Response.noContent().build();
     }
 
     @Override
index 0d528c3..e273676 100644 (file)
@@ -84,18 +84,20 @@ public interface SAML2IdPService extends JAXRSService {
      * Updates the SAML 2.0 Identity Provider with matching entityID.
      *
      * @param saml2IdpTO idp configuration to be stored
+     * @return an empty response if operation was successful
      */
     @PUT
     @Path("{key}")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void update(@NotNull SAML2IdPTO saml2IdpTO);
+    Response update(@NotNull SAML2IdPTO saml2IdpTO);
 
     /**
      * Deletes the SAML 2.0 Identity Provider with matching entityID.
      *
      * @param key SAML 2.0 Identity Provider's entityID
+     * @return an empty response if operation was successful
      */
     @DELETE
     @Path("{key}")
-    void delete(@PathParam("key") String key);
+    Response delete(@PathParam("key") String key);
 }
index f3d420c..ed964d6 100644 (file)
@@ -88,10 +88,11 @@ public interface SAML2SPService extends JAXRSService {
      * Validates the received SAML 2.0 logout response.
      *
      * @param response SAML response and relay state
+     * @return an empty response if operation was successful
      */
     @POST
     @Path("logoutResponse")
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
     @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void validateLogoutResponse(SAML2ReceivedResponseTO response);
+    Response validateLogoutResponse(SAML2ReceivedResponseTO response);
 }
index ebda30d..bd2f5f9 100644 (file)
@@ -61,13 +61,15 @@ public class SAML2IdPServiceImpl extends AbstractServiceImpl implements SAML2IdP
     }
 
     @Override
-    public void update(final SAML2IdPTO saml2IdpTO) {
+    public Response update(final SAML2IdPTO saml2IdpTO) {
         logic.update(saml2IdpTO);
+        return Response.noContent().build();
     }
 
     @Override
-    public void delete(final String key) {
+    public Response delete(final String key) {
         logic.delete(key);
+        return Response.noContent().build();
     }
 
 }
index 4ec2074..93cd87b 100644 (file)
@@ -66,8 +66,9 @@ public class SAML2SPServiceImpl extends AbstractServiceImpl implements SAML2SPSe
     }
 
     @Override
-    public void validateLogoutResponse(final SAML2ReceivedResponseTO response) {
+    public Response validateLogoutResponse(final SAML2ReceivedResponseTO response) {
         logic.validateLogoutResponse(getJWTToken(), response);
+        return Response.noContent().build();
     }
 
     private String getJWTToken() {
index fdc4da3..1efad9a 100644 (file)
@@ -25,6 +25,7 @@ import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.scim.SCIMConf;
 
 /**
@@ -46,8 +47,9 @@ public interface SCIMConfService extends JAXRSService {
      * Sets SCIM configuration.
      *
      * @param conf SCIM configuration
+     * @return Response.noContent().build();
      */
     @PUT
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
-    void set(@NotNull SCIMConf conf);
+    Response set(@NotNull SCIMConf conf);
 }
index 223aca7..1d14701 100644 (file)
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.rest.cxf.service;
 
+import javax.ws.rs.core.Response;
 import org.apache.syncope.common.lib.scim.SCIMConf;
 import org.apache.syncope.common.rest.api.service.SCIMConfService;
 import org.apache.syncope.core.logic.scim.SCIMConfManager;
@@ -34,8 +35,9 @@ public class SCIMConfServiceImpl extends AbstractServiceImpl implements SCIMConf
     }
 
     @Override
-    public void set(final SCIMConf conf) {
+    public Response set(final SCIMConf conf) {
         manager.set(conf);
+        return Response.noContent().build();
     }
 
 }
index 2c73f44..4ecc966 100644 (file)
@@ -40,7 +40,7 @@ public class UserServiceImpl extends AbstractService<SCIMUser> implements UserSe
 
     @Override
     public Response create(final SCIMUser user) {
-        ProvisioningResult<UserTO> result = userLogic().create(binder().toUserTO(user), false);
+        ProvisioningResult<UserTO> result = userLogic().create(binder().toUserTO(user), true, false);
         return createResponse(
                 result.getEntity().getKey(),
                 binder().toSCIMUser(
index 58dca0d..6951a60 100644 (file)
@@ -249,7 +249,7 @@ public class AuthenticationITCase extends AbstractITCase {
             // 4. as delegated, create user under realm / -> fail
             UserTO user = UserITCase.getUniqueSampleTO("delegated@syncope.apache.org");
             try {
-                delegatedUserService.create(user);
+                delegatedUserService.create(user, true);
                 fail("This should not happen");
             } catch (SyncopeClientException e) {
                 assertEquals(ClientExceptionType.DelegatedAdministration, e.getType());
@@ -258,7 +258,7 @@ public class AuthenticationITCase extends AbstractITCase {
             // 5. set realm to /even/two -> succeed
             user.setRealm("/even/two");
 
-            Response response = delegatedUserService.create(user);
+            Response response = delegatedUserService.create(user, true);
             assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatus());
 
             user = response.readEntity(new GenericType<ProvisioningResult<UserTO>>() {
index f98d468..db176df 100644 (file)
@@ -120,7 +120,7 @@ public class MultitenancyITCase extends AbstractITCase {
         user.setUsername(getUUIDString());
         user.setPassword("password");
 
-        Response response = adminClient.getService(UserService.class).create(user);
+        Response response = adminClient.getService(UserService.class).create(user, true);
         assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatus());
 
         user = response.readEntity(new GenericType<ProvisioningResult<UserTO>>() {
index 290f888..deacadc 100644 (file)
@@ -313,9 +313,9 @@ public class SCIMITCase extends AbstractITCase {
         assertEquals("additional", additional.getDisplayName());
 
         // gt
-        UserTO newUser = userService.create(UserITCase.getUniqueSampleTO("scimsearch@syncope.apache.org")).readEntity(
-                new GenericType<ProvisioningResult<UserTO>>() {
-        }).getEntity();
+        UserTO newUser = userService.create(UserITCase.getUniqueSampleTO("scimsearch@syncope.apache.org"), true).
+                readEntity(new GenericType<ProvisioningResult<UserTO>>() {
+                }).getEntity();
 
         Date value = new Date(newUser.getCreationDate().getTime() - 1000);
         response = webClient().path("Users").query("filter", "meta.created gt \""
index 6c33ee7..83d41c1 100644 (file)
@@ -882,7 +882,7 @@ public class UserITCase extends AbstractITCase {
         user.getResources().add(RESOURCE_NAME_TESTDB2);
         user.getResources().add(RESOURCE_NAME_LDAP);
 
-        ProvisioningResult<UserTO> result = asyncService.create(user).readEntity(
+        ProvisioningResult<UserTO> result = asyncService.create(user, true).readEntity(
                 new GenericType<ProvisioningResult<UserTO>>() {
         });
         assertNotNull(result);
@@ -1289,7 +1289,7 @@ public class UserITCase extends AbstractITCase {
         userTO.getResources().add("rest-target-resource");
 
         // 1. create
-        ProvisioningResult<UserTO> result = userService.create(userTO).readEntity(
+        ProvisioningResult<UserTO> result = userService.create(userTO, true).readEntity(
                 new GenericType<ProvisioningResult<UserTO>>() {
         });
         assertEquals(1, result.getPropagationStatuses().size());