1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.maven.author;
18
19 import java.io.File;
20 import java.util.Iterator;
21 import java.util.List;
22 import java.util.Map;
23 import java.util.SortedMap;
24 import java.util.SortedSet;
25 import java.util.TreeMap;
26 import java.util.TreeSet;
27
28 import org.apache.commons.jelly.tags.ant.FileScanner;
29 import org.apache.maven.author.resolver.AuthorResolver;
30
31 /**
32 * This class is the main entry point to resolve the authors of each file to process.
33 * The same file can have multiples authors (multiple author javadoc tag for example).
34 *
35 * @author Eric Ballet Baz
36 */
37 public final class FilesByAuthorProvider {
38
39 /**
40 * Private constructor : do not allow instanciation of this class.
41 */
42 private FilesByAuthorProvider() {
43 }
44
45 /**
46 * This method is the main entry point to resolve the authors of each file to process.
47 * The same file can have multiples authors (multiple author javadoc tags for example).
48 *
49 * @param filesToProcess List of files to process.
50 * @param authorResolverClassNames List of AuthorResolver's class names.
51 * @return Sorted map where key is the author and value is a list of filenames. The Map is sorted on author.
52 *
53 * @throws ClassNotFoundException If a class of a resolver is not found.
54 * @throws InstantiationException If a class of a resolver cannot be instanciate.
55 * @throws IllegalAccessException If a constructor of a resolver is not accessible.
56 */
57 public static SortedMap resolveAuthors(final FileScanner filesToProcess, final List authorResolverClassNames)
58 throws ClassNotFoundException, InstantiationException, IllegalAccessException {
59
60
61 if (filesToProcess == null) {
62 throw new IllegalArgumentException("Argument [filesToProcess] should not be null");
63 }
64 if (authorResolverClassNames == null) {
65 throw new IllegalArgumentException("Argument [authorResolverClassNames] should not be null");
66 }
67
68
69 AuthorResolver[] authorResolvers = instanciateAuthorResolvers(authorResolverClassNames);
70
71
72
73 SortedMap filesByAuthorMap = new TreeMap();
74 Iterator it = filesToProcess.iterator();
75 while (it.hasNext()) {
76 File file = (File) it.next();
77
78
79 String[] authors = resolveAuthorsForFile(file, authorResolvers);
80
81
82 addAuthorsForFileToMap(filesByAuthorMap, authors, file.getPath());
83 }
84 return filesByAuthorMap;
85 }
86
87 /**
88 * Resolve the authors of the specified file.
89 *
90 * @param file File to resolve authors for.
91 * @param authorResolvers Array of AuthorResolvers.
92 * @return Array of authors. If no author is found an array with an empty string as the unique element is returned.
93 */
94 private static String[] resolveAuthorsForFile(final File file, final AuthorResolver[] authorResolvers) {
95
96 for (int i = 0; i < authorResolvers.length; i++) {
97 String[] currentAuthors = authorResolvers[i].resolveAuthors(file);
98
99
100 if (currentAuthors != null && currentAuthors.length > 0) {
101 return currentAuthors;
102 }
103 }
104
105
106 return new String[] {""};
107 }
108
109 /**
110 * Add entry(ies) in the specified Map, where key is an author and value is a sorted set of filenames.
111 *
112 * @param filesByAuthorMap Map to add entry(ies) into.
113 * @param authors Array of authors for the specified filename.
114 * @param filename Filename to add.
115 */
116 private static void addAuthorsForFileToMap(final Map filesByAuthorMap, final String[] authors, final String filename) {
117 for (int i = 0; i < authors.length; i++) {
118 SortedSet set = (SortedSet) filesByAuthorMap.get(authors[i]);
119 if (set == null) {
120 set = new TreeSet();
121 filesByAuthorMap.put(authors[i], set);
122 }
123 set.add(filename);
124 }
125 }
126
127 /**
128 * Instanciate the list of AuthorResolver from their class names.
129 *
130 * @param authorResolverClassNames List of AuthorResolver's class names.
131 * @return List of AuthorResolver.
132 *
133 * @throws ClassNotFoundException If a class is not found.
134 * @throws InstantiationException If a class cannot be instanciate.
135 * @throws IllegalAccessException If a constructor is not accessible.
136 */
137 private static AuthorResolver[] instanciateAuthorResolvers(final List authorResolverClassNames)
138 throws ClassNotFoundException, InstantiationException, IllegalAccessException {
139
140 AuthorResolver[] resolvers = new AuthorResolver[authorResolverClassNames.size()];
141 for (int i = 0; i < authorResolverClassNames.size(); i++) {
142 Class cl = Class.forName(((String) authorResolverClassNames.get(i)).trim());
143 resolvers[i] = (AuthorResolver) cl.newInstance();
144 }
145 return resolvers;
146 }
147 }