001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018: package org.apache.ivy.ant;
019:
020: import org.apache.ivy.Ivy;
021: import org.apache.ivy.util.AbstractMessageLogger;
022: import org.apache.ivy.util.Checks;
023: import org.apache.tools.ant.BuildEvent;
024: import org.apache.tools.ant.BuildListener;
025: import org.apache.tools.ant.ProjectComponent;
026: import org.apache.tools.ant.Task;
027:
028: /**
029: * Implementation of the simple message facility for ant.
030: */
031: public class AntMessageLogger extends AbstractMessageLogger {
032: private static final int PROGRESS_LOG_PERIOD = 1500;
033:
034: /**
035: * Creates and register an {@link AntMessageLogger} for the given {@link Task}, with the given
036: * {@link Ivy} instance.
037: * <p>
038: * The created instance will automatically be unregistered from the Ivy instance when the task
039: * finishes.
040: * </p>
041: *
042: * @param task
043: * the task the logger should use for logging
044: * @param ivy
045: * the ivy instance on which the logger should be registered
046: */
047: public static void register(Task task, final Ivy ivy) {
048: AntMessageLogger logger = new AntMessageLogger(task);
049: ivy.getLoggerEngine().pushLogger(logger);
050: task.getProject().addBuildListener(new BuildListener() {
051: private int stackDepth = 0;
052:
053: public void buildFinished(BuildEvent event) {
054: }
055:
056: public void buildStarted(BuildEvent event) {
057: }
058:
059: public void targetStarted(BuildEvent event) {
060: }
061:
062: public void targetFinished(BuildEvent event) {
063: }
064:
065: public void taskStarted(BuildEvent event) {
066: stackDepth++;
067: }
068:
069: public void taskFinished(BuildEvent event) {
070: // NB: There is somtimes task created by an other task
071: // in that case, we should not uninit Message. The log should stay associated
072: // with the initial task, except if it was an antcall, ant or subant target
073: // NB2 : Testing the identity of the task is not enought, event.getTask() return
074: // an instance of UnknownElement is wrapping the concrete instance
075: if (stackDepth == 0) {
076: ivy.getLoggerEngine().popLogger();
077: event.getProject().removeBuildListener(this );
078: }
079: stackDepth--;
080: }
081:
082: public void messageLogged(BuildEvent event) {
083: }
084: });
085:
086: }
087:
088: private ProjectComponent projectComponent;
089:
090: private long lastProgressFlush = 0;
091:
092: private StringBuffer buf = new StringBuffer();
093:
094: /**
095: * Constructs a new AntMEssageImpl instance.
096: *
097: * @param antProjectComponent
098: * the ant project component this message implementation should use for logging. Must
099: * not be <code>null</code>.
100: */
101: protected AntMessageLogger(ProjectComponent antProjectComponent) {
102: Checks.checkNotNull(antProjectComponent, "antProjectComponent");
103: projectComponent = antProjectComponent;
104: }
105:
106: public void log(String msg, int level) {
107: projectComponent.log(msg, level);
108: }
109:
110: public void rawlog(String msg, int level) {
111: projectComponent.getProject().log(msg, level);
112: }
113:
114: public void doProgress() {
115: buf.append(".");
116: if (lastProgressFlush == 0) {
117: lastProgressFlush = System.currentTimeMillis();
118: }
119: // log with ant causes a new line -> we do it only once in a while
120: if (System.currentTimeMillis() - lastProgressFlush > PROGRESS_LOG_PERIOD) {
121: projectComponent.log(buf.toString());
122: buf.setLength(0);
123: lastProgressFlush = System.currentTimeMillis();
124: }
125: }
126:
127: public void doEndProgress(String msg) {
128: projectComponent.log(buf + msg);
129: buf.setLength(0);
130: lastProgressFlush = 0;
131: }
132:
133: public String toString() {
134: return "AntMessageLogger:" + projectComponent;
135: }
136: }
|