]> source.dussan.org Git - archiva.git/blob
b73e98edbba0eee64428e201abb2182e686fc9e1
[archiva.git] /
1 package org.apache.archiva.redback.integration.reports;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21 import org.apache.archiva.redback.rbac.RBACManager;
22 import org.apache.archiva.redback.rbac.RbacManagerException;
23 import org.apache.archiva.redback.rbac.Role;
24 import org.apache.archiva.redback.rbac.UserAssignment;
25 import org.apache.archiva.redback.users.UserManager;
26 import org.apache.commons.lang.StringEscapeUtils;
27 import org.apache.archiva.redback.system.SecuritySystem;
28 import org.apache.archiva.redback.users.User;
29 import org.apache.archiva.redback.integration.util.RoleSorter;
30 import org.apache.archiva.redback.integration.util.UserComparator;
31 import org.springframework.stereotype.Service;
32
33 import javax.inject.Inject;
34 import javax.inject.Named;
35 import java.io.OutputStream;
36 import java.io.PrintWriter;
37 import java.util.ArrayList;
38 import java.util.Collections;
39 import java.util.HashMap;
40 import java.util.List;
41 import java.util.Map;
42
43 /**
44  * CsvRolesMatrix
45  *
46  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
47  *
48  */
49 @Service( "report#rolesmatrix-csv" )
50 public class CsvRolesMatrix
51     implements Report
52 {
53     @Inject
54     private SecuritySystem securitySystem;
55
56     @Inject
57     @Named( value = "rBACManager#jdo" )
58     private RBACManager rbacManager;
59
60     public String getName()
61     {
62         return "Roles Matrix";
63     }
64
65     public String getType()
66     {
67         return "csv";
68     }
69
70     public void writeReport( OutputStream os )
71         throws ReportException
72     {
73         UserManager userManager = securitySystem.getUserManager();
74
75         List<User> allUsers = userManager.getUsers();
76         List<Role> allRoles;
77         Map<String, List<String>> assignmentsMap;
78
79         try
80         {
81             allRoles = rbacManager.getAllRoles();
82             Collections.sort( allRoles, new RoleSorter() );
83
84             assignmentsMap = new HashMap<String, List<String>>();
85
86             for ( UserAssignment assignment : rbacManager.getAllUserAssignments() )
87             {
88                 assignmentsMap.put( assignment.getPrincipal(), assignment.getRoleNames() );
89             }
90         }
91         catch ( RbacManagerException e )
92         {
93             throw new ReportException( "Unable to obtain list of all roles.", e );
94         }
95
96         Collections.sort( allUsers, new UserComparator( "username", true ) );
97
98         PrintWriter out = new PrintWriter( os );
99
100         writeCsvHeader( out, allRoles );
101
102         for ( User user : allUsers )
103         {
104             writeCsvRow( out, user, assignmentsMap, allRoles );
105         }
106
107         out.flush();
108     }
109
110     private void writeCsvHeader( PrintWriter out, List<Role> allRoles )
111     {
112         out.print( "Username,Full Name,Email Address" );
113         for ( Role role : allRoles )
114         {
115             out.print( "," + escapeCell( role.getName() ) );
116         }
117         out.println();
118     }
119
120     private void writeCsvRow( PrintWriter out, User user, Map<String, List<String>> assignmentsMap,
121                               List<Role> allRoles )
122     {
123         out.print( escapeCell( user.getUsername() ) );
124         out.print( "," + escapeCell( user.getFullName() ) );
125         out.print( "," + escapeCell( user.getEmail() ) );
126
127         List<String> assignedRoleNames = assignmentsMap.get( user.getPrincipal().toString() );
128         if ( assignedRoleNames == null )
129         {
130             assignedRoleNames = new ArrayList<String>();
131         }
132
133         for ( Role role : allRoles )
134         {
135             out.print( ',' );
136             if ( assignedRoleNames.contains( role.getName() ) )
137             {
138                 out.print( 'Y' );
139             }
140         }
141         out.println();
142     }
143
144     private String escapeCell( String cell )
145     {
146         return "\"" + StringEscapeUtils.escapeJava( cell ) + "\"";
147     }
148
149     public String getId()
150     {
151         return "rolesmatrix";
152     }
153
154     public String getMimeType()
155     {
156         return "text/csv";
157     }
158 }