/* * 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.ivy.ant; import org.apache.ivy.Ivy; import org.apache.ivy.util.AbstractMessageLogger; import org.apache.ivy.util.Checks; import org.apache.ivy.util.MessageLogger; import org.apache.tools.ant.BuildEvent; import org.apache.tools.ant.BuildListener; import org.apache.tools.ant.ProjectComponent; import org.apache.tools.ant.Task; /** * Implementation of the simple message facility for ant. */ public class AntMessageLogger extends AbstractMessageLogger { private static final int PROGRESS_LOG_PERIOD = 1500; /** * Creates and register an {@link AntMessageLogger} for the given {@link Task}, with the given * {@link Ivy} instance. *

* The created instance will automatically be unregistered from the Ivy instance when the task * finishes. *

* * @param task * the task the logger should use for logging * @param ivy * the ivy instance on which the logger should be registered */ public static void register(ProjectComponent task, final Ivy ivy) { MessageLogger current = ivy.getLoggerEngine().peekLogger(); if (current instanceof AntMessageLogger && task instanceof Task && ((AntMessageLogger) current).task instanceof Task) { Task currentTask = (Task) ((AntMessageLogger) current).task; if ((currentTask.getTaskName() != null) && currentTask.getTaskName().equals(((Task) task).getTaskName())) { // The current AntMessageLogger already logs with the same // prefix as the given task. So we shouldn't do anything... return; } } AntMessageLogger logger = new AntMessageLogger(task); ivy.getLoggerEngine().pushLogger(logger); task.getProject().addBuildListener(new BuildListener() { private int stackDepth = 0; public void buildFinished(BuildEvent event) { } public void buildStarted(BuildEvent event) { } public void targetStarted(BuildEvent event) { } public void targetFinished(BuildEvent event) { } public void taskStarted(BuildEvent event) { stackDepth++; } public void taskFinished(BuildEvent event) { // NB: There is somtimes task created by an other task // in that case, we should not uninit Message. The log should stay associated // with the initial task, except if it was an antcall, ant or subant target // NB2 : Testing the identity of the task is not enought, event.getTask() return // an instance of UnknownElement is wrapping the concrete instance stackDepth--; if (stackDepth == -1) { ivy.getLoggerEngine().popLogger(); event.getProject().removeBuildListener(this); } } public void messageLogged(BuildEvent event) { } }); } private ProjectComponent task; private long lastProgressFlush = 0; private StringBuffer buf = new StringBuffer(); /** * Constructs a new AntMEssageImpl instance. * * @param antProjectComponent * the ant project component this message implementation should use for logging. Must * not be null. */ protected AntMessageLogger(ProjectComponent task) { Checks.checkNotNull(task, "task"); this.task = task; } public void log(String msg, int level) { task.log(msg, level); } public void rawlog(String msg, int level) { task.getProject().log(msg, level); } public void doProgress() { buf.append("."); if (lastProgressFlush == 0) { lastProgressFlush = System.currentTimeMillis(); } // log with ant causes a new line -> we do it only once in a while if (System.currentTimeMillis() - lastProgressFlush > PROGRESS_LOG_PERIOD) { task.log(buf.toString()); buf.setLength(0); lastProgressFlush = System.currentTimeMillis(); } } public void doEndProgress(String msg) { task.log(buf + msg); buf.setLength(0); lastProgressFlush = 0; } public String toString() { return "AntMessageLogger:" + task; } }