You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by ma...@apache.org on 2020/11/17 18:11:39 UTC

[archiva-redback-core] 01/03: Adding additional role fields

This is an automated email from the ASF dual-hosted git repository.

martin_s pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/archiva-redback-core.git

commit 9830759dbbedb106a189c60c040cdb11deece506
Author: Martin Stockhammer <ma...@apache.org>
AuthorDate: Mon Nov 16 11:08:14 2020 +0100

    Adding additional role fields
---
 ...RoleManagementService.java => RoleService.java} |  65 +++++--
 .../apache/archiva/redback/rbac/AbstractRole.java  |   1 +
 .../java/org/apache/archiva/redback/rbac/Role.java | 121 ++++++++++---
 .../archiva/redback/rbac/jpa/model/JpaRole.java    |  92 +++++++++-
 .../archiva/redback/rbac/ldap/LdapRbacManager.java | 153 ++++++++++++----
 .../archiva/redback/rbac/memory/MemoryRole.java    | 197 ++++++++++++---------
 6 files changed, 467 insertions(+), 162 deletions(-)

diff --git a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/RoleManagementService.java b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/RoleService.java
similarity index 81%
rename from redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/RoleManagementService.java
rename to redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/RoleService.java
index c9d2e2d..82143f4 100644
--- a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/RoleManagementService.java
+++ b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/RoleService.java
@@ -18,18 +18,29 @@ package org.apache.archiva.redback.rest.api.services.v2;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
 import org.apache.archiva.redback.integration.security.role.RedbackRoleConstants;
 import org.apache.archiva.redback.rest.api.model.ActionStatus;
 import org.apache.archiva.redback.rest.api.model.Application;
 import org.apache.archiva.redback.rest.api.model.ApplicationRoles;
+import org.apache.archiva.redback.rest.api.model.RedbackRestError;
 import org.apache.archiva.redback.rest.api.model.v2.AvailabilityStatus;
 import org.apache.archiva.redback.rest.api.model.Role;
 import org.apache.archiva.redback.rest.api.model.User;
 import org.apache.archiva.redback.rest.api.model.VerificationStatus;
+import org.apache.archiva.redback.rest.api.model.v2.PagedResult;
+import org.apache.archiva.redback.rest.api.model.v2.RoleInfo;
 import org.apache.archiva.redback.rest.api.services.RedbackServiceException;
 
 import javax.ws.rs.Consumes;
+import javax.ws.rs.DefaultValue;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
@@ -39,13 +50,55 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import java.util.List;
 
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+import static org.apache.archiva.redback.rest.api.Constants.DEFAULT_PAGE_LIMIT;
+
 /**
  * @author Olivier Lamy
  */
-@Path( "/roleManagementService/" )
+@Path( "/roles" )
+@Tag(name = "v2")
+@Tag(name = "v2/Roles")
+@SecurityRequirement(name = "BearerAuth")
 public interface RoleManagementService
 {
 
+    /**
+     * @since 2.0
+     */
+    @Path( "" )
+    @GET
+    @Produces( { MediaType.APPLICATION_JSON } )
+    @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION )
+    @Operation( summary = "Returns all roles defined. The result is paged.",
+        parameters = {
+            @Parameter(name = "q", description = "Search term"),
+            @Parameter(name = "offset", description = "The offset of the first element returned"),
+            @Parameter(name = "limit", description = "Maximum number of items to return in the response"),
+            @Parameter(name = "orderBy", description = "List of attribute used for sorting (user_id, fullName, email, created"),
+            @Parameter(name = "order", description = "The sort order. Either ascending (asc) or descending (desc)")
+        },
+        security = {
+            @SecurityRequirement(
+                name = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION
+            )
+        },
+        responses = {
+            @ApiResponse( responseCode = "200",
+                description = "If the list could be returned",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = PagedResult.class))
+            ),
+            @ApiResponse( responseCode = "403", description = "Authenticated user is not permitted to gather the information",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )) )
+        }
+    )
+    PagedResult<RoleInfo> getAllRoles( @QueryParam("q") @DefaultValue( "" ) String searchTerm,
+                                       @QueryParam( "offset" ) @DefaultValue( "0" ) Integer offset,
+                                       @QueryParam( "limit" ) @DefaultValue( value = DEFAULT_PAGE_LIMIT ) Integer limit,
+                                       @QueryParam( "orderBy") @DefaultValue( "id" ) List<String> orderBy,
+                                       @QueryParam("order") @DefaultValue( "asc" ) String order)
+        throws RedbackServiceException;
+
     @Path( "createTemplatedRole" )
     @GET
     @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@@ -220,15 +273,7 @@ public interface RoleManagementService
         throws RedbackServiceException;
 
 
-    /**
-     * @since 2.0
-     */
-    @Path( "allRoles" )
-    @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
-    @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_RBAC_ADMIN_OPERATION )
-    List<Role> getAllRoles()
-        throws RedbackServiceException;
+
 
     /**
      * @since 2.0
diff --git a/redback-rbac/redback-rbac-model/src/main/java/org/apache/archiva/redback/rbac/AbstractRole.java b/redback-rbac/redback-rbac-model/src/main/java/org/apache/archiva/redback/rbac/AbstractRole.java
index 7780b1c..a90f66a 100644
--- a/redback-rbac/redback-rbac-model/src/main/java/org/apache/archiva/redback/rbac/AbstractRole.java
+++ b/redback-rbac/redback-rbac-model/src/main/java/org/apache/archiva/redback/rbac/AbstractRole.java
@@ -26,6 +26,7 @@ public abstract class AbstractRole
     implements Role
 {
 
+    @Override
     public boolean hasChildRoles()
     {
         return ( getChildRoleNames() != null ) && !getChildRoleNames().isEmpty();
diff --git a/redback-rbac/redback-rbac-model/src/main/java/org/apache/archiva/redback/rbac/Role.java b/redback-rbac/redback-rbac-model/src/main/java/org/apache/archiva/redback/rbac/Role.java
index 3e2405e..6990273 100644
--- a/redback-rbac/redback-rbac-model/src/main/java/org/apache/archiva/redback/rbac/Role.java
+++ b/redback-rbac/redback-rbac-model/src/main/java/org/apache/archiva/redback/rbac/Role.java
@@ -16,6 +16,8 @@ package org.apache.archiva.redback.rbac;
  * limitations under the License.
  */
 
+import org.apache.commons.lang3.StringUtils;
+
 import java.util.List;
 
 /**
@@ -31,32 +33,33 @@ import java.util.List;
  *
  * @author Jesse McConnell
  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @author Martin Stockhammer <ma...@apache.org>
  *
  */
 public interface Role
 {
 
     /**
-     * Method addPermission
+     * Adds a permission to the list
      *
-     * @param permission
+     * @param permission the permission to add to the list
      */
     void addPermission( Permission permission );
 
     /**
-     * Method addChildRoleName
+     * Adds a role to the list of child roles
      *
      * @param name the name of the child role.
      */
     void addChildRoleName( String name );
 
     /**
-     * Method getChildRoleNames
+     * Returns the list of child roles
      */
     List<String> getChildRoleNames();
 
     /**
-     * Convienence method to see if Role has Child Roles.
+     * Convenience method to see if Role has Child Roles.
      *
      * @return true if child roles exists and has any roles being tracked.
      */
@@ -64,74 +67,80 @@ public interface Role
 
     /**
      * Long description of the role.
+     * @return the role description
      */
     String getDescription();
 
     /**
-     * Get the name.
+     * Get the name. Must be unique.
      *
      * NOTE: This field is considered the Primary Key for this object.
+     * @return the name of the role
      */
     String getName();
 
     /**
-     * Method getPermissions
+     * Returns the list of permissions assigned to this role.
+     * @return the list of permissions assigned to this role
      */
     List<? extends Permission> getPermissions();
 
     /**
-     * true if this role is available to be assigned to a user
+     * <code>True</code>, if this role is available to be assigned to a user, otherwise <code>false</code>.
+     *
+     * @return <code>true</code>, if this role can be assigned to users, otherwise <code>false</code>
      */
     boolean isAssignable();
 
     /**
-     * Method removePermission
+     * Removes the given permission from the list. If the permission does not exist in the list of assigned
+     * permissions, nothing happens.
      *
-     * @param permission
+     * @param permission the permission to remove.
      */
     void removePermission( Permission permission );
 
     /**
-     * true if this role is available to be assigned to a user
+     * Set to <code>true</code>, if this role should available to be assigned to a user
      *
-     * @param assignable
+     * @param assignable the assignable flag
      */
     void setAssignable( boolean assignable );
 
     /**
-     * The names of the roles that will inherit the permissions of this role
+     * Sets the names of children roles. Children roles inherit the permissions of the parent role.
      *
-     * @param names the list of names of other roles.
+     * @param names the list of names of child roles.
      */
     void setChildRoleNames( List<String> names );
 
     /**
      * Set the Description
      *
-     * @param description
+     * @param description the role description
      */
     void setDescription( String description );
 
     /**
-     * Set Name
+     * Set the role name
      *
      * NOTE: This field is considered the Primary Key for this object.
      *
-     * @param name
+     * @param name the role name
      */
     void setName( String name );
 
     /**
-     * Set Permissions
+     * Set role permissions. The list of assigned permissions is replaced by this list.
      *
-     * @param permissions
+     * @param permissions the permissions to set
      */
     void setPermissions( List<Permission> permissions );
 
     /**
      * Test to see if the object is a permanent object or not.
      *
-     * @return true if the object is permanent.
+     * @return <code>true</code>, if the object is permanent.
      */
     boolean isPermanent();
 
@@ -141,4 +150,76 @@ public interface Role
      * @param permanent true if the object is permanent.
      */
     void setPermanent( boolean permanent );
+
+    /**
+     * The role identifier. Should be built from the modelId and the resource. And must be unique.
+     *
+     * @since 3.0
+     * @return the role identifier
+     */
+    default String getId() {
+        return StringUtils.isEmpty( getModelId() )?getName():(isTemplateInstance()?getModelId()+"."+getResource():getModelId());
+    }
+
+    /**
+     * Sets the role id
+     *
+     * @since 3.0
+     * @param id the identifier of the role, should not be null or empty.
+     */
+    void setId(String id);
+
+    /**
+     * Returns the model the role is derived from.
+     *
+     * @since 3.0
+     * @return The model id or empty string, if this role was not created from a model
+     */
+    default String getModelId( ) {
+        return "";
+    }
+
+    /**
+     * Sets the model id.
+     *
+     * @param modelId the identifier of the model, or empty string. Should not be null.
+     */
+    void setModelId(String modelId);
+
+    /**
+     * Returns <code>true</code>, if this role is a instance of a template role, otherwise <code>false</code>.
+     * Templated roles are built from a template together with a resource identifier.
+     *
+     * @since 3.0
+     * @return <code>true</code>, if this role is a templated role, otherwise <code>false</code>
+     */
+    default boolean isTemplateInstance( ) {
+        return StringUtils.isEmpty( getResource() );
+    }
+
+    /**
+     * Sets the template instance flag.
+     *
+     * @since 3.0
+     * @param templateInstanceFlag Set to <code>true</code>, if this is a template instance, otherwise <code>false</code>
+     */
+    void setTemplateInstance(boolean templateInstanceFlag);
+
+    /**
+     * Returns the resource that is used to build this role from a template. If this is not a templated
+     * role, a empty string should be returned.
+     *
+     * @since 3.0
+     * @return the resource identifier, used to build this role or a empty string, if this role is not templated
+     */
+    default String getResource() {
+        return "";
+    }
+
+    /**
+     * Sets the resource, this template instance is attached to.
+     *
+     * @param resource the resource identifier. Must not be null.
+     */
+    void setResource( String resource );
 }
\ No newline at end of file
diff --git a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaRole.java b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaRole.java
index 0d8966e..323a73f 100644
--- a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaRole.java
+++ b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaRole.java
@@ -21,6 +21,8 @@ package org.apache.archiva.redback.rbac.jpa.model;
 
 import org.apache.archiva.redback.rbac.AbstractRole;
 import org.apache.archiva.redback.rbac.Permission;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.core.annotation.Order;
 
 import javax.persistence.*;
@@ -37,9 +39,13 @@ import java.util.List;
 )
 public class JpaRole extends AbstractRole implements Serializable {
 
+    private static final Logger log = LoggerFactory.getLogger( JpaRole.class );
+
     @Id
     @Column(name="NAME")
     private String name;
+    @Column(name="ID", unique = true)
+    private String id;
     @Column(name="DESCRIPTION")
     private String description;
     @Column(name="ASSIGNABLE",nullable = false)
@@ -68,7 +74,14 @@ public class JpaRole extends AbstractRole implements Serializable {
     )
     List<String> childRoleNames = new ArrayList<String>();
 
+    @Column(name="TEMPLATE_INSTANCE",nullable = false)
+    private Boolean templateInstance = false;
+
+    @Column(name="MODEL_ID",nullable = false)
+    private String modelId = "";
 
+    @Column(name="RESOURCE",nullable = false)
+    private String resource = "";
 
     @Override
     public void addPermission(Permission permission) {
@@ -157,19 +170,82 @@ public class JpaRole extends AbstractRole implements Serializable {
     }
 
     @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        if (!super.equals(o)) return false;
+    public void setId( String id )
+    {
+        if (id==null)  {
+            log.error( "Null value for role id" );
+            throw new NullPointerException( "ID may not be null" );
+        }
+        this.id = id;
+    }
+
+    @Override
+    public String getId( )
+    {
+        return id;
+    }
 
-        JpaRole jpaRole = (JpaRole) o;
+    @Override
+    public void setModelId( String modelId )
+    {
+        if (modelId==null) {
+            this.modelId = "";
+        } else
+        {
+            this.modelId = modelId;
+        }
+    }
+
+    @Override
+    public String getModelId( )
+    {
+        return modelId;
+    }
+
+    @Override
+    public void setTemplateInstance( boolean templateInstanceFlag )
+    {
+        this.templateInstance = templateInstanceFlag;
+    }
+
+    @Override
+    public boolean isTemplateInstance( )
+    {
+        return this.templateInstance;
+    }
 
-        return name.equals(jpaRole.name);
+    @Override
+    public void setResource( String resource )
+    {
+        if (resource==null) {
+            this.resource = "";
+        } else
+        {
+            this.resource = resource;
+        }
+    }
+
+    @Override
+    public String getResource( )
+    {
+        return resource;
+    }
+
+    @Override
+    public boolean equals( Object o )
+    {
+        if ( this == o ) return true;
+        if ( o == null || getClass( ) != o.getClass( ) ) return false;
+        if ( !super.equals( o ) ) return false;
+
+        JpaRole jpaRole = (JpaRole) o;
 
+        return name.equals( jpaRole.name );
     }
 
     @Override
-    public int hashCode() {
-        return name.hashCode();
+    public int hashCode( )
+    {
+        return name.hashCode( );
     }
 }
diff --git a/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/main/java/org/apache/archiva/redback/rbac/ldap/LdapRbacManager.java b/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/main/java/org/apache/archiva/redback/rbac/ldap/LdapRbacManager.java
index 3fdbe59..599edc9 100644
--- a/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/main/java/org/apache/archiva/redback/rbac/ldap/LdapRbacManager.java
+++ b/redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/main/java/org/apache/archiva/redback/rbac/ldap/LdapRbacManager.java
@@ -63,7 +63,10 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * LdapRbacManager will read datas from ldap for mapping groups to role.
@@ -220,19 +223,14 @@ public class LdapRbacManager
     {
         try
         {
-            Collection<Collection<String>> roleNames = ldapRoleMapperConfiguration.getLdapGroupMappings().values();
-
-            Set<Role> roles = new HashSet<Role>();
-
-            for ( Collection<String> names : roleNames )
-            {
-                for ( String name : names )
+            return ldapRoleMapperConfiguration.getLdapGroupMappings( ).entrySet( ).stream( ).flatMap( entry ->{
+                if (entry.getValue()==null) {
+                    return Stream.empty( );
+                } else
                 {
-                    roles.add( new RoleImpl( name ) );
+                    return entry.getValue( ).stream( ).map( role -> new RoleImpl( entry.getKey( ) + role, role ) );
                 }
-            }
-
-            return new ArrayList<Role>( roles );
+            } ).collect( Collectors.toList( ) );
         }
         catch ( MappingException e )
         {
@@ -373,45 +371,38 @@ public class LdapRbacManager
         {
             return Collections.emptyList();
         }
-
-        List<Role> roles = new ArrayList<Role>( groups.size() );
-        Map<String, Collection<String>> mappedGroups = ldapRoleMapperConfiguration.getLdapGroupMappings();
-        for ( String group : groups )
+        final Map<String, Collection<String>> mappedGroups = ldapRoleMapperConfiguration.getLdapGroupMappings();
+        try
         {
-            Collection<String> roleNames = mappedGroups.get( group );
-            if ( roleNames != null )
-            {
-                for ( String roleName : roleNames )
-                {
-                    Role role = buildRole( roleName );
-                    roles.add( role );
-                }
-            }
-            else if ( this.ldapRoleMapper.isUseDefaultRoleName() )
+            return groups.stream( ).flatMap( group -> mappedGroups.get( group ) == null ?
+                ( this.ldapRoleMapper.isUseDefaultRoleName( ) ? Stream.of( this.buildRole( group, group ) ) : Stream.empty( ) )
+                : mappedGroups.get( group ).stream( ).map( roleName -> this.buildRole( group + roleName, roleName ) ) ).collect( Collectors.toList( ) );
+        } catch (RuntimeException e) {
+            if (e.getCause() instanceof RbacManagerException)
             {
-                Role role = buildRole( group );
-                roles.add( role );
-
-
+                throw ( (RbacManagerException) e.getCause( ) );
+            } else {
+                throw new MappingException( e.getMessage(), e );
             }
         }
-        return roles;
-
     }
 
-    private Role buildRole( String group )
-        throws RbacManagerException
+    private Role buildRole( String groupId, String roleName )
     {
         Role role = null;
         try
         {
-            role = this.rbacImpl.getRole( group );
+            role = this.rbacImpl.getRole( roleName );
         }
         catch ( RbacObjectNotFoundException e )
         {
             // if it's mapped role to a group it doesn't exist in jpa
         }
-        role = ( role == null ) ? new RoleImpl( group ) : role;
+        catch ( RbacManagerException e )
+        {
+            throw new RuntimeException( e );
+        }
+        role = ( role == null ) ? new RoleImpl( groupId, roleName ) : role;
         if ( role != null )
         {
             rolesCache.put( role.getName(), role );
@@ -574,10 +565,22 @@ public class LdapRbacManager
             throw new RbacManagerException( e.getMessage(), e );
         }
         role = this.rbacImpl.getRole( roleName );
+        if (role==null)
+        {
+            try
+            {
+                String groupName = ldapRoleMapperConfiguration.getLdapGroupMappings( ).entrySet( ).stream( )
+                    .filter( entry -> entry.getValue( ).contains( roleName ) )
+                    .map( entry -> entry.getKey( ) ).findFirst( ).orElseGet( String::new );
+                role = new RoleImpl( groupName + roleName, roleName );
+            }
+            catch ( MappingException e )
+            {
+                role = new RoleImpl( roleName );
+            }
+        };
         role = ( role == null ) ? new RoleImpl( roleName ) : role;
-
         rolesCache.put( roleName, role );
-
         return role;
     }
 
@@ -1191,6 +1194,10 @@ public class LdapRbacManager
         private String name;
 
         private String description;
+        private String id="";
+        private String modelId="";
+        private boolean isTemplateInstance=false;
+        private String resource="";
 
         private List<Permission> permissions = new ArrayList<Permission>();
 
@@ -1199,6 +1206,12 @@ public class LdapRbacManager
         private RoleImpl( String name )
         {
             this.name = name;
+            this.id = name;
+        }
+
+        private RoleImpl(String id, String name) {
+            this.id = id;
+            this.name = name;
         }
 
         private RoleImpl( String name, List<Permission> permissions )
@@ -1334,6 +1347,72 @@ public class LdapRbacManager
         {
             return name != null ? name.hashCode() : 0;
         }
+
+
+        @Override
+        public String getId( )
+        {
+            return id;
+        }
+
+        @Override
+        public void setId( String id )
+        {
+            if (id==null) {
+                this.id = "";
+            } else
+            {
+                this.id = id;
+            }
+        }
+
+        @Override
+        public String getModelId( )
+        {
+            return modelId;
+        }
+
+        @Override
+        public void setModelId( String modelId )
+        {
+            if (modelId==null) {
+                this.modelId = "";
+            } else
+            {
+                this.modelId = modelId;
+            }
+        }
+
+        @Override
+        public boolean isTemplateInstance( )
+        {
+            return isTemplateInstance;
+        }
+
+        @Override
+        public void setTemplateInstance( boolean templateInstance )
+        {
+            isTemplateInstance = templateInstance;
+        }
+
+        @Override
+        public String getResource( )
+        {
+            return resource;
+        }
+
+        @Override
+        public void setResource( String resource )
+        {
+            if (resource==null) {
+                this.resource = "";
+            } else
+            {
+                this.resource = resource;
+            }
+        }
+
+
     }
 
     private static class UserAssignmentImpl
diff --git a/redback-rbac/redback-rbac-providers/redback-rbac-memory/src/main/java/org/apache/archiva/redback/rbac/memory/MemoryRole.java b/redback-rbac/redback-rbac-providers/redback-rbac-memory/src/main/java/org/apache/archiva/redback/rbac/memory/MemoryRole.java
index 9ab38f6..c243af8 100644
--- a/redback-rbac/redback-rbac-providers/redback-rbac-memory/src/main/java/org/apache/archiva/redback/rbac/memory/MemoryRole.java
+++ b/redback-rbac/redback-rbac-providers/redback-rbac-memory/src/main/java/org/apache/archiva/redback/rbac/memory/MemoryRole.java
@@ -30,6 +30,7 @@ import java.util.List;
  * MemoryRole
  *
  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @author Martin Stockhammer <ma...@apache.org>
  *
  */
 public class MemoryRole
@@ -37,11 +38,14 @@ public class MemoryRole
     implements Role, java.io.Serializable
 {
 
+    private static final long serialVersionUID = -2784061560950152088L;
     /**
      * Field name
      */
     private String name;
 
+    private String id;
+
     /**
      * Field description
      */
@@ -55,23 +59,23 @@ public class MemoryRole
     /**
      * Field childRoleNames
      */
-    private List<String> childRoleNames = new ArrayList<String>( 0 );
+    private List<String> childRoleNames = new ArrayList<>( 0 );
 
     /**
      * Field permissions
      */
-    private List<Permission> permissions = new ArrayList<Permission>( 0 );
+    private List<Permission> permissions = new ArrayList<>( 0 );
 
     /**
      * Field permanent
      */
     private boolean permanent = false;
 
-    /**
-     * Method addPermission
-     *
-     * @param memoryPermission
-     */
+    private String modelId = "";
+    private String resource = "";
+    private boolean isTemplateInstance;
+
+    @Override
     public void addPermission( Permission memoryPermission )
     {
         if ( !( memoryPermission instanceof MemoryPermission ) )
@@ -82,86 +86,55 @@ public class MemoryRole
         getPermissions().add( memoryPermission );
     }
 
-    /**
-     * Method equals
-     *
-     * @param other
-     */
-    public boolean equals( Object other )
+    @Override
+    public boolean equals( Object o )
     {
-        if ( this == other )
-        {
-            return true;
-        }
+        if ( this == o ) return true;
+        if ( o == null || getClass( ) != o.getClass( ) ) return false;
+        if ( !super.equals( o ) ) return false;
 
-        if ( !( other instanceof MemoryRole ) )
-        {
-            return false;
-        }
+        MemoryRole that = (MemoryRole) o;
 
-        MemoryRole that = (MemoryRole) other;
-        boolean result = true;
-        result = result && ( getName() == null ? that.getName() == null : getName().equals( that.getName() ) );
-        return result;
+        return name.equals( that.name );
     }
 
-    /**
-     * Method getChildRoles
-     */
+    @Override
+    public int hashCode( )
+    {
+        return name.hashCode( );
+    }
+
+    @Override
     public List<String> getChildRoleNames()
     {
         return this.childRoleNames;
     }
 
-    /**
-     * Get null
-     */
+    @Override
     public String getDescription()
     {
         return this.description;
     }
 
-    /**
-     * Get null
-     */
+    @Override
     public String getName()
     {
         return this.name;
     }
 
-    /**
-     * Method getPermissions
-     */
+    @Override
     public List<Permission> getPermissions()
     {
         return this.permissions;
     }
 
-    /**
-     * Method hashCode
-     */
-    public int hashCode()
-    {
-        int result = 17;
-        result = 37 * result + ( name != null ? name.hashCode() : 0 );
-        return result;
-    }
-
-    /**
-     * Get
-     * true if this role is available to be assigned to
-     * a user
-     */
+    @Override
     public boolean isAssignable()
     {
         return this.assignable;
     }
 
-    /**
-     * Method removePermission
-     *
-     * @param memoryPermission
-     */
+    @Override
     public void removePermission( Permission memoryPermission )
     {
         if ( !( memoryPermission instanceof MemoryPermission ) )
@@ -172,64 +145,47 @@ public class MemoryRole
         getPermissions().remove( memoryPermission );
     }
 
-    /**
-     * Set
-     * true if this role is available to be assigned to
-     * a user
-     *
-     * @param assignable
-     */
+    @Override
     public void setAssignable( boolean assignable )
     {
         this.assignable = assignable;
     }
 
-    /**
-     * Set null
-     *
-     * @param description
-     */
+    @Override
     public void setDescription( String description )
     {
         this.description = description;
     }
 
-    /**
-     * Set null
-     *
-     * @param name
-     */
+    @Override
     public void setName( String name )
     {
         this.name = name;
     }
 
-    /**
-     * Set null
-     *
-     * @param permissions
-     */
+    @Override
     public void setPermissions( List<Permission> permissions )
     {
         this.permissions = permissions;
     }
 
-    /**
-     * Method toString
-     */
-    public java.lang.String toString()
+    @Override
+    public String toString( )
     {
-        StringBuilder buf = new StringBuilder();
-        buf.append( "name = '" );
-        buf.append( getName() + "'" );
-        return buf.toString();
+        final StringBuilder sb = new StringBuilder( "MemoryRole{" );
+        sb.append( "name='" ).append( name ).append( '\'' );
+        sb.append( ", id='" ).append( id ).append( '\'' );
+        sb.append( '}' );
+        return sb.toString( );
     }
 
+    @Override
     public void addChildRoleName( String name )
     {
         this.childRoleNames.add( name );
     }
 
+    @Override
     public void setChildRoleNames( List<String> names )
     {
         if ( names == null )
@@ -242,13 +198,80 @@ public class MemoryRole
         }
     }
 
+    @Override
     public boolean isPermanent()
     {
         return permanent;
     }
 
+    @Override
     public void setPermanent( boolean permanent )
     {
         this.permanent = permanent;
     }
+
+
+    @Override
+    public String getId( )
+    {
+        return id;
+    }
+
+    @Override
+    public void setId( String id )
+    {
+        if (id==null) {
+            this.id = "";
+        } else
+        {
+            this.id = id;
+        }
+    }
+
+    @Override
+    public String getModelId( )
+    {
+        return modelId;
+    }
+
+    @Override
+    public void setModelId( String modelId )
+    {
+        if (modelId==null) {
+            this.modelId = "";
+        } else
+        {
+            this.modelId = modelId;
+        }
+    }
+
+    @Override
+    public String getResource( )
+    {
+        return resource;
+    }
+
+    @Override
+    public void setResource( String resource )
+    {
+        if (resource==null) {
+            this.resource = "";
+        } else
+        {
+            this.resource = resource;
+        }
+    }
+
+    @Override
+    public boolean isTemplateInstance( )
+    {
+        return isTemplateInstance;
+    }
+
+    @Override
+    public void setTemplateInstance( boolean templateInstance )
+    {
+        isTemplateInstance = templateInstance;
+    }
+
 }