1 /**************************************************************** 2 * Licensed to the Apache Software Foundation (ASF) under one * 3 * or more contributor license agreements. See the NOTICE file * 4 * distributed with this work for additional information * 5 * regarding copyright ownership. The ASF licenses this file * 6 * to you under the Apache License, Version 2.0 (the * 7 * "License"); you may not use this file except in compliance * 8 * with the License. You may obtain a copy of the License at * 9 * * 10 * http://www.apache.org/licenses/LICENSE-2.0 * 11 * * 12 * Unless required by applicable law or agreed to in writing, * 13 * software distributed under the License is distributed on an * 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * 15 * KIND, either express or implied. See the License for the * 16 * specific language governing permissions and limitations * 17 * under the License. * 18 ****************************************************************/ 19 20 package org.apache.james.mailet; 21 22 import org.apache.commons.collections.CollectionUtils; 23 import org.apache.commons.collections.Predicate; 24 import org.apache.maven.doxia.siterenderer.Renderer; 25 import org.apache.maven.project.MavenProject; 26 import org.apache.maven.reporting.AbstractMavenReport; 27 import org.apache.maven.reporting.MavenReportException; 28 29 import java.io.File; 30 import java.util.Collections; 31 import java.util.Comparator; 32 import java.util.List; 33 import java.util.Locale; 34 35 /** 36 * <p>Generates catalog and reports on mailets and matchers.</p> 37 * <h4>Notes</h4> 38 * <ul> 39 * <li>Should only used as a report.</li> 40 * <li>Mailets are instantiated during report production. </li> 41 * </ul> 42 * @goal mailetdocs 43 * @since 0.1 44 * @requiresDependencyResolution compile 45 */ 46 public class MailetdocsMojo extends AbstractMavenReport { 47 48 /** 49 * <i>Maven Internal</i>: The Doxia Site Renderer. 50 * 51 * @component 52 */ 53 private Renderer siteRenderer; 54 55 /** 56 * <i>Maven Internal</i>: The Project descriptor. 57 * 58 * @parameter expression="${project}" 59 * @required 60 * @readonly 61 */ 62 private MavenProject project; 63 64 /** 65 * The output directory. 66 * 67 * @parameter expression="${project.reporting.outputDirectory}" 68 * @required 69 * @since 0.1 70 */ 71 private File outputDirectory; 72 73 /** 74 * Extracts only a given type from a list. 75 */ 76 private static final class TypePredicate implements Predicate { 77 private int type; 78 79 public TypePredicate(int typeMatcher) { 80 this.type = typeMatcher; 81 } 82 83 public boolean evaluate(Object arg0) { 84 return ((MailetMatcherDescriptor) arg0).getType() == type; 85 } 86 } 87 88 protected void executeReport(Locale locale) throws MavenReportException { 89 90 List descriptors = new DefaultDescriptorsExtractor().extractDescriptors(project, getLog()); 91 92 Collections.sort(descriptors, new Comparator() { 93 94 public int compare(Object arg0, Object arg1) { 95 return ((MailetMatcherDescriptor) arg0).getName().compareTo( 96 ((MailetMatcherDescriptor) arg1).getName()); 97 } 98 99 }); 100 101 getLog().info("Executing Mailets/Matchers Report"); 102 103 getSink().head(); 104 getSink().title(); 105 getSink().text("Mailet and Matchers Reference"); 106 getSink().title_(); 107 getSink().head_(); 108 109 getSink().body(); 110 111 List matchers = (List) CollectionUtils.select(descriptors, 112 new TypePredicate(MailetMatcherDescriptor.TYPE_MATCHER)); 113 List mailets = (List) CollectionUtils.select(descriptors, 114 new TypePredicate(MailetMatcherDescriptor.TYPE_MAILET)); 115 116 getSink().section1(); 117 getSink().sectionTitle1(); 118 getSink().text("Mailets and Matchers Reference"); 119 getSink().sectionTitle1_(); 120 getSink().section1_(); 121 122 if (matchers.size() > 0 && mailets.size() > 0) { 123 getSink().table(); 124 getSink().tableRow(); 125 getSink().tableCell(); 126 } 127 if (matchers.size() > 0) { 128 outputDescriptorIndex(matchers, "Matchers"); 129 } 130 if (matchers.size() > 0 && mailets.size() > 0) { 131 getSink().tableCell_(); 132 getSink().tableCell(); 133 } 134 if (mailets.size() > 0) { 135 outputDescriptorIndex(mailets, "Mailets"); 136 } 137 if (matchers.size() > 0 && mailets.size() > 0) { 138 getSink().tableCell_(); 139 getSink().tableRow_(); 140 getSink().table_(); 141 } 142 143 if (matchers.size() > 0) { 144 outputDescriptorList(matchers, "Matchers"); 145 } 146 if (mailets.size() > 0) { 147 outputDescriptorList(mailets, "Mailets"); 148 } 149 150 getSink().body_(); 151 152 getSink().flush(); 153 getSink().close(); 154 155 /* 156 * for (Iterator i = getProject().getCompileSourceRoots().iterator(); 157 * i.hasNext(); ) { String folder = (String) i.next(); DirectoryScanner 158 * ds = new DirectoryScanner(); ds.setBasedir(folder); 159 * ds.addDefaultExcludes(); ds.setIncludes(new 160 * String[]{"**"+"/"+"*.java"}); ds.scan(); for (int k = 0; k < 161 * ds.getIncludedFiles().length; k++) { getLog().info("include: 162 * "+ds.getIncludedFiles()[k]); } } 163 */ 164 165 } 166 167 private void outputDescriptorIndex(List descriptors, String title) { 168 getSink().section2(); 169 getSink().sectionTitle2(); 170 getSink().text(title); 171 getSink().sectionTitle2_(); 172 173 getSink().list(); 174 for (int i = 0; i < descriptors.size(); i++) { 175 getSink().listItem(); 176 getSink().link("#"+((MailetMatcherDescriptor) descriptors.get(i)).getName()); 177 getSink().text( 178 ((MailetMatcherDescriptor) descriptors.get(i)).getName()); 179 getSink().link_(); 180 getSink().listItem_(); 181 } 182 getSink().list_(); 183 184 getSink().section2_(); 185 } 186 187 private void outputDescriptorList(List descriptors, String title) { 188 getSink().section1(); 189 getSink().sectionTitle1(); 190 getSink().text(title); 191 getSink().sectionTitle1_(); 192 193 for (int i = 0; i < descriptors.size(); i++) { 194 getSink().section2(); 195 196 getSink().sectionTitle2(); 197 getSink().anchor(((MailetMatcherDescriptor) descriptors.get(i)).getName()); 198 getSink().text( 199 ((MailetMatcherDescriptor) descriptors.get(i)).getName()); 200 getSink().anchor_(); 201 getSink().sectionTitle2_(); 202 203 if (((MailetMatcherDescriptor) descriptors.get(i)).getInfo() != null) { 204 getSink().paragraph(); 205 if (((MailetMatcherDescriptor) descriptors.get(i)).getType() == MailetMatcherDescriptor.TYPE_MAILET) { 206 getSink().text("Mailet Info: "); 207 } else if (((MailetMatcherDescriptor) descriptors.get(i)).getType() == MailetMatcherDescriptor.TYPE_MATCHER) { 208 getSink().text("Matcher Info: "); 209 } else { 210 getSink().text("Info: "); 211 } 212 getSink().bold(); 213 getSink().text( 214 ((MailetMatcherDescriptor) descriptors.get(i)).getInfo()); 215 getSink().bold_(); 216 getSink().lineBreak(); 217 getSink().paragraph_(); 218 } 219 220 getSink().paragraph(); 221 getSink().rawText( 222 ((MailetMatcherDescriptor) descriptors.get(i)) 223 .getClassDocs()); 224 getSink().paragraph_(); 225 226 getSink().section2_(); 227 228 } 229 230 getSink().section1_(); 231 } 232 233 protected String getOutputDirectory() { 234 return outputDirectory.getAbsolutePath(); 235 } 236 237 /** 238 * @return Returns the siteRenderer. 239 */ 240 public Renderer getSiteRenderer() { 241 return siteRenderer; 242 } 243 244 protected MavenProject getProject() { 245 return project; 246 } 247 248 public String getDescription(Locale arg0) { 249 return "Documentation about bundled mailets"; 250 } 251 252 public String getName(Locale arg0) { 253 return "Mailet Reference"; 254 } 255 256 public String getOutputName() { 257 return "mailet-report"; 258 } 259 260 /** 261 * @param siteRenderer 262 * The siteRenderer to set. 263 */ 264 public void setSiteRenderer(Renderer siteRenderer) { 265 this.siteRenderer = siteRenderer; 266 } 267 268 /** 269 * For testing purpose only. 270 * 271 * @param project 272 * The project to set. 273 */ 274 public void setProject(MavenProject project) { 275 this.project = project; 276 } 277 278 }