]> source.dussan.org Git - archiva.git/blob
2cc3083d6db6582bdbfe66bebf5f479b6590d72e
[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
22 import org.apache.archiva.redback.users.User;
23 import org.apache.archiva.redback.users.UserManager;
24 import org.apache.commons.beanutils.PropertyUtils;
25 import org.apache.commons.lang.StringEscapeUtils;
26 import org.apache.archiva.redback.system.SecuritySystem;
27 import org.apache.archiva.redback.integration.util.UserComparator;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30 import org.springframework.stereotype.Service;
31
32 import javax.inject.Inject;
33 import java.io.OutputStream;
34 import java.io.PrintWriter;
35 import java.lang.reflect.InvocationTargetException;
36 import java.util.Collections;
37 import java.util.HashMap;
38 import java.util.Iterator;
39 import java.util.List;
40 import java.util.Map;
41
42 /**
43  * CsvUserList
44  *
45  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
46  * @version $Id$
47  */
48 @Service( "report#userlist-csv" )
49 public class CsvUserList
50     implements Report
51 {
52     private Logger log = LoggerFactory.getLogger( CsvUserList.class );
53
54     @Inject
55     private SecuritySystem securitySystem;
56
57     private Map<String, String> fields;
58
59     public CsvUserList()
60     {
61         fields = new HashMap<String, String>();
62         fields.put( "username", "User Name" );
63         fields.put( "fullName", "Full Name" );
64         fields.put( "email", "Email Address" );
65         fields.put( "permanent", "Permanent User" );
66         fields.put( "locked", "Locked User" );
67         fields.put( "validated", "Validated User" );
68         fields.put( "passwordChangeRequired", "Must Change Password On Next Login" );
69         fields.put( "countFailedLoginAttempts", "Failed Login Attempts" );
70         fields.put( "lastPasswordChange", "Last Password Change" );
71         fields.put( "accountCreationDate", "Date Created" );
72         fields.put( "lastLoginDate", "Date Last Logged In" );
73     }
74
75     public String getId()
76     {
77         return "userlist";
78     }
79
80     public String getMimeType()
81     {
82         return "text/csv";
83     }
84
85     public String getName()
86     {
87         return "User List";
88     }
89
90     public String getType()
91     {
92         return "csv";
93     }
94
95     public void writeReport( OutputStream os )
96         throws ReportException
97     {
98         UserManager userManager = securitySystem.getUserManager();
99
100         List<User> allUsers = userManager.getUsers();
101
102         Collections.sort( allUsers, new UserComparator( "username", true ) );
103
104         PrintWriter out = new PrintWriter( os );
105
106         writeCsvHeader( out );
107
108         Iterator<User> itUsers = allUsers.iterator();
109         while ( itUsers.hasNext() )
110         {
111             User user = (User) itUsers.next();
112             writeCsvRow( out, user );
113         }
114
115         out.flush();
116     }
117
118     private void writeCsvHeader( PrintWriter out )
119     {
120         boolean hasPreviousField = false;
121         for ( String heading : fields.values() )
122         {
123             if ( hasPreviousField )
124             {
125                 out.print( "," );
126             }
127             out.print( escapeCell( heading ) );
128             hasPreviousField = true;
129         }
130         out.println();
131     }
132
133     @SuppressWarnings( "unchecked" )
134     private void writeCsvRow( PrintWriter out, User user )
135         throws ReportException
136     {
137         try
138         {
139             boolean hasPreviousField = false;
140             Map<String, Object> propMap = PropertyUtils.describe( user );
141             for ( String propName : fields.keySet() )
142             {
143                 Object propValue = propMap.get( propName );
144
145                 if ( hasPreviousField )
146                 {
147                     out.print( "," );
148                 }
149
150                 if ( propValue != null )
151                 {
152                     out.print( escapeCell( propValue.toString() ) );
153                 }
154                 hasPreviousField = true;
155             }
156             out.println();
157         }
158         catch ( IllegalAccessException e )
159         {
160             String emsg = "Unable to produce " + getName() + " report.";
161             log.error( emsg, e );
162             throw new ReportException( emsg, e );
163         }
164         catch ( InvocationTargetException e )
165         {
166             String emsg = "Unable to produce " + getName() + " report.";
167             log.error( emsg, e );
168             throw new ReportException( emsg, e );
169         }
170         catch ( NoSuchMethodException e )
171         {
172             String emsg = "Unable to produce " + getName() + " report.";
173             log.error( emsg, e );
174             throw new ReportException( emsg, e );
175         }
176     }
177
178     private String escapeCell( String cell )
179     {
180         return "\"" + StringEscapeUtils.escapeJava( cell ) + "\"";
181     }
182 }