/*
* Copyright 2013 James Moger
*
* Licensed 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.moxie.ant;
import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.taskdefs.Javadoc;
import org.apache.tools.ant.taskdefs.Redirector;
import org.apache.tools.ant.taskdefs.Zip;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.RedirectorElement;
import org.moxie.Build;
import org.moxie.MoxieException;
import org.moxie.Scope;
import org.moxie.Toolkit.Key;
import org.moxie.console.Console;
/**
* Mx:Javadoc's purpose is to swallow and redirect noisey Javadoc output.
*
* @author James Moger
*
*/
public class MxJavadoc extends Javadoc {
private boolean addedFileset;
private File destDir;
private boolean redirectedOutput;
private String queuedLine = null;
private JavadocRedirector redirector = new JavadocRedirector(this);
private RedirectorElement redirectorElement;
Boolean showtitle;
public MxJavadoc() {
super();
setTaskName("mx:javadoc");
}
@Override
public void addFileset(FileSet fs) {
addedFileset = true;
super.addFileset(fs);
}
@Override
public void setDestdir(File dir) {
destDir = dir;
super.setDestdir(dir);
}
public void setShowtitle(boolean value) {
this.showtitle = value;
}
public boolean isShowTitle() {
return showtitle == null || showtitle;
}
public void setRedirect(boolean value) {
if (value) {
redirectorElement = new RedirectorElement();
redirectorElement.setProject(getProject());
Build build = (Build) getProject().getReference(Key.build.referenceId());
redirectorElement.setOutput(new File(build.getConfig().getOutputDirectory(null), "javadoc.log"));
redirectorElement.setAppend(false);
}
}
/**
* Add a <code>RedirectorElement</code> to this task.
*
* @param redirectorElement
* <code>RedirectorElement</code>.
*/
public void addConfiguredRedirector(RedirectorElement redirectorElement) {
if (this.redirectorElement != null) {
throw new BuildException("cannot have > 1 nested redirectors");
}
this.redirectorElement = redirectorElement;
}
@Override
public void execute() {
Build build = (Build) getProject().getReference(Key.build.referenceId());
Console console = build.getConsole();
if (destDir == null) {
// use default output folder
destDir = build.getConfig().getJavadocTargetDirectory();
super.setDestdir(destDir);
}
if (!addedFileset) {
// add all compile source folders from project
for (File folder : build.getConfig().getSourceDirectories(Scope.compile)) {
FileSet fs = new FileSet();
fs.setProject(getProject());
fs.setDir(folder);
addFileset(fs);
}
}
if (isShowTitle()) {
console.title(getClass(), build.getPom().getCoordinates());
}
if (redirectorElement != null) {
console.log(1, "Generating Javadoc... please wait");
redirectedOutput = true;
redirectorElement.configure(redirector);
redirector.createStreams();
}
super.execute();
try {
if (redirectedOutput) {
redirector.complete();
}
} catch (IOException e) {
throw new MoxieException(e);
}
// create javadoc jar
Zip jar = new Zip();
jar.setProject(getProject());
jar.setBasedir(destDir);
jar.setDestFile(new File(build.getConfig().getTargetDirectory(),
MessageFormat.format("{0}-{1}-javadoc.jar",
build.getPom().artifactId, build.getPom().version)));
jar.execute();
}
//
// Override the logging of output in order to filter out Generating
// messages. Generating messages are set to a priority of VERBOSE
// unless they appear after what could be an informational message.
//
public void log(String msg, int msgLevel) {
if (msgLevel == Project.MSG_INFO && msg.startsWith("Generating ")) {
if (queuedLine != null) {
processLine(queuedLine, Project.MSG_VERBOSE);
}
queuedLine = msg;
} else {
if (queuedLine != null) {
if (msg.startsWith("Building ")) {
processLine(queuedLine, Project.MSG_VERBOSE);
} else {
processLine(queuedLine, Project.MSG_INFO);
}
queuedLine = null;
}
processLine(msg, msgLevel);
}
}
protected void processLine(String msg, int msgLevel) {
if (!redirectedOutput) {
// default logging
super.log(msg, msgLevel);
return;
}
switch (msgLevel) {
case Project.MSG_ERR:
if (redirector.getErrorStream() != null) {
redirector.handleErrorOutput(msg + "\n");
}
break;
default:
if (redirector.getOutputStream() != null) {
redirector.handleOutput(msg + "\n");
}
break;
}
}
/**
* Stupid class to increase the visibility of the handle methods.
*
* @author James Moger
*
*/
private class JavadocRedirector extends Redirector {
public JavadocRedirector(Task managingTask) {
super(managingTask);
}
@Override
public void handleOutput(String output) {
super.handleOutput(output);
}
@Override
public void handleErrorOutput(String output) {
super.handleErrorOutput(output);
}
}
}