You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by fm...@apache.org on 2013/09/18 17:33:16 UTC

svn commit: r1524459 - in /syncope/trunk: common/src/main/java/org/apache/syncope/common/services/ common/src/main/java/org/apache/syncope/common/to/ common/src/main/java/org/apache/syncope/common/types/ console/src/main/java/org/apache/syncope/console...

Author: fmartelli
Date: Wed Sep 18 15:33:15 2013
New Revision: 1524459

URL: http://svn.apache.org/r1524459
Log:
SYNCOPE-407 fixed

Added:
    syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UnauthorizedException.java
      - copied, changed from r1523973, syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UnauthorizedRoleException.java
Modified:
    syncope/trunk/common/src/main/java/org/apache/syncope/common/services/UserRequestService.java
    syncope/trunk/common/src/main/java/org/apache/syncope/common/to/UserRequestTO.java
    syncope/trunk/common/src/main/java/org/apache/syncope/common/types/AuditElements.java
    syncope/trunk/common/src/main/java/org/apache/syncope/common/types/SyncopeClientExceptionType.java
    syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Todo.java
    syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java
    syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/UserRequestRestClient.java
    syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo.html
    syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo.properties
    syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo_it.properties
    syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo_pt_BR.properties
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/UserRequest.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/UserRequestDAO.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/UserRequestDAOImpl.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserRequestController.java
    syncope/trunk/core/src/main/java/org/apache/syncope/core/services/UserRequestServiceImpl.java
    syncope/trunk/core/src/main/resources/content.xml
    syncope/trunk/core/src/main/resources/quartz/tables_sqlServer.sql
    syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/dao/EntitlementTest.java
    syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserRequestTestITCase.java
    syncope/trunk/core/src/test/resources/content.xml

Modified: syncope/trunk/common/src/main/java/org/apache/syncope/common/services/UserRequestService.java
URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/services/UserRequestService.java?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/common/src/main/java/org/apache/syncope/common/services/UserRequestService.java (original)
+++ syncope/trunk/common/src/main/java/org/apache/syncope/common/services/UserRequestService.java Wed Sep 18 15:33:15 2013
@@ -66,9 +66,17 @@ public interface UserRequestService {
      * @return Returns list of all UserRequests.
      */
     @GET
+    @Path("executed")
     List<UserRequestTO> list();
 
     /**
+     * @return Returns list of all UserRequests of the given user.
+     */
+    @GET
+    @Path("filter/{username}")
+    List<UserRequestTO> listByUsername(@PathParam("username") String username);
+
+    /**
      * @param requestId ID of UserRequest to be read
      * @return Returns UserRequest with matching requestId.
      */
@@ -83,6 +91,10 @@ public interface UserRequestService {
     @Path("{requestId}")
     void delete(@PathParam("requestId") Long requestId);
 
+    @GET
+    @Path("claim/{requestId}")
+    UserRequestTO claim(@PathParam("requestId") Long requestId);
+
     @POST
     @Path("create/execute/{requestId}")
     UserTO executeCreate(@PathParam("requestId") Long requestId, UserTO reviewed);
@@ -91,7 +103,7 @@ public interface UserRequestService {
     @Path("update/execute/{requestId}")
     UserTO executeUpdate(@PathParam("requestId") Long requestId, UserMod changes);
 
-    @POST
-    @Path("delete/execute{requestId}")
+    @DELETE
+    @Path("delete/execute/{requestId}")
     UserTO executeDelete(@PathParam("requestId") Long requestId);
 }

Modified: syncope/trunk/common/src/main/java/org/apache/syncope/common/to/UserRequestTO.java
URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/to/UserRequestTO.java?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/common/src/main/java/org/apache/syncope/common/to/UserRequestTO.java (original)
+++ syncope/trunk/common/src/main/java/org/apache/syncope/common/to/UserRequestTO.java Wed Sep 18 15:33:15 2013
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.common.to;
 
+import java.util.Date;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
@@ -39,10 +40,32 @@ public class UserRequestTO extends Abstr
 
     private Long userId;
 
+    private String username;
+
     private UserRequestType type;
 
     private boolean executed;
 
+    /**
+     * Username of the last user who claimed the request.
+     */
+    private String owner;
+
+    /**
+     * Creation date.
+     */
+    private Date creationDate;
+
+    /**
+     * Claim date.
+     */
+    private Date claimDate;
+
+    /**
+     * Execution date.
+     */
+    private Date executionDate;
+
     public UserRequestTO() {
     }
 
@@ -118,10 +141,18 @@ public class UserRequestTO extends Abstr
                 : userId;
     }
 
-    public void setUserId(final Long userId) {
+    public void setUserId(Long userId) {
         this.userId = userId;
     }
 
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
     public void setExecuted(boolean executed) {
         this.executed = executed;
     }
@@ -129,4 +160,36 @@ public class UserRequestTO extends Abstr
     public boolean isExecuted() {
         return executed;
     }
+
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    public Date getCreationDate() {
+        return creationDate;
+    }
+
+    public void setCreationDate(Date creationDate) {
+        this.creationDate = creationDate;
+    }
+
+    public Date getClaimDate() {
+        return claimDate;
+    }
+
+    public void setClaimDate(Date claimDate) {
+        this.claimDate = claimDate;
+    }
+
+    public Date getExecutionDate() {
+        return executionDate;
+    }
+
+    public void setExecutionDate(Date executionDate) {
+        this.executionDate = executionDate;
+    }
 }

Modified: syncope/trunk/common/src/main/java/org/apache/syncope/common/types/AuditElements.java
URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/types/AuditElements.java?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/common/src/main/java/org/apache/syncope/common/types/AuditElements.java (original)
+++ syncope/trunk/common/src/main/java/org/apache/syncope/common/types/AuditElements.java Wed Sep 18 15:33:15 2013
@@ -242,7 +242,8 @@ public final class AuditElements {
         update,
         delete,
         isCreateAllowed,
-        execute
+        execute,
+        claim
 
     }
 

Modified: syncope/trunk/common/src/main/java/org/apache/syncope/common/types/SyncopeClientExceptionType.java
URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/types/SyncopeClientExceptionType.java?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/common/src/main/java/org/apache/syncope/common/types/SyncopeClientExceptionType.java (original)
+++ syncope/trunk/common/src/main/java/org/apache/syncope/common/types/SyncopeClientExceptionType.java Wed Sep 18 15:33:15 2013
@@ -64,6 +64,7 @@ public enum SyncopeClientExceptionType {
     RequiredValuesMissing("Syncope.RequiredValuesMissing", "Syncope.RequiredValuesMissing.attributeName"),
     Scheduling("Syncope.Scheduling", "Syncope.Scheduling.message"),
     UnauthorizedRole("Syncope.UnauthorizedRole", "Syncope.UnauthorizedRole.id"),
+    Unauthorized("Syncope.Unauthorized", "Syncope.Unauthorized"),
     Unknown("Syncope.Unknown", ""),
     Workflow("Syncope.Workflow", "Syncope.Workflow.message");
 

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Todo.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Todo.java?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Todo.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Todo.java Wed Sep 18 15:33:15 2013
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.to.UserRequestTO;
 import org.apache.syncope.common.to.WorkflowFormTO;
 import org.apache.syncope.common.types.UserRequestType;
@@ -228,7 +229,10 @@ public class Todo extends BasePage {
         List<IColumn> columns = new ArrayList<IColumn>();
         columns.add(new PropertyColumn(new ResourceModel("id"), "id", "id"));
         columns.add(new PropertyColumn(new ResourceModel("type"), "type", "type"));
-        columns.add(new UserRequestColumn("user"));
+        columns.add(new PropertyColumn(new ResourceModel("username"), "username", "username"));
+        columns.add(new DatePropertyColumn(new ResourceModel("creationDate"), "creationDate", "creationDate"));
+        columns.add(new DatePropertyColumn(new ResourceModel("claimDate"), "claimDate", "claimDate"));
+        columns.add(new PropertyColumn(new ResourceModel("owner"), "owner", "owner"));
         columns.add(new AbstractColumn<UserRequestTO, String>(new ResourceModel("actions", "")) {
 
             private static final long serialVersionUID = 2054811145491901166L;
@@ -252,6 +256,23 @@ public class Todo extends BasePage {
 
                     @Override
                     public void onClick(final AjaxRequestTarget target) {
+                        try {
+                            userRequestRestClient.claim(model.getObject().getId());
+                            info(getString(Constants.OPERATION_SUCCEEDED));
+                        } catch (SyncopeClientCompositeErrorException scee) {
+                            error(getString(Constants.ERROR) + ":" + scee.getMessage());
+                        }
+                        target.add(feedbackPanel);
+                        target.add(userRequestContainer);
+                    }
+                }, ActionLink.ActionType.CLAIM, "Approval");
+
+                panel.add(new ActionLink() {
+
+                    private static final long serialVersionUID = -3722207913631435501L;
+
+                    @Override
+                    public void onClick(final AjaxRequestTarget target) {
                         editUserRequestWin.setPageCreator(new ModalWindow.PageCreator() {
 
                             private static final long serialVersionUID = -7834632442532690940L;
@@ -266,7 +287,9 @@ public class Todo extends BasePage {
                         editUserRequestWin.show(target);
                     }
                 }, ActionLink.ActionType.EDIT, "UserRequest",
-                        model.getObject().getType() != UserRequestType.DELETE);
+                        model.getObject().getType() != UserRequestType.DELETE
+                        && StringUtils.isNotBlank(model.getObject().getOwner())
+                        && model.getObject().getOwner().equalsIgnoreCase(SyncopeSession.get().getUsername()));
 
                 panel.add(new ActionLink() {
 
@@ -275,8 +298,7 @@ public class Todo extends BasePage {
                     @Override
                     public void onClick(final AjaxRequestTarget target) {
                         try {
-                            userRestClient.delete(model.getObject().getUserId());
-                            userRequestRestClient.delete(model.getObject().getId());
+                            userRequestRestClient.executeDelete(model.getObject().getId());
                         } catch (SyncopeClientCompositeErrorException e) {
                             LOG.error("While deleting an user", e);
                             error(e.getMessage());
@@ -289,7 +311,9 @@ public class Todo extends BasePage {
                         target.add(userRequestContainer);
                     }
                 }, ActionLink.ActionType.DELETE, "Users",
-                        model.getObject().getType() == UserRequestType.DELETE);
+                        model.getObject().getType() == UserRequestType.DELETE
+                        && StringUtils.isNotBlank(model.getObject().getOwner())
+                        && model.getObject().getOwner().equalsIgnoreCase(SyncopeSession.get().getUsername()));
 
                 panel.add(new ActionLink() {
 
@@ -310,7 +334,9 @@ public class Todo extends BasePage {
 
                         target.add(userRequestContainer);
                     }
-                }, ActionLink.ActionType.DELETE, "UserRequest");
+                }, ActionLink.ActionType.DELETE, "UserRequest",
+                        StringUtils.isNotBlank(model.getObject().getOwner())
+                        && model.getObject().getOwner().equalsIgnoreCase(SyncopeSession.get().getUsername()));
 
                 cellItem.add(panel);
             }
@@ -376,7 +402,7 @@ public class Todo extends BasePage {
 
             Collections.sort(list, comparator);
 
-            return list.subList((int)first, (int)first + (int)count).iterator();
+            return list.subList((int) first, (int) first + (int) count).iterator();
         }
 
         @Override
@@ -418,7 +444,7 @@ public class Todo extends BasePage {
 
             Collections.sort(list, comparator);
 
-            return list.subList((int)first, (int)first + (int)count).iterator();
+            return list.subList((int) first, (int) first + (int) count).iterator();
         }
 
         @Override
@@ -450,7 +476,9 @@ public class Todo extends BasePage {
         }
 
         @Override
-        public void populateItem(final Item<ICellPopulator<UserRequestTO>> cellItem, final String componentId,
+        public void populateItem(
+                final Item<ICellPopulator<UserRequestTO>> cellItem,
+                final String componentId,
                 final IModel<UserRequestTO> rowModel) {
 
             String label = "";

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java Wed Sep 18 15:33:15 2013
@@ -152,7 +152,7 @@ public class ConnectorRestClient extends
      */
     public boolean check(final ConnInstanceTO connectorTO) {
         ConnInstanceTO toBeChecked = new ConnInstanceTO();
-        BeanUtils.copyProperties(connectorTO, toBeChecked, new String[] {"configuration"});
+        BeanUtils.copyProperties(connectorTO, toBeChecked, new String[] {"configuration", "configurationMap"});
         toBeChecked.getConfiguration().addAll(filterProperties(connectorTO.getConfiguration()));
 
         boolean check = false;

Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/UserRequestRestClient.java
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/UserRequestRestClient.java?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/UserRequestRestClient.java (original)
+++ syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/UserRequestRestClient.java Wed Sep 18 15:33:15 2013
@@ -40,6 +40,10 @@ public class UserRequestRestClient exten
         getService(UserRequestService.class).delete(requestId);
     }
 
+    public void claim(final Long requestId) {
+        getService(UserRequestService.class).claim(requestId);
+    }
+
     public void requestCreate(final UserTO userTO) {
         UserRequestTO userRequestTO = new UserRequestTO();
         userRequestTO.setType(UserRequestType.CREATE);

Modified: syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo.html
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo.html?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo.html (original)
+++ syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo.html Wed Sep 18 15:33:15 2013
@@ -43,7 +43,7 @@ under the License.
 
     <div id="tabs-2">
 
-      <div id="users-contain" class="ui-widget">
+      <div id="users-contain" class="ui-widget" style="width:inherit;">
         <span wicket:id="userRequestContainer">
           <table class="ui-widget ui-widget-content table-hover"
                  wicket:id="userRequestTable"/>

Modified: syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo.properties
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo.properties?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo.properties (original)
+++ syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo.properties Wed Sep 18 15:33:15 2013
@@ -26,5 +26,7 @@ approvals=Approval
 userRequests=User requests
 delete=Delete
 type=Type
-user=User
+username=User
 new_user=New user
+creationDate = Creation date
+claimDate = Claim date

Modified: syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo_it.properties
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo_it.properties?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo_it.properties (original)
+++ syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo_it.properties Wed Sep 18 15:33:15 2013
@@ -26,5 +26,7 @@ approvals=Approvazioni
 userRequests=Richieste utente
 delete=Rimuovi
 type=Tipo
-user=Utente
+username=Utente
 new_user=Nuovo utente
+creationDate = Data creazione
+claimDate = Data rivendicazione

Modified: syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo_pt_BR.properties
URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo_pt_BR.properties?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo_pt_BR.properties (original)
+++ syncope/trunk/console/src/main/resources/org/apache/syncope/console/pages/Todo_pt_BR.properties Wed Sep 18 15:33:15 2013
@@ -16,15 +16,17 @@
 # under the License.
 taskId=Tarefa
 key=Chave
-description=Descri\u00E7\u00E3o
-createTime=Tempo de Cria\u00E7\u00E3o
+description=Descri\u00e7\u00e3o
+createTime=Tempo de Cria\u00e7\u00e3o
 dueDate=Data acordada
-owner=Propriet\u00E1rio
+owner=Propriet\u00e1rio
 claim=Requerimento
-manage=Ger\u00EAncia
-approvals=Aprova\u00E7\u00E3o
-userRequests=Requisi\u00E7\u00F5es  de usu\u00E1rio
+manage=Ger\u00eancia
+approvals=Aprova\u00e7\u00e3o
+userRequests=Requisi\u00e7\u00f5es  de usu\u00e1rio
 delete=Excluir
 type=Tipo
-user=Usu\u00E1rio
-new_user=Novo Usu\u00E1rio
+username=Usu\u00e1rio
+new_user=Novo Usu\u00e1rio
+creationDate = Data de cria\u00e7\u00e3o
+claimDate = Data de reivindica\u00e7\u00e3o

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/UserRequest.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/UserRequest.java?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/UserRequest.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/beans/UserRequest.java Wed Sep 18 15:33:15 2013
@@ -18,7 +18,9 @@
  */
 package org.apache.syncope.core.persistence.beans;
 
+import java.util.Date;
 import javax.persistence.Basic;
+import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
@@ -26,6 +28,8 @@ import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Lob;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
@@ -44,6 +48,9 @@ public class UserRequest extends Abstrac
     @GeneratedValue(strategy = GenerationType.AUTO)
     private Long id;
 
+    @Column
+    private String username;
+
     @NotNull
     @Lob
     private String payload;
@@ -57,6 +64,32 @@ public class UserRequest extends Abstrac
     @Max(1)
     private Integer executed;
 
+    /**
+     * Creation date.
+     */
+    @Column(nullable = false)
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date creationDate;
+
+    /**
+     * Claim date.
+     */
+    @Column
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date claimDate;
+
+    /**
+     * Execution date.
+     */
+    @Column
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date executionDate;
+
+    /**
+     * Username of the last user who claimed the request.
+     */
+    private String owner;
+
     public UserRequest() {
         this.executed = 0;
     }
@@ -75,7 +108,7 @@ public class UserRequest extends Abstrac
                 : XMLSerializer.<UserTO>deserialize(payload);
     }
 
-    public void setUserTO(final UserTO userTO) {
+    public void createUser(final UserTO userTO) {
         type = UserRequestType.CREATE;
         payload = XMLSerializer.serialize(userTO);
     }
@@ -86,7 +119,7 @@ public class UserRequest extends Abstrac
                 : XMLSerializer.<UserMod>deserialize(payload);
     }
 
-    public void setUserMod(final UserMod userMod) {
+    public void updateUser(final UserMod userMod) {
         type = UserRequestType.UPDATE;
         payload = XMLSerializer.serialize(userMod);
     }
@@ -97,11 +130,19 @@ public class UserRequest extends Abstrac
                 : Long.valueOf(payload);
     }
 
-    public void setUserId(final Long userId) {
+    public void deleteUser(final Long userId) {
         type = UserRequestType.DELETE;
         payload = String.valueOf(userId);
     }
 
+    public void setUsername(final String username) {
+        this.username = username;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
     public boolean isExecuted() {
         return isBooleanAsInteger(executed);
     }
@@ -109,4 +150,36 @@ public class UserRequest extends Abstrac
     public void setExecuted(boolean executed) {
         this.executed = getBooleanAsInteger(executed);
     }
+
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    public Date getCreationDate() {
+        return creationDate;
+    }
+
+    public void setCreationDate(Date creationDate) {
+        this.creationDate = creationDate;
+    }
+
+    public Date getClaimDate() {
+        return claimDate;
+    }
+
+    public void setClaimDate(Date claimDate) {
+        this.claimDate = claimDate;
+    }
+
+    public Date getExecutionDate() {
+        return executionDate;
+    }
+
+    public void setExecutionDate(Date executionDate) {
+        this.executionDate = executionDate;
+    }
 }

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/UserRequestDAO.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/UserRequestDAO.java?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/UserRequestDAO.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/UserRequestDAO.java Wed Sep 18 15:33:15 2013
@@ -28,8 +28,10 @@ public interface UserRequestDAO extends 
     UserRequest find(Long id);
 
     List<UserRequest> findAll();
-    
-    List<UserRequest> findAll(final boolean executed);
+
+    List<UserRequest> findAll(boolean executed);
+
+    List<UserRequest> findAll(String username);
 
     UserRequest save(UserRequest userRequest) throws InvalidEntityException;
 

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/UserRequestDAOImpl.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/UserRequestDAOImpl.java?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/UserRequestDAOImpl.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/UserRequestDAOImpl.java Wed Sep 18 15:33:15 2013
@@ -56,6 +56,17 @@ public class UserRequestDAOImpl extends 
     }
 
     @Override
+    @Transactional(readOnly = true)
+    public List<UserRequest> findAll(final String username) {
+        TypedQuery<UserRequest> query = entityManager.createQuery(
+                "SELECT e " + "FROM " + UserRequest.class.getSimpleName() + " e WHERE e.username = :username",
+                UserRequest.class);
+        query.setParameter("username", username);
+
+        return query.getResultList();
+    }
+
+    @Override
     public UserRequest save(final UserRequest userRequest) throws InvalidEntityException {
         return entityManager.merge(userRequest);
     }

Copied: syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UnauthorizedException.java (from r1523973, syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UnauthorizedRoleException.java)
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UnauthorizedException.java?p2=syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UnauthorizedException.java&p1=syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UnauthorizedRoleException.java&r1=1523973&r2=1524459&rev=1524459&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UnauthorizedRoleException.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UnauthorizedException.java Wed Sep 18 15:33:15 2013
@@ -18,25 +18,11 @@
  */
 package org.apache.syncope.core.rest.controller;
 
-import java.util.Collections;
-import java.util.Set;
+public class UnauthorizedException extends RuntimeException {
 
-public class UnauthorizedRoleException extends RuntimeException {
+    private static final long serialVersionUID = -2723923005455058023L;
 
-	private static final long serialVersionUID = 7540587364235915081L;
-	
-	private final Set<Long> roleIds;
-
-    public UnauthorizedRoleException(final Set<Long> roleIds) {
-        super("Missing entitlement for role(s) " + roleIds);
-        this.roleIds = roleIds;
-    }
-
-    public UnauthorizedRoleException(final Long roleId) {
-        this(Collections.singleton(roleId));
-    }
-
-    public Set<Long> getRoleIds() {
-        return roleIds;
+    public UnauthorizedException(final String message) {
+        super(message);
     }
 }

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserRequestController.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserRequestController.java?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserRequestController.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserRequestController.java Wed Sep 18 15:33:15 2013
@@ -18,20 +18,20 @@
  */
 package org.apache.syncope.core.rest.controller;
 
-import static org.apache.syncope.common.types.UserRequestType.CREATE;
-import static org.apache.syncope.common.types.UserRequestType.DELETE;
-import static org.apache.syncope.common.types.UserRequestType.UPDATE;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
-
 import javax.persistence.RollbackException;
-
+import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.mod.UserMod;
 import org.apache.syncope.common.to.UserRequestTO;
 import org.apache.syncope.common.to.UserTO;
 import org.apache.syncope.common.types.AuditElements.Category;
 import org.apache.syncope.common.types.AuditElements.Result;
 import org.apache.syncope.common.types.AuditElements.UserRequestSubCategory;
+import org.apache.syncope.common.types.SyncopeClientExceptionType;
+import org.apache.syncope.common.validation.SyncopeClientCompositeErrorException;
+import org.apache.syncope.common.validation.SyncopeClientException;
 import org.apache.syncope.core.audit.AuditManager;
 import org.apache.syncope.core.persistence.beans.SyncopeConf;
 import org.apache.syncope.core.persistence.beans.UserRequest;
@@ -39,9 +39,11 @@ import org.apache.syncope.core.persisten
 import org.apache.syncope.core.persistence.dao.NotFoundException;
 import org.apache.syncope.core.persistence.dao.UserRequestDAO;
 import org.apache.syncope.core.rest.data.UserRequestDataBinder;
+import org.apache.syncope.core.util.EntitlementUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
@@ -94,11 +96,13 @@ public class UserRequestController {
         }
 
         UserRequest request = new UserRequest();
-        request.setUserTO(userTO);
+        request.setUsername(userTO.getUsername());
+        request.createUser(userTO);
+        request.setCreationDate(new Date());
         request = userRequestDAO.save(request);
 
         auditManager.audit(Category.userRequest, UserRequestSubCategory.create, Result.success,
-                "Successfully created user request for " + request.getUserTO().getUsername());
+                "Successfully created user request for " + request.getUsername());
 
         return binder.getUserRequestTO(request);
     }
@@ -114,11 +118,35 @@ public class UserRequestController {
         }
 
         UserRequest request = new UserRequest();
-        request.setUserMod(userMod);
+        request.setUsername(binder.getUserFromId(userMod.getId()).getUsername());
+        request.updateUser(userMod);
+        request.setCreationDate(new Date());
         request = userRequestDAO.save(request);
 
         auditManager.audit(Category.userRequest, UserRequestSubCategory.update, Result.success,
-                "Successfully updated user request for " + request.getUserMod().getId());
+                "Successfully updated user request for " + request.getUsername());
+
+        return binder.getUserRequestTO(request);
+    }
+
+    @PreAuthorize("isAuthenticated()")
+    public UserRequestTO delete(final Long userId) {
+        LOG.debug("Request user delete called with {}", userId);
+
+        try {
+            binder.testDelete(userId);
+        } catch (RollbackException e) {
+            LOG.debug("Testing delete - ignore exception");
+        }
+
+        UserRequest request = new UserRequest();
+        request.setUsername(binder.getUserFromId(userId).getUsername());
+        request.deleteUser(userId);
+        request.setCreationDate(new Date());
+        request = userRequestDAO.save(request);
+
+        auditManager.audit(Category.userRequest, UserRequestSubCategory.delete, Result.success,
+                "Successfully deleted user request for user" + request.getUsername());
 
         return binder.getUserRequestTO(request);
     }
@@ -154,6 +182,19 @@ public class UserRequestController {
         return result;
     }
 
+    public List<UserRequestTO> listByUsername(final String username) {
+        List<UserRequestTO> result = new ArrayList<UserRequestTO>();
+
+        for (UserRequest request : userRequestDAO.findAll(username)) {
+            result.add(binder.getUserRequestTO(request));
+        }
+
+        auditManager.audit(Category.userRequest, UserRequestSubCategory.list, Result.success,
+                String.format("Successfully listed all %s's requests: %d", username, result.size()));
+
+        return result;
+    }
+
     @PreAuthorize("hasRole('USER_REQUEST_READ')")
     @Transactional(readOnly = true)
     public UserRequestTO read(final Long requestId) {
@@ -164,49 +205,47 @@ public class UserRequestController {
 
         final UserRequestTO userRequestTO = binder.getUserRequestTO(request);
         auditManager.audit(Category.userRequest, UserRequestSubCategory.read, Result.success,
-                "Successfully read user request for " + getUserId(userRequestTO));
+                "Successfully read user request for " + request.getUsername());
 
         return userRequestTO;
     }
 
-    @PreAuthorize("isAuthenticated()")
-    public UserRequestTO delete(final Long userId) {
-        LOG.debug("Request user delete called with {}", userId);
-
-        try {
-            binder.testDelete(userId);
-        } catch (RollbackException e) {
-            LOG.debug("Testing delete - ignore exception");
+    @PreAuthorize("hasRole('USER_REQUEST_DELETE')")
+    public UserRequestTO deleteRequest(final Long requestId) {
+        UserRequest request = userRequestDAO.find(requestId);
+        if (request == null) {
+            throw new NotFoundException("User request " + requestId);
         }
 
-        UserRequest request = new UserRequest();
-        request.setUserId(userId);
-        request = userRequestDAO.save(request);
+        UserRequestTO requestToDelete = binder.getUserRequestTO(request);
+        userRequestDAO.delete(requestId);
 
         auditManager.audit(Category.userRequest, UserRequestSubCategory.delete, Result.success,
-                "Successfully deleted user request for user" + userId);
+                "Successfully deleted user request for user" + request.getUsername());
 
-        return binder.getUserRequestTO(request);
+        return requestToDelete;
     }
 
-    @PreAuthorize("hasRole('USER_REQUEST_DELETE')")
-    public UserRequestTO deleteRequest(final Long requestId) {
+    @PreAuthorize("hasRole('USER_REQUEST_CLAIM')")
+    public UserRequestTO claim(final Long requestId) {
         UserRequest request = userRequestDAO.find(requestId);
         if (request == null) {
             throw new NotFoundException("User request " + requestId);
         }
 
-        UserRequestTO requestToDelete = binder.getUserRequestTO(request);
+        request.setOwner(EntitlementUtil.getAuthenticatedUsername());
+        request.setClaimDate(new Date());
 
-        auditManager.audit(Category.userRequest, UserRequestSubCategory.delete, Result.success,
-                "Successfully deleted user request for user" + request.getUserId());
+        final UserRequestTO userRequestTO = binder.getUserRequestTO(userRequestDAO.save(request));
 
-        userRequestDAO.delete(requestId);
+        auditManager.audit(Category.userRequest, UserRequestSubCategory.claim, Result.success,
+                String.format("Successfully claimed user request %s by %s",
+                userRequestTO.getId(), userRequestTO.getOwner()));
 
-        return requestToDelete;
+        return userRequestTO;
     }
 
-    @PreAuthorize("hasRole('USER_REQUEST_READ') and ("
+    @PreAuthorize("hasRole('USER_REQUEST_EXECUTE') and ("
             + "(hasRole('USER_CREATE') and #request.type == #request.type.CREATE) or "
             + "(hasRole('USER_UPDATE') and #request.type == #request.type.UPDATE) or "
             + "(hasRole('USER_DELETE') and #request.type == #request.type.DELETE))")
@@ -216,6 +255,14 @@ public class UserRequestController {
             throw new NotFoundException("Executable user request " + request.getId());
         }
 
+        if (StringUtils.isBlank(request.getOwner())
+                || !request.getOwner().equalsIgnoreCase(EntitlementUtil.getAuthenticatedUsername())) {
+            final SyncopeClientCompositeErrorException scce =
+                    new SyncopeClientCompositeErrorException(HttpStatus.UNAUTHORIZED);
+            scce.addException(new SyncopeClientException(SyncopeClientExceptionType.Unauthorized));
+            throw scce;
+        }
+
         final UserTO res;
 
         switch (request.getType()) {
@@ -233,18 +280,12 @@ public class UserRequestController {
         }
 
         userRequest.setExecuted(true);
+        userRequest.setExecutionDate(new Date());
         userRequestDAO.save(userRequest);
 
         auditManager.audit(Category.userRequest, UserRequestSubCategory.execute, Result.success,
-                String.format("Successfully executed %s request for user %s",
-                request.getType(), getUserId(request)));
+                String.format("Successfully executed %s request for user %d", request.getType(), res.getId()));
 
         return res;
     }
-
-    private String getUserId(final UserRequestTO request) {
-        return request.getType() == CREATE ? request.getUserTO().getUsername()
-                : request.getType() == UPDATE ? String.valueOf(request.getUserMod().getId())
-                : String.valueOf(request.getUserId());
-    }
 }

Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/services/UserRequestServiceImpl.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/services/UserRequestServiceImpl.java?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/core/src/main/java/org/apache/syncope/core/services/UserRequestServiceImpl.java (original)
+++ syncope/trunk/core/src/main/java/org/apache/syncope/core/services/UserRequestServiceImpl.java Wed Sep 18 15:33:15 2013
@@ -90,6 +90,11 @@ public class UserRequestServiceImpl exte
     }
 
     @Override
+    public UserRequestTO claim(final Long requestId) {
+        return controller.claim(requestId);
+    }
+
+    @Override
     public UserTO executeCreate(final Long requestId, final UserTO reviewed) {
         return controller.execute(controller.read(requestId), reviewed, null);
     }
@@ -103,4 +108,9 @@ public class UserRequestServiceImpl exte
     public UserTO executeDelete(final Long requestId) {
         return controller.execute(controller.read(requestId), null, null);
     }
+
+    @Override
+    public List<UserRequestTO> listByUsername(final String username) {
+        return controller.listByUsername(username);
+    }
 }

Modified: syncope/trunk/core/src/main/resources/content.xml
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/resources/content.xml?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/core/src/main/resources/content.xml (original)
+++ syncope/trunk/core/src/main/resources/content.xml Wed Sep 18 15:33:15 2013
@@ -88,6 +88,8 @@ under the License.
   <Entitlement name="USER_REQUEST_LIST"/>
   <Entitlement name="USER_REQUEST_READ"/>
   <Entitlement name="USER_REQUEST_DELETE"/>
+  <Entitlement name="USER_REQUEST_EXECUTE"/>
+  <Entitlement name="USER_REQUEST_CLAIM"/>
   <Entitlement name="REPORT_LIST"/>
   <Entitlement name="REPORT_READ"/>
   <Entitlement name="REPORT_CREATE"/>

Modified: syncope/trunk/core/src/main/resources/quartz/tables_sqlServer.sql
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/resources/quartz/tables_sqlServer.sql?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/core/src/main/resources/quartz/tables_sqlServer.sql (original)
+++ syncope/trunk/core/src/main/resources/quartz/tables_sqlServer.sql Wed Sep 18 15:33:15 2013
@@ -16,71 +16,55 @@
 -- under the License.
 
 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS]') AND OBJECTPROPERTY(id, N'ISFOREIGNKEY') = 1)
-ALTER TABLE [dbo].[QRTZ_TRIGGERS] DROP CONSTRAINT FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS
-GO
+ALTER TABLE [dbo].[QRTZ_TRIGGERS] DROP CONSTRAINT FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS;
 
 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISFOREIGNKEY') = 1)
-ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] DROP CONSTRAINT FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS
-GO
+ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] DROP CONSTRAINT FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS;
 
 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISFOREIGNKEY') = 1)
-ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] DROP CONSTRAINT FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS
-GO
+ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] DROP CONSTRAINT FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS;
 
 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISFOREIGNKEY') = 1)
-ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] DROP CONSTRAINT FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS
-GO
+ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] DROP CONSTRAINT FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS;
 
 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_CALENDARS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
-DROP TABLE [dbo].[QRTZ_CALENDARS]
-GO
+DROP TABLE [dbo].[QRTZ_CALENDARS];
 
 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_CRON_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
-DROP TABLE [dbo].[QRTZ_CRON_TRIGGERS]
-GO
+DROP TABLE [dbo].[QRTZ_CRON_TRIGGERS];
 
 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_BLOB_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
-DROP TABLE [dbo].[QRTZ_BLOB_TRIGGERS]
-GO
+DROP TABLE [dbo].[QRTZ_BLOB_TRIGGERS];
 
 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_FIRED_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
-DROP TABLE [dbo].[QRTZ_FIRED_TRIGGERS]
-GO
+DROP TABLE [dbo].[QRTZ_FIRED_TRIGGERS];
 
 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_PAUSED_TRIGGER_GRPS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
-DROP TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS]
-GO
+DROP TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS];
 
 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_SCHEDULER_STATE]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
-DROP TABLE [dbo].[QRTZ_SCHEDULER_STATE]
-GO
+DROP TABLE [dbo].[QRTZ_SCHEDULER_STATE];
 
 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_LOCKS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
-DROP TABLE [dbo].[QRTZ_LOCKS]
-GO
+DROP TABLE [dbo].[QRTZ_LOCKS];
 
 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_JOB_DETAILS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
-DROP TABLE [dbo].[QRTZ_JOB_DETAILS]
-GO
+DROP TABLE [dbo].[QRTZ_JOB_DETAILS];
 
 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_SIMPLE_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
-DROP TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS]
-GO
+DROP TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS];
 
 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_SIMPROP_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
-DROP TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS]
-GO
+DROP TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS];
 
 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
-DROP TABLE [dbo].[QRTZ_TRIGGERS]
-GO
+DROP TABLE [dbo].[QRTZ_TRIGGERS];
 
 CREATE TABLE [dbo].[QRTZ_CALENDARS] (
   [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
   [CALENDAR_NAME] [VARCHAR] (200)  NOT NULL ,
   [CALENDAR] [IMAGE] NOT NULL
-) ON [PRIMARY]
-GO
+) ON [PRIMARY];
 
 CREATE TABLE [dbo].[QRTZ_CRON_TRIGGERS] (
   [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
@@ -88,8 +72,7 @@ CREATE TABLE [dbo].[QRTZ_CRON_TRIGGERS] 
   [TRIGGER_GROUP] [VARCHAR] (200)  NOT NULL ,
   [CRON_EXPRESSION] [VARCHAR] (120)  NOT NULL ,
   [TIME_ZONE_ID] [VARCHAR] (80) 
-) ON [PRIMARY]
-GO
+) ON [PRIMARY];
 
 CREATE TABLE [dbo].[QRTZ_FIRED_TRIGGERS] (
   [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
@@ -105,28 +88,24 @@ CREATE TABLE [dbo].[QRTZ_FIRED_TRIGGERS]
   [JOB_GROUP] [VARCHAR] (200)  NULL ,
   [IS_NONCONCURRENT] [VARCHAR] (1)  NULL ,
   [REQUESTS_RECOVERY] [VARCHAR] (1)  NULL 
-) ON [PRIMARY]
-GO
+) ON [PRIMARY];
 
 CREATE TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] (
   [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
   [TRIGGER_GROUP] [VARCHAR] (200)  NOT NULL 
-) ON [PRIMARY]
-GO
+) ON [PRIMARY];
 
 CREATE TABLE [dbo].[QRTZ_SCHEDULER_STATE] (
   [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
   [INSTANCE_NAME] [VARCHAR] (200)  NOT NULL ,
   [LAST_CHECKIN_TIME] [BIGINT] NOT NULL ,
   [CHECKIN_INTERVAL] [BIGINT] NOT NULL
-) ON [PRIMARY]
-GO
+) ON [PRIMARY];
 
 CREATE TABLE [dbo].[QRTZ_LOCKS] (
   [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
   [LOCK_NAME] [VARCHAR] (40)  NOT NULL 
-) ON [PRIMARY]
-GO
+) ON [PRIMARY];
 
 CREATE TABLE [dbo].[QRTZ_JOB_DETAILS] (
   [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
@@ -139,8 +118,7 @@ CREATE TABLE [dbo].[QRTZ_JOB_DETAILS] (
   [IS_UPDATE_DATA] [VARCHAR] (1)  NOT NULL ,
   [REQUESTS_RECOVERY] [VARCHAR] (1)  NOT NULL ,
   [JOB_DATA] [IMAGE] NULL
-) ON [PRIMARY]
-GO
+) ON [PRIMARY];
 
 CREATE TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] (
   [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
@@ -149,8 +127,7 @@ CREATE TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS
   [REPEAT_COUNT] [BIGINT] NOT NULL ,
   [REPEAT_INTERVAL] [BIGINT] NOT NULL ,
   [TIMES_TRIGGERED] [BIGINT] NOT NULL
-) ON [PRIMARY]
-GO
+) ON [PRIMARY];
 
 CREATE TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] (
   [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
@@ -167,16 +144,14 @@ CREATE TABLE [dbo].[QRTZ_SIMPROP_TRIGGER
   [DEC_PROP_2] [NUMERIC] (13,4) NULL,
   [BOOL_PROP_1] [VARCHAR] (1) NULL,
   [BOOL_PROP_2] [VARCHAR] (1) NULL,
-) ON [PRIMARY]
-GO
+) ON [PRIMARY];
 
 CREATE TABLE [dbo].[QRTZ_BLOB_TRIGGERS] (
   [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
   [TRIGGER_NAME] [VARCHAR] (200)  NOT NULL ,
   [TRIGGER_GROUP] [VARCHAR] (200)  NOT NULL ,
   [BLOB_DATA] [IMAGE] NULL
-) ON [PRIMARY]
-GO
+) ON [PRIMARY];
 
 CREATE TABLE [dbo].[QRTZ_TRIGGERS] (
   [SCHED_NAME] [VARCHAR] (120)  NOT NULL ,
@@ -195,16 +170,14 @@ CREATE TABLE [dbo].[QRTZ_TRIGGERS] (
   [CALENDAR_NAME] [VARCHAR] (200)  NULL ,
   [MISFIRE_INSTR] [SMALLINT] NULL ,
   [JOB_DATA] [IMAGE] NULL
-) ON [PRIMARY]
-GO
+) ON [PRIMARY];
 
 ALTER TABLE [dbo].[QRTZ_CALENDARS] WITH NOCHECK ADD
   CONSTRAINT [PK_QRTZ_CALENDARS] PRIMARY KEY  CLUSTERED
   (
     [SCHED_NAME],
     [CALENDAR_NAME]
-  )  ON [PRIMARY]
-GO
+  )  ON [PRIMARY];
 
 ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] WITH NOCHECK ADD
   CONSTRAINT [PK_QRTZ_CRON_TRIGGERS] PRIMARY KEY  CLUSTERED
@@ -212,40 +185,35 @@ ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] W
     [SCHED_NAME],
     [TRIGGER_NAME],
     [TRIGGER_GROUP]
-  )  ON [PRIMARY]
-GO
+  )  ON [PRIMARY];
 
 ALTER TABLE [dbo].[QRTZ_FIRED_TRIGGERS] WITH NOCHECK ADD
   CONSTRAINT [PK_QRTZ_FIRED_TRIGGERS] PRIMARY KEY  CLUSTERED
   (
     [SCHED_NAME],
     [ENTRY_ID]
-  )  ON [PRIMARY]
-GO
+  )  ON [PRIMARY];
 
 ALTER TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] WITH NOCHECK ADD
   CONSTRAINT [PK_QRTZ_PAUSED_TRIGGER_GRPS] PRIMARY KEY  CLUSTERED
   (
     [SCHED_NAME],
     [TRIGGER_GROUP]
-  )  ON [PRIMARY]
-GO
+  )  ON [PRIMARY];
 
 ALTER TABLE [dbo].[QRTZ_SCHEDULER_STATE] WITH NOCHECK ADD
   CONSTRAINT [PK_QRTZ_SCHEDULER_STATE] PRIMARY KEY  CLUSTERED
   (
     [SCHED_NAME],
     [INSTANCE_NAME]
-  )  ON [PRIMARY]
-GO
+  )  ON [PRIMARY];
 
 ALTER TABLE [dbo].[QRTZ_LOCKS] WITH NOCHECK ADD
   CONSTRAINT [PK_QRTZ_LOCKS] PRIMARY KEY  CLUSTERED
   (
     [SCHED_NAME],
     [LOCK_NAME]
-  )  ON [PRIMARY]
-GO
+  )  ON [PRIMARY];
 
 ALTER TABLE [dbo].[QRTZ_JOB_DETAILS] WITH NOCHECK ADD
   CONSTRAINT [PK_QRTZ_JOB_DETAILS] PRIMARY KEY  CLUSTERED
@@ -253,8 +221,7 @@ ALTER TABLE [dbo].[QRTZ_JOB_DETAILS] WIT
     [SCHED_NAME],
     [JOB_NAME],
     [JOB_GROUP]
-  )  ON [PRIMARY]
-GO
+  )  ON [PRIMARY];
 
 ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] WITH NOCHECK ADD
   CONSTRAINT [PK_QRTZ_SIMPLE_TRIGGERS] PRIMARY KEY  CLUSTERED
@@ -262,8 +229,7 @@ ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS]
     [SCHED_NAME],
     [TRIGGER_NAME],
     [TRIGGER_GROUP]
-  )  ON [PRIMARY]
-GO
+  )  ON [PRIMARY];
 
 ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] WITH NOCHECK ADD
   CONSTRAINT [PK_QRTZ_SIMPROP_TRIGGERS] PRIMARY KEY  CLUSTERED
@@ -271,8 +237,7 @@ ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS
     [SCHED_NAME],
     [TRIGGER_NAME],
     [TRIGGER_GROUP]
-  )  ON [PRIMARY]
-GO
+  )  ON [PRIMARY];
 
 ALTER TABLE [dbo].[QRTZ_TRIGGERS] WITH NOCHECK ADD
   CONSTRAINT [PK_QRTZ_TRIGGERS] PRIMARY KEY  CLUSTERED
@@ -280,8 +245,7 @@ ALTER TABLE [dbo].[QRTZ_TRIGGERS] WITH N
     [SCHED_NAME],
     [TRIGGER_NAME],
     [TRIGGER_GROUP]
-  )  ON [PRIMARY]
-GO
+  )  ON [PRIMARY];
 
 ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] ADD
   CONSTRAINT [FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY
@@ -293,8 +257,7 @@ ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] A
     [SCHED_NAME],
     [TRIGGER_NAME],
     [TRIGGER_GROUP]
-  ) ON DELETE CASCADE
-GO
+  ) ON DELETE CASCADE;
 
 ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] ADD
   CONSTRAINT [FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY
@@ -306,8 +269,7 @@ ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS]
     [SCHED_NAME],
     [TRIGGER_NAME],
     [TRIGGER_GROUP]
-  ) ON DELETE CASCADE
-GO
+  ) ON DELETE CASCADE;
 
 ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] ADD
   CONSTRAINT [FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY
@@ -319,8 +281,7 @@ ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS
     [SCHED_NAME],
     [TRIGGER_NAME],
     [TRIGGER_GROUP]
-  ) ON DELETE CASCADE
-GO
+  ) ON DELETE CASCADE;
 
 ALTER TABLE [dbo].[QRTZ_TRIGGERS] ADD
   CONSTRAINT [FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS] FOREIGN KEY
@@ -332,5 +293,4 @@ ALTER TABLE [dbo].[QRTZ_TRIGGERS] ADD
     [SCHED_NAME],
     [JOB_NAME],
     [JOB_GROUP]
-  )
-GO
+  );

Modified: syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/dao/EntitlementTest.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/dao/EntitlementTest.java?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/dao/EntitlementTest.java (original)
+++ syncope/trunk/core/src/test/java/org/apache/syncope/core/persistence/dao/EntitlementTest.java Wed Sep 18 15:33:15 2013
@@ -41,7 +41,7 @@ public class EntitlementTest extends Abs
     @Test
     public void findAll() {
         List<Entitlement> list = entitlementDAO.findAll();
-        assertEquals("did not get expected number of entitlements ", 84, list.size());
+        assertEquals("did not get expected number of entitlements ", 86, list.size());
     }
 
     @Test

Modified: syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserRequestTestITCase.java
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserRequestTestITCase.java?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserRequestTestITCase.java (original)
+++ syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserRequestTestITCase.java Wed Sep 18 15:33:15 2013
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.rest;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertFalse;
@@ -39,6 +40,7 @@ import org.apache.syncope.common.to.Conf
 import org.apache.syncope.common.to.UserRequestTO;
 import org.apache.syncope.common.to.UserTO;
 import org.apache.syncope.common.types.SyncopeClientExceptionType;
+import org.apache.syncope.common.types.UserRequestType;
 import org.apache.syncope.common.validation.SyncopeClientCompositeErrorException;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
@@ -202,7 +204,8 @@ public class UserRequestTestITCase exten
 
     @Test
     public void execute() {
-        UserTO userTO = UserTestITCase.getUniqueSampleTO("ex.create@syncope.apache.org");
+        final String USERNAME = "ex.create@syncope.apache.org";
+        UserTO userTO = UserTestITCase.getUniqueSampleTO(USERNAME);
         final String initialPassword = userTO.getPassword();
 
         UserRequestService selfservice = createServiceInstance(UserRequestService.class, null, null);
@@ -210,6 +213,11 @@ public class UserRequestTestITCase exten
 
         UserRequestTO userRequest = getObject(response, UserRequestTO.class, userRequestService);
         assertNotNull(userRequest);
+        assertEquals(UserRequestType.CREATE, userRequest.getType());
+        assertTrue(userRequest.getUsername().endsWith(USERNAME));
+        assertNotNull(userRequest.getCreationDate());
+        assertNull(userRequest.getClaimDate());
+        assertNull(userRequest.getExecutionDate());
 
         try {
             userService.read(userTO.getUsername());
@@ -219,8 +227,21 @@ public class UserRequestTestITCase exten
         }
 
         assertFalse(userRequestService.read(userRequest.getId()).isExecuted());
+        userRequest = userRequestService.claim(userRequest.getId());
+        assertEquals("admin", userRequest.getOwner());
+        assertTrue(userRequest.getUsername().endsWith(USERNAME));
+        assertNotNull(userRequest.getCreationDate());
+        assertNotNull(userRequest.getClaimDate());
+        assertNull(userRequest.getExecutionDate());
+
         assertNotNull(userRequestService.executeCreate(userRequest.getId(), userTO));
-        assertTrue(userRequestService.read(userRequest.getId()).isExecuted());
+
+        userRequest = userRequestService.read(userRequest.getId());
+        assertTrue(userRequest.isExecuted());
+        assertTrue(userRequest.getUsername().endsWith(USERNAME));
+        assertNotNull(userRequest.getCreationDate());
+        assertNotNull(userRequest.getClaimDate());
+        assertNotNull(userRequest.getExecutionDate());
 
         for (UserRequestTO userRequestTO : userRequestService.list()) {
             assertFalse(userRequestTO.isExecuted());
@@ -239,6 +260,8 @@ public class UserRequestTestITCase exten
 
         userRequest = getObject(response, UserRequestTO.class, userRequestService);
         assertNotNull(userRequest);
+        assertEquals(UserRequestType.UPDATE, userRequest.getType());
+        assertTrue(userRequest.getUsername().endsWith(USERNAME));
 
         final String newpwd = "new" + initialPassword + "!";
 
@@ -247,6 +270,8 @@ public class UserRequestTestITCase exten
         furtherChanges.setPassword(newpwd);
 
         assertFalse(userRequestService.read(userRequest.getId()).isExecuted());
+        userRequest = userRequestService.claim(userRequest.getId());
+        assertEquals("admin", userRequest.getOwner());
         assertNotNull(userRequestService.executeUpdate(userRequest.getId(), furtherChanges));
         assertTrue(userRequestService.read(userRequest.getId()).isExecuted());
 
@@ -270,8 +295,12 @@ public class UserRequestTestITCase exten
 
         userRequest = getObject(response, UserRequestTO.class, userRequestService);
         assertNotNull(userRequest);
+        assertEquals(UserRequestType.DELETE, userRequest.getType());
+        assertTrue(userRequest.getUsername().endsWith(USERNAME));
 
         assertFalse(userRequestService.read(userRequest.getId()).isExecuted());
+        userRequest = userRequestService.claim(userRequest.getId());
+        assertEquals("admin", userRequest.getOwner());
         userRequestService.executeDelete(userRequest.getId());
         assertTrue(userRequestService.read(userRequest.getId()).isExecuted());
 
@@ -285,6 +314,21 @@ public class UserRequestTestITCase exten
         } catch (Exception ignore) {
             // ignore
         }
+
+        assertEquals(3, userRequestService.listByUsername(userTO.getUsername()).size());
+    }
+
+    @Test(expected = SyncopeClientCompositeErrorException.class)
+    public void executeNoClaim() {
+        UserTO userTO = UserTestITCase.getUniqueSampleTO("reqnoclaim@syncope.apache.org");
+
+        final UserRequestService selfservice = createServiceInstance(UserRequestService.class, null, null);
+
+        final UserRequestTO userRequest = getObject(
+                createUserRequest(selfservice, new UserRequestTO(userTO)), UserRequestTO.class, userRequestService);
+        assertNotNull(userRequest);
+
+        userRequestService.executeCreate(userRequest.getId(), userTO);
     }
 
     private Response createUserRequest(final UserRequestService service, final UserRequestTO userRequestTO) {

Modified: syncope/trunk/core/src/test/resources/content.xml
URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/test/resources/content.xml?rev=1524459&r1=1524458&r2=1524459&view=diff
==============================================================================
--- syncope/trunk/core/src/test/resources/content.xml (original)
+++ syncope/trunk/core/src/test/resources/content.xml Wed Sep 18 15:33:15 2013
@@ -863,6 +863,8 @@ under the License.
   <Entitlement name="USER_REQUEST_LIST"/>
   <Entitlement name="USER_REQUEST_READ"/>
   <Entitlement name="USER_REQUEST_DELETE"/>
+  <Entitlement name="USER_REQUEST_EXECUTE"/>
+  <Entitlement name="USER_REQUEST_CLAIM"/>
   <Entitlement name="REPORT_LIST"/>
   <Entitlement name="REPORT_READ"/>
   <Entitlement name="REPORT_CREATE"/>