- /*
- * Copyright 2001-2004 The Apache Software Foundation
- *
- * 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.apache.tools.ant.taskdefs;
-
- import java.io.PrintStream;
- import org.apache.tools.ant.BuildEvent;
- import org.apache.tools.ant.BuildLogger;
- import org.apache.tools.ant.DefaultLogger;
- import org.apache.tools.ant.Project;
- import org.apache.tools.ant.SubBuildListener;
- import org.apache.tools.ant.util.StringUtils;
-
- /**
- * This is a class that represents a recorder. This is the listener to the
- * build process.
- *
- * @version 0.5
- * @since Ant 1.4
- */
- public class RecorderEntry implements BuildLogger, SubBuildListener {
-
- //////////////////////////////////////////////////////////////////////
- // ATTRIBUTES
-
- /** The name of the file associated with this recorder entry. */
- private String filename = null;
- /** The state of the recorder (recorder on or off). */
- private boolean record = true;
- /** The current verbosity level to record at. */
- private int loglevel = Project.MSG_INFO;
- /** The output PrintStream to record to. */
- private PrintStream out = null;
- /** The start time of the last know target. */
- private long targetStartTime = 0L;
- /** Strip task banners if true. */
- private boolean emacsMode = false;
- /** project instance the recorder is associated with */
- private Project project;
-
- //////////////////////////////////////////////////////////////////////
- // CONSTRUCTORS / INITIALIZERS
-
- /**
- * @param name The name of this recorder (used as the filename).
- */
- protected RecorderEntry(String name) {
- targetStartTime = System.currentTimeMillis();
- filename = name;
- }
-
- //////////////////////////////////////////////////////////////////////
- // ACCESSOR METHODS
-
- /**
- * @return the name of the file the output is sent to.
- */
- public String getFilename() {
- return filename;
- }
-
-
- /**
- * Turns off or on this recorder.
- *
- * @param state true for on, false for off, null for no change.
- */
- public void setRecordState(Boolean state) {
- if (state != null) {
- record = state.booleanValue();
- }
- }
-
-
- public void buildStarted(BuildEvent event) {
- log("> BUILD STARTED", Project.MSG_DEBUG);
- }
-
-
- public void buildFinished(BuildEvent event) {
- log("< BUILD FINISHED", Project.MSG_DEBUG);
-
- Throwable error = event.getException();
-
- if (error == null) {
- out.println(StringUtils.LINE_SEP + "BUILD SUCCESSFUL");
- } else {
- out.println(StringUtils.LINE_SEP + "BUILD FAILED"
- + StringUtils.LINE_SEP);
- error.printStackTrace(out);
- }
- cleanup();
- }
-
- /**
- * Cleans up any resources held by this recorder entry at the end
- * of a subbuild if it has been created for the subbuild's project
- * instance.
- *
- * @param event the buildFinished event
- *
- * @since Ant 1.6.2
- */
- public void subBuildFinished(BuildEvent event) {
- if (event.getProject() == project) {
- cleanup();
- }
- }
-
- /**
- * Empty implementation to satisfy the BuildListener interface.
- *
- * @param event the buildStarted event
- *
- * @since Ant 1.6.2
- */
- public void subBuildStarted(BuildEvent event) {
- }
-
-
- public void targetStarted(BuildEvent event) {
- log(">> TARGET STARTED -- " + event.getTarget(), Project.MSG_DEBUG);
- log(StringUtils.LINE_SEP + event.getTarget().getName() + ":",
- Project.MSG_INFO);
- targetStartTime = System.currentTimeMillis();
- }
-
-
- public void targetFinished(BuildEvent event) {
- log("<< TARGET FINISHED -- " + event.getTarget(), Project.MSG_DEBUG);
-
- String time = formatTime(System.currentTimeMillis() - targetStartTime);
-
- log(event.getTarget() + ": duration " + time, Project.MSG_VERBOSE);
- out.flush();
- }
-
-
- public void taskStarted(BuildEvent event) {
- log(">>> TASK STARTED -- " + event.getTask(), Project.MSG_DEBUG);
- }
-
-
- public void taskFinished(BuildEvent event) {
- log("<<< TASK FINISHED -- " + event.getTask(), Project.MSG_DEBUG);
- out.flush();
- }
-
-
- public void messageLogged(BuildEvent event) {
- log("--- MESSAGE LOGGED", Project.MSG_DEBUG);
-
- StringBuffer buf = new StringBuffer();
-
- if (event.getTask() != null) {
- String name = event.getTask().getTaskName();
-
- if (!emacsMode) {
- String label = "[" + name + "] ";
- int size = DefaultLogger.LEFT_COLUMN_SIZE - label.length();
-
- for (int i = 0; i < size; i++) {
- buf.append(" ");
- }
- buf.append(label);
- }
- }
- buf.append(event.getMessage());
-
- log(buf.toString(), event.getPriority());
- }
-
-
- /**
- * The thing that actually sends the information to the output.
- *
- * @param mesg The message to log.
- * @param level The verbosity level of the message.
- */
- private void log(String mesg, int level) {
- if (record && (level <= loglevel)) {
- out.println(mesg);
- }
- }
-
-
- public void setMessageOutputLevel(int level) {
- if (level >= Project.MSG_ERR && level <= Project.MSG_DEBUG) {
- loglevel = level;
- }
- }
-
-
- public void setOutputPrintStream(PrintStream output) {
- out = output;
- }
-
-
- public void setEmacsMode(boolean emacsMode) {
- this.emacsMode = emacsMode;
- }
-
-
- public void setErrorPrintStream(PrintStream err) {
- out = err;
- }
-
-
- private static String formatTime(long millis) {
- long seconds = millis / 1000;
- long minutes = seconds / 60;
-
-
- if (minutes > 0) {
- return Long.toString(minutes) + " minute"
- + (minutes == 1 ? " " : "s ")
- + Long.toString(seconds % 60) + " second"
- + (seconds % 60 == 1 ? "" : "s");
- } else {
- return Long.toString(seconds) + " second"
- + (seconds % 60 == 1 ? "" : "s");
- }
-
- }
-
- /**
- * Set the project associated with this recorder entry.
- *
- * @param project the project instance
- *
- * @since 1.6.2
- */
- public void setProject(Project project) {
- this.project = project;
- if (project != null) {
- project.addBuildListener(this);
- }
- }
-
- /**
- * @since 1.6.2
- */
- public void cleanup() {
- out.flush();
- out.close();
- if (project != null) {
- project.removeBuildListener(this);
- }
- project = null;
- }
- }
-