001package org.apache.archiva.redback.rest.services.v2; 002/* 003 * Licensed to the Apache Software Foundation (ASF) under one 004 * or more contributor license agreements. See the NOTICE file 005 * distributed with this work for additional information 006 * regarding copyright ownership. The ASF licenses this file 007 * to you under the Apache License, Version 2.0 (the 008 * "License"); you may not use this file except in compliance 009 * with the License. You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, 014 * software distributed under the License is distributed on an 015 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 016 * KIND, either express or implied. See the License for the 017 * specific language governing permissions and limitations 018 * under the License. 019 */ 020 021import org.apache.archiva.components.rest.model.PagedResult; 022import org.apache.archiva.components.rest.util.QueryHelper; 023import org.apache.archiva.components.rest.util.RestUtil; 024import org.apache.archiva.redback.rbac.RBACManager; 025import org.apache.archiva.redback.rbac.RbacManagerException; 026import org.apache.archiva.redback.rbac.RbacObjectNotFoundException; 027import org.apache.archiva.redback.rest.api.MessageKeys; 028import org.apache.archiva.redback.rest.api.model.ErrorMessage; 029import org.apache.archiva.redback.rest.api.model.v2.Role; 030import org.apache.archiva.redback.rest.api.model.v2.RoleInfo; 031import org.apache.archiva.redback.rest.api.model.v2.RoleTemplate; 032import org.apache.archiva.redback.rest.api.model.v2.UserInfo; 033import org.apache.archiva.redback.rest.api.services.RedbackServiceException; 034import org.apache.archiva.redback.rest.api.services.v2.RoleService; 035import org.apache.archiva.redback.role.PermanentRoleDeletionInvalid; 036import org.apache.archiva.redback.role.RoleExistsException; 037import org.apache.archiva.redback.role.RoleManager; 038import org.apache.archiva.redback.role.RoleManagerException; 039import org.apache.archiva.redback.role.RoleNotFoundException; 040import org.apache.archiva.redback.role.util.RoleModelUtils; 041import org.apache.archiva.redback.users.User; 042import org.apache.archiva.redback.users.UserManager; 043import org.apache.archiva.redback.users.UserManagerException; 044import org.apache.archiva.redback.users.UserNotFoundException; 045import org.apache.commons.lang3.StringUtils; 046import org.slf4j.Logger; 047import org.slf4j.LoggerFactory; 048import org.springframework.stereotype.Service; 049 050import javax.inject.Inject; 051import javax.inject.Named; 052import javax.servlet.http.HttpServletRequest; 053import javax.servlet.http.HttpServletResponse; 054import javax.ws.rs.core.Context; 055import javax.ws.rs.core.Response; 056import javax.ws.rs.core.UriInfo; 057import java.util.Comparator; 058import java.util.HashMap; 059import java.util.List; 060import java.util.Map; 061import java.util.Optional; 062import java.util.Set; 063import java.util.function.BiPredicate; 064import java.util.function.Predicate; 065import java.util.stream.Collectors; 066 067/** 068 * @author Olivier Lamy 069 * @since 1.3 070 */ 071@Service("v2.roleService#rest") 072public class DefaultRoleService extends BaseRedbackService 073 implements RoleService 074{ 075 076 private Logger log = LoggerFactory.getLogger( DefaultRoleService.class ); 077 078 private RoleManager roleManager; 079 080 @Context 081 private HttpServletRequest httpServletRequest; 082 083 @Context 084 private HttpServletResponse httpServletResponse; 085 086 @Context 087 private UriInfo uriInfo; 088 089 private static final String[] DEFAULT_SEARCH_FIELDS = {"id", "name", "description"}; 090 private static final Map<String, BiPredicate<String, org.apache.archiva.redback.rbac.Role>> FILTER_MAP = new HashMap<>( ); 091 private static final Map<String, Comparator<org.apache.archiva.redback.rbac.Role>> ORDER_MAP = new HashMap<>( ); 092 private static final QueryHelper<org.apache.archiva.redback.rbac.Role> QUERY_HELPER; 093 094 static 095 { 096 097 QUERY_HELPER = new QueryHelper<>( FILTER_MAP, ORDER_MAP, DEFAULT_SEARCH_FIELDS ); 098 QUERY_HELPER.addStringFilter( "id", org.apache.archiva.redback.rbac.Role::getId ); 099 QUERY_HELPER.addStringFilter( "name", org.apache.archiva.redback.rbac.Role::getName ); 100 QUERY_HELPER.addStringFilter( "description", org.apache.archiva.redback.rbac.Role::getDescription ); 101 QUERY_HELPER.addBooleanFilter( "assignable", org.apache.archiva.redback.rbac.Role::isAssignable ); 102 103 // The simple Comparator.comparing(attribute) is not null safe 104 // As there are attributes that may have a null value, we have to use a comparator with nullsLast(naturalOrder) 105 // and the wrapping Comparator.nullsLast(Comparator.comparing(attribute)) does not work, because the attribute is not checked by the nullsLast-Comparator 106 QUERY_HELPER.addNullsafeFieldComparator( "name", org.apache.archiva.redback.rbac.Role::getName ); 107 QUERY_HELPER.addNullsafeFieldComparator( "id", org.apache.archiva.redback.rbac.Role::getId ); 108 QUERY_HELPER.addNullsafeFieldComparator( "resource", org.apache.archiva.redback.rbac.Role::getResource ); 109 QUERY_HELPER.addNullsafeFieldComparator( "assignable", org.apache.archiva.redback.rbac.Role::isAssignable ); 110 QUERY_HELPER.addNullsafeFieldComparator( "description", org.apache.archiva.redback.rbac.Role::getDescription ); 111 QUERY_HELPER.addNullsafeFieldComparator( "template_instance", org.apache.archiva.redback.rbac.Role::isTemplateInstance ); 112 } 113 114 @Inject 115 public DefaultRoleService( RoleManager roleManager, 116 @Named(value = "rbacManager#default") RBACManager rbacManager, 117 @Named(value = "userManager#default") UserManager userManager ) 118 { 119 super( rbacManager, userManager ); 120 this.roleManager = roleManager; 121 122 log.debug( "use rbacManager impl: {}", rbacManager.getClass().getName() ); 123 log.debug( "use userManager impl: {}", userManager.getClass().getName() ); 124 } 125 126 @Override 127 public PagedResult<RoleInfo> getAllRoles( String searchTerm, Integer offset, Integer limit, List<String> orderBy, String order ) throws RedbackServiceException 128 { 129 boolean ascending = isAscending( order ); 130 try 131 { 132 // UserQuery does not work here, because the configurable user manager does only return the query for 133 // the first user manager in the list. So we have to fetch the whole role list 134 List<? extends org.apache.archiva.redback.rbac.Role> rawRoles = rbacManager.getAllRoles( ); 135 Predicate<org.apache.archiva.redback.rbac.Role> filter = QUERY_HELPER.getQueryFilter( searchTerm ); 136 long size = rawRoles.stream( ).filter( filter ).count( ); 137 List<RoleInfo> users = rawRoles.stream( ) 138 .filter( filter ) 139 .sorted( QUERY_HELPER.getComparator( orderBy, ascending ) ).skip( offset ).limit( limit ) 140 .map( role -> { 141 try 142 { 143 return Optional.of( getRoleInfo( role ) ); 144 } 145 catch ( RedbackServiceException e ) 146 { 147 return Optional.<RoleInfo>empty(); 148 } 149 } ).filter(Optional::isPresent) 150 .map(Optional::get) 151 .collect( Collectors.toList( ) ); 152 return new PagedResult<>( (int) size, offset, limit, users ); 153 } 154 catch ( RbacManagerException e ) 155 { 156 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_RBACMANAGER_FAIL , e.getMessage( )) ); 157 } 158 159 } 160 161 @Override 162 public RoleInfo getRole( String roleId ) throws RedbackServiceException 163 { 164 try 165 { 166 org.apache.archiva.redback.rbac.Role rbacRole = rbacManager.getRoleById( roleId ); 167 RoleInfo role = getRoleInfo( rbacRole ); 168 return role; 169 } 170 catch ( RbacObjectNotFoundException e ) 171 { 172 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_NOT_FOUND, roleId ), 404 ); 173 } 174 catch ( RbacManagerException e ) 175 { 176 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_RBACMANAGER_FAIL, e.getMessage( ) ) ); 177 } 178 } 179 180 @Override 181 public Response checkRole( String roleId ) throws RedbackServiceException 182 { 183 try 184 { 185 org.apache.archiva.redback.rbac.Role rbacRole = rbacManager.getRoleById( roleId ); 186 if (rbacRole==null) { 187 return Response.status( 404 ).build(); 188 } else 189 { 190 return Response.ok( ).build( ); 191 } 192 } 193 catch ( RbacObjectNotFoundException e ) 194 { 195 return Response.status( 404 ).build(); 196 } 197 catch ( RbacManagerException e ) 198 { 199 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_RBACMANAGER_FAIL, e.getMessage( ) ) ); 200 } 201 } 202 203 204 205 @Override 206 public RoleInfo moveTemplatedRole( String templateId, String oldResource, String newResource ) 207 throws RedbackServiceException 208 { 209 try 210 { 211 if (StringUtils.isEmpty( templateId ) || StringUtils.isEmpty( oldResource ) || StringUtils.isEmpty( newResource )) { 212 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_NOT_FOUND ), 404 ); 213 } 214 boolean sourceExists = roleManager.templatedRoleExists( templateId, oldResource ); 215 if (!sourceExists) { 216 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_INSTANCE_NOT_FOUND, templateId, oldResource ), 404 ); 217 } 218 boolean destExists = roleManager.templatedRoleExists( templateId, newResource ); 219 if (destExists) { 220 httpServletResponse.setHeader( "Location", uriInfo.getAbsolutePathBuilder().path("../../..").path(newResource).build( ).normalize().toString() ); 221 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_INSTANCE_EXISTS, templateId, newResource ), 303 ); 222 } 223 String roleId = roleManager.moveTemplatedRole( templateId, oldResource, newResource ); 224 httpServletResponse.setHeader( "Location", uriInfo.getAbsolutePathBuilder().path("../../..").path(newResource).build( ).normalize().toString() ); 225 httpServletResponse.setStatus( 201 ); 226 return getRoleInfo( rbacManager.getRoleById( roleId ) ); 227 } 228 catch ( RoleExistsException e ) { 229 httpServletResponse.setHeader( "Location", uriInfo.getAbsolutePathBuilder().path("../../..").path(newResource).build( ).normalize().toString() ); 230 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_INSTANCE_EXISTS, templateId, newResource ), 303 ); 231 } 232 catch ( RoleManagerException e ) 233 { 234 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLEMANAGER_FAIL, e.getMessage( ) ) ); 235 } 236 catch ( RbacManagerException e ) 237 { 238 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_RBACMANAGER_FAIL, e.getMessage( ) ) ); 239 } 240 } 241 242 243 @Override 244 public Response checkTemplateRole( String templateId, String resource ) 245 throws RedbackServiceException 246 { 247 try 248 { 249 if (roleManager.templatedRoleExists( templateId, resource )) { 250 return Response.ok( ).build( ); 251 } else { 252 return Response.status( 404 ).build(); 253 } 254 } 255 catch ( RoleManagerException e ) 256 { 257 throw new RedbackServiceException( e.getMessage() ); 258 } 259 260 } 261 262 @Override 263 public RoleInfo createTemplatedRole( String templateId, String resource ) 264 throws RedbackServiceException 265 { 266 if (StringUtils.isEmpty( templateId )) { 267 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_NOT_FOUND ), 404 ); 268 } 269 if (StringUtils.isEmpty( resource )) { 270 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_NOT_FOUND ), 404 ); 271 } 272 try 273 { 274 boolean exists = roleManager.templatedRoleExists( templateId, resource ); 275 String roleId = roleManager.createTemplatedRole( templateId, resource ); 276 httpServletResponse.setHeader( "Location", uriInfo.getAbsolutePathBuilder().path("../../..").path(roleId).build( ).normalize().toString() ); 277 if (exists) 278 { 279 httpServletResponse.setStatus( 200 ); 280 } else { 281 httpServletResponse.setStatus( 201 ); 282 } 283 return getRoleInfo( rbacManager.getRoleById( roleId ) ); 284 } catch (RoleNotFoundException e) { 285 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_NOT_FOUND, templateId, resource ), 404 ); 286 } catch (RoleExistsException e) { 287 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_INSTANCE_EXISTS, templateId, resource ), 303 ); 288 } 289 catch ( RoleManagerException e ) 290 { 291 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLEMANAGER_FAIL, e.getMessage( ) ) ); 292 } 293 catch ( RbacManagerException e ) 294 { 295 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_RBACMANAGER_FAIL, e.getMessage( ) ) ); 296 } 297 } 298 299 @Override 300 public Response removeTemplatedRole( String templateId, String resource ) 301 throws RedbackServiceException 302 { 303 304 try 305 { 306 roleManager.removeTemplatedRole( templateId, resource ); 307 return Response.ok( ).build( ); 308 } 309 catch ( PermanentRoleDeletionInvalid e ) { 310 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_DELETION_WITH_PERMANENT_FLAG, RoleModelUtils.getRoleId( templateId, resource ) ), 400 ); 311 } 312 catch ( RoleNotFoundException e ) { 313 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_INSTANCE_NOT_FOUND, templateId, resource ), 404 ); 314 } 315 catch ( RoleManagerException e ) 316 { 317 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLEMANAGER_FAIL, e.getMessage( ) ) ); 318 } 319 } 320 321 322 323 @Override 324 public RoleInfo assignRole( String roleId, String userId ) 325 throws RedbackServiceException 326 { 327 try 328 { 329 userManager.findUser( userId ); 330 roleManager.assignRole( roleId, userId ); 331 return getRoleInfo( rbacManager.getRoleById( roleId ) ); 332 } 333 catch ( RoleNotFoundException e ) { 334 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_NOT_FOUND, e.getMessage( ) ), 404 ); 335 } 336 catch ( RoleManagerException e ) 337 { 338 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLEMANAGER_FAIL, e.getMessage( ) ) ); 339 } 340 catch ( UserNotFoundException e ) 341 { 342 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_USER_NOT_FOUND, e.getMessage( ) ), 404 ); 343 } 344 catch ( UserManagerException e ) 345 { 346 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_USERMANAGER_FAIL, e.getMessage( ) ) ); 347 } 348 catch ( RbacObjectNotFoundException e ) 349 { 350 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_RBACMANAGER_FAIL, e.getMessage( ) ) ); 351 } 352 catch ( RbacManagerException e ) 353 { 354 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_RBACMANAGER_FAIL, e.getMessage( ) ) ); 355 } 356 } 357 358 359 @Override 360 public RoleInfo assignTemplatedRole( String templateId, String resource, String userId ) 361 throws RedbackServiceException 362 { 363 try 364 { 365 userManager.findUser( userId ); 366 roleManager.assignTemplatedRole( templateId, resource, userId ); 367 String roleId = RoleModelUtils.getRoleId( templateId, resource ); 368 return getRoleInfo( rbacManager.getRoleById( roleId ) ); 369 370 } 371 catch ( RoleNotFoundException e ) { 372 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_NOT_FOUND, e.getMessage( ) ), 404 ); 373 } 374 catch ( RoleManagerException e ) 375 { 376 throw new RedbackServiceException( e.getMessage() ); 377 } 378 catch ( UserNotFoundException e ) 379 { 380 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_USER_NOT_FOUND, e.getMessage( ) ), 404 ); 381 } 382 catch ( UserManagerException e ) 383 { 384 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_USERMANAGER_FAIL, e.getMessage( ) ) ); 385 } 386 catch ( RbacObjectNotFoundException e ) 387 { 388 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_RBACMANAGER_FAIL, e.getMessage( ) ) ); 389 } 390 catch ( RbacManagerException e ) 391 { 392 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_RBACMANAGER_FAIL, e.getMessage( ) ) ); 393 } 394 } 395 396 @Override 397 public RoleInfo deleteRoleAssignment( String roleId, String userId ) 398 throws RedbackServiceException 399 { 400 try 401 { 402 userManager.findUser( userId ); 403 roleManager.unassignRole( roleId, userId ); 404 return getRoleInfo( rbacManager.getRoleById( roleId ) ); 405 } 406 catch ( RoleNotFoundException e ) { 407 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_NOT_FOUND, e.getMessage( ) ), 404 ); 408 } 409 catch ( RoleManagerException e ) 410 { 411 throw new RedbackServiceException( e.getMessage() ); 412 } 413 catch ( UserNotFoundException e ) 414 { 415 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_USER_NOT_FOUND, e.getMessage( ) ), 404 ); 416 } 417 catch ( UserManagerException e ) 418 { 419 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_USERMANAGER_FAIL, e.getMessage( ) ) ); 420 } 421 catch ( RbacObjectNotFoundException e ) 422 { 423 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_NOT_FOUND, e.getMessage( ) ), 404 ); 424 } 425 catch ( RbacManagerException e ) 426 { 427 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_RBACMANAGER_FAIL, e.getMessage( ) ) ); 428 } 429 } 430 431 @Override 432 public PagedResult<UserInfo> getRoleUsers( String roleId, String recurse, 433 String searchTerm, Integer offset, Integer limit, List<String> orderBy, String order ) throws RedbackServiceException 434 { 435 boolean ascending = isAscending( order ); 436 boolean recursePresent = RestUtil.isFlagSet( uriInfo, "recurse" ); 437 boolean parentsOnly = "parentsOnly".equals( recurse ); 438 try 439 { 440 org.apache.archiva.redback.rbac.Role rbacRole = rbacManager.getRoleById( roleId ); 441 List<User> rawUsers = recursePresent ? getAssignedRedbackUsersRecursive( rbacRole, parentsOnly ) : getAssignedRedbackUsers( rbacRole ); 442 return getUserInfoPagedResult( rawUsers, searchTerm, offset, limit, orderBy, ascending ); 443 } 444 catch ( RbacObjectNotFoundException e ) 445 { 446 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_NOT_FOUND, e.getMessage( ) ), 404 ); 447 } 448 catch ( RbacManagerException e ) 449 { 450 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_RBACMANAGER_FAIL, e.getMessage( ) ) ); 451 } 452 } 453 454 @Override 455 public PagedResult<UserInfo> getUnassignedUsers( String roleId, String recurse, String searchTerm, Integer offset, Integer limit, List<String> orderBy, String order ) throws RedbackServiceException 456 { 457 boolean ascending = isAscending( order ); 458 boolean recursePresent = RestUtil.isFlagSet( uriInfo, "recurse" ); 459 boolean parentsOnly = "parentsOnly".equals( recurse ); 460 try 461 { 462 org.apache.archiva.redback.rbac.Role rbacRole = rbacManager.getRoleById( roleId ); 463 final Set<String> assignedUsers = (recursePresent ? getAssignedRedbackUsersRecursive( rbacRole, parentsOnly ) : getAssignedRedbackUsers( rbacRole )) 464 .stream( ).map( user -> user.getId() ).collect( Collectors.toSet()); 465 List<? extends User> rawUsers = userManager.getUsers( ascending ).stream( ).filter( user -> !assignedUsers.contains( user.getId( ) ) ).collect( Collectors.toList( ) ); 466 return getUserInfoPagedResult( rawUsers, searchTerm, offset, limit, orderBy, ascending ); 467 } 468 catch ( RbacObjectNotFoundException e ) 469 { 470 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_NOT_FOUND, e.getMessage( ) ), 404 ); 471 } 472 catch ( RbacManagerException e ) 473 { 474 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_RBACMANAGER_FAIL, e.getMessage( ) ) ); 475 } 476 catch ( UserManagerException e ) 477 { 478 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_USERMANAGER_FAIL, e.getMessage( ) ) ); 479 } 480 } 481 482 @Override 483 public RoleInfo updateRole( String roleId, Role role ) throws RedbackServiceException 484 { 485 try 486 { 487 if (role==null) { 488 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_EMPTY_DATA ), 400 ); 489 } 490 if ( !StringUtils.equals( roleId, role.getId( ) ) ) 491 { 492 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_ID_INVALID ), 422 ); 493 } 494 org.apache.archiva.redback.rbac.Role rbacRole = rbacManager.getRoleById( roleId ); 495 if (StringUtils.isNotEmpty( role.getName()) && !StringUtils.equals(rbacRole.getName(), role.getName()) ) { 496 rbacRole.setName( role.getName( ) ); 497 } 498 if (StringUtils.isNotEmpty( role.getDescription()) && !StringUtils.equals(rbacRole.getDescription(), role.getDescription()) ) { 499 rbacRole.setDescription( role.getDescription( ) ); 500 } 501 if (role.isPermanent()!=null && rbacRole.isPermanent()!=role.isPermanent().booleanValue()) { 502 rbacRole.setPermanent( role.isPermanent( ) ); 503 } 504 if (role.isAssignable()!=null && rbacRole.isAssignable()!=role.isAssignable().booleanValue()) { 505 rbacRole.setAssignable( role.isAssignable( ) ); 506 } 507 if (role.getAssignedUsers()!=null && role.getAssignedUsers().size()>0) { 508 role.getAssignedUsers().stream().forEach( user -> 509 { 510 try 511 { 512 roleManager.assignRole( role.getId( ), user.getUserId( ) ); 513 } 514 catch ( RoleManagerException e ) 515 { 516 // silently ignore 517 } 518 } 519 ); 520 } 521 org.apache.archiva.redback.rbac.Role updatedRole = rbacManager.saveRole( rbacRole ); 522 return getRoleInfo( updatedRole ); 523 } 524 catch (RbacObjectNotFoundException e) { 525 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_ROLE_NOT_FOUND, roleId ), 404 ); 526 } 527 catch ( RbacManagerException e ) 528 { 529 throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_RBACMANAGER_FAIL, e.getMessage() )); 530 } 531 } 532 533 534 @Override 535 public List<RoleTemplate> getTemplates( ) throws RedbackServiceException 536 { 537 return roleManager.getModel( ).getApplications( ).stream( ).flatMap( app -> 538 app.getTemplates( ).stream( ).map( modelTempl -> RoleTemplate.of( app, modelTempl ) ) 539 ).collect( Collectors.toList( ) ); 540 } 541 542 543}