blob: dc755af98c8518ce41757d056de751d9a89821ea [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.clerezza.jaxrsreportplugin;
import com.thoughtworks.qdox.JavaDocBuilder;
import com.thoughtworks.qdox.model.AbstractBaseJavaEntity;
import com.thoughtworks.qdox.model.Annotation;
import com.thoughtworks.qdox.model.DocletTag;
import com.thoughtworks.qdox.model.JavaClass;
import com.thoughtworks.qdox.model.JavaMethod;
import com.thoughtworks.qdox.model.JavaSource;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.apache.maven.project.MavenProject;
import org.apache.maven.reporting.AbstractMavenReport;
import org.apache.maven.reporting.MavenReportException;
import org.codehaus.doxia.sink.Sink;
import org.codehaus.doxia.site.renderer.SiteRenderer;
/**
* Generates a report about jaxrs resources. The report includes java doc descriptions
* about paths, http methods, comments and parameters of the methods. The report
* will be generated in the site phase, the default goal is jaxrs-report.
*
*
* @goal jaxrs-report
*
* @phase site
*/
public class JaxRsReportMojo extends AbstractMavenReport {
/**
* Path to the root directory
*
* @parameter expression="${basedir}"
*/
private String baseDir;
/**
* Location where generated html will be created.
*
* @parameter expression="${project.reporting.outputDirectory}"
*/
private String outputDirectory;
/**
* Doxia Site Renderer
*
* @parameter expression="${component.org.codehaus.doxia.site.renderer.SiteRenderer}"
* @required @readonly
*/
private SiteRenderer siteRenderer;
/**
* Maven Project
*
* @parameter expression="${project}"
* @required @readonly
*/
private MavenProject project;
@Override
protected SiteRenderer getSiteRenderer() {
return siteRenderer;
}
@Override
protected String getOutputDirectory() {
return outputDirectory;
}
@Override
protected MavenProject getProject() {
return project;
}
@Override
protected void executeReport(Locale arg0)
throws MavenReportException {
JavaClass[] classes = getJavaClassesFromSources();
boolean pathAnnotationExists = false;
for (JavaClass clazz : classes) {
if (hasPathAnnotation(clazz)) {
pathAnnotationExists = true;
break;
}
}
Sink sink = getSink();
sink.head();
sink.title();
sink.text("JaxRs Report");
sink.title_();
sink.head_();
sink.body();
if(pathAnnotationExists) {
for (JavaClass clazz : classes) {
if (hasPathAnnotation(clazz)) {
sink.section1();
sink.sectionTitle1();
sink.text("Class: " + clazz.getName());
sink.sectionTitle1_();
sink.lineBreak();
sink.text("Package: " + clazz.getPackage().getName());
sink.lineBreak();
sink.lineBreak();
for (Annotation annotation : clazz.getAnnotations()) {
if (annotation.getParameterValue().toString().contains("javax.ws.rs.Path")) {
sink.bold();
sink.text("Root Resource Path: " + annotation.getNamedParameter("value").toString());
sink.bold_();
}
}
sink.lineBreak();
sink.lineBreak();
sink.paragraph();
sink.text(clazz.getComment());
sink.paragraph_();
sink.section1_();
sink.horizontalRule();
for (JavaMethod mth : clazz.getMethods()) {
if (hasPathAnnotation(mth)) {
for (Annotation annotation : mth.getAnnotations()) {
if (annotation.getParameterValue().toString().contains("javax.ws.rs.Path")) {
sink.section2();
sink.sectionTitle2();
sink.text("Path: " + annotation.getNamedParameter("value"));
sink.sectionTitle2_();
}
}
for (Annotation annotation : mth.getAnnotations()) {
if (annotation.getParameterValue().toString().contains("javax.ws.rs.Produces")) {
sink.bold();
sink.text("Produces: " + annotation.getNamedParameter("value"));
sink.bold_();
sink.lineBreak();
sink.lineBreak();
} else if (annotation.getParameterValue().toString()
.contains("javax.ws.rs") && !annotation.getParameterValue().toString()
.contains("javax.ws.rs.Path")) {
sink.bold();
sink.text("Http Method: " + annotation.getType()
.toString().substring("javax.ws.rs.".length()));
sink.bold_();
sink.lineBreak();
sink.lineBreak();
}
}
sink.bold();
sink.text("Method: " + mth.getName());
sink.bold_();
sink.lineBreak();
sink.lineBreak();
sink.paragraph();
sink.text(mth.getComment());
sink.paragraph_();
DocletTag[] params = mth.getTagsByName("param");
if (params != null) {
sink.numberedList(params.length);
for (DocletTag param : params) {
sink.numberedListItem();
sink.text("param: " + param.getValue());
sink.numberedListItem_();
}
sink.numberedList_();
}
DocletTag returns = mth.getTagByName("return");
if (returns != null) {
sink.text("Returns " + returns.getValue());
}
sink.lineBreak();
sink.lineBreak();
sink.paragraph();
sink.bold();
sink.text("Method Declaration Signature: ");
sink.bold_();
sink.text(mth.getDeclarationSignature(true));
sink.paragraph_();
sink.section2_();
}
}
sink.section1_();
}
}
} else {
sink.section1();
sink.bold();
sink.text("This project doesn't expose any JaxRs resources");
sink.bold_();
sink.section1_();
}
sink.body_();
sink.flush();
sink.close();
}
@Override
public String getOutputName() {
return "jaxrs-report";
}
@Override
public String getName(Locale locale) {
return "JaxRs Report";
}
@Override
public String getDescription(Locale locale) {
return "Description of the REST webservices";
}
public boolean hasPathAnnotation(AbstractBaseJavaEntity entity) {
for (Annotation annotation : entity.getAnnotations()) {
if (annotation.getParameterValue().toString().contains("javax.ws.rs.Path")) {
return true;
}
}
return false;
}
public JavaSource[] getSources() {
String src = baseDir + File.separator + "src";
File file = new File(src);
JavaDocBuilder builder = new JavaDocBuilder();
builder.addSourceTree(file);
return builder.getSources();
}
private JavaClass[] getJavaClassesFromSources() {
final JavaSource[] sources = this.getSources();
final List<JavaClass> classes = new ArrayList<JavaClass>();
for (int i = 0; i < sources.length; i++) {
for (int j = 0; j < sources[i].getClasses().length; j++) {
final JavaClass clazz = sources[i].getClasses()[j];
classes.add(clazz);
for (int k = 0; k < clazz.getNestedClasses().length; k++) {
final JavaClass nestedClass = clazz.getNestedClasses()[k];
classes.add(nestedClass);
}
}
}
return classes.toArray(new JavaClass[classes.size()]);
}
}