blob: eb01c40054da555e25a49069cc7be3749f5b1c9e [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.tools.ant.module.spi;
import java.io.File;
import java.net.URL;
import java.util.Map;
import org.apache.tools.ant.module.run.LoggerTrampoline;
import org.openide.windows.IOColors;
import org.openide.windows.InputOutput;
import org.openide.windows.OutputListener;
/**
* Represents one Ant build session, possibly consisting of multiple targets,
* subprojects, and so on.
* A session may be shared by several {@link AntLogger}s.
* @author Jesse Glick
* @since org.apache.tools.ant.module/3 3.12
*/
public final class AntSession {
static {
LoggerTrampoline.ANT_SESSION_CREATOR = new LoggerTrampoline.Creator() {
public AntSession makeAntSession(LoggerTrampoline.AntSessionImpl impl) {
return new AntSession(impl);
}
public AntEvent makeAntEvent(LoggerTrampoline.AntEventImpl impl) {
throw new AssertionError();
}
public TaskStructure makeTaskStructure(LoggerTrampoline.TaskStructureImpl impl) {
throw new AssertionError();
}
};
}
private final LoggerTrampoline.AntSessionImpl impl;
private AntSession(LoggerTrampoline.AntSessionImpl impl) {
this.impl = impl;
}
/**
* Get the Ant script originally invoked.
* Note that due to subproject support some events may come from other scripts.
* @return the Ant script which was run to start with
*/
public File getOriginatingScript() {
return impl.getOriginatingScript();
}
/**
* Get the Ant targets originally run.
* @return a list of one or more targets (but may be empty during {@link AntLogger#buildInitializationFailed})
*/
public String[] getOriginatingTargets() {
return impl.getOriginatingTargets();
}
/**
* Get optional data stored by the logger in this session.
* @param logger the logger which wishes to retrieve data
* @return any optional data, or null initially
*/
public Object getCustomData(AntLogger logger) {
return impl.getCustomData(logger);
}
/**
* Store custom data associated with this session.
* May be used by the logger to keep some information that will persist
* for the lifetime of the session.
* @param logger the logger which wishes to store data
* @param data some custom data to retain
*/
public void putCustomData(AntLogger logger, Object data) {
impl.putCustomData(logger, data);
}
/**
* Print a line of text to the Ant output.
* @param message a message to print (newline will be appended automatically)
* @param err true to send to the error stream, false for regular output
* @param listener an output listener suitable for hyperlinks, or null for a plain print
* @see #createStandardHyperlink
*/
public void println(String message, boolean err, OutputListener listener) {
impl.println(message, err, listener);
}
/**
* Deliver a message logged event to all matching loggers.
* <p>
* Loggers will receive {@link AntLogger#messageLogged} with an event
* similar to the original event except for the message and log level;
* also the exception will always be null and the event will initially
* be unconsumed.
* </p>
* <p>
* This call blocks until all loggers have processed the nested event.
* Note that this logger may also receive the event so it must be reentrant.
* </p>
* <p class="nonnormative">
* Loggers are discouraged from using this facility merely to create hyperlinks
* for which the target is known. Use {@link #println} instead. This method
* is primarily intended for use from the standard logger to deliver stack
* trace lines to other loggers which may be able to hyperlink them.
* </p>
* @param originalEvent the original event received by the calling logger
* @param message a message to log (see {@link AntEvent#getMessage})
* @param level the level to log it at (see {@link AntEvent#getLogLevel})
*/
public void deliverMessageLogged(AntEvent originalEvent, String message, int level) {
impl.deliverMessageLogged(originalEvent, message, level);
}
/**
* Marks an exception as having been processed by a logger.
* <p>
* A single build-halting exception can traverse any number of Ant events
* as it progresses outwards, typically from the failing task to the failing
* target (possibly several times due to subprojects) and finally to the build failure.
* </p>
* <p class="nonnormative">
* Consuming the exception permits a logger to indicate to other loggers that it
* has already handled the problem in an appropriate manner. Since the standard
* logger may print an exception (possibly with stack trace) that is part of
* a {@link AntLogger#buildFinished} event, loggers which deal with the exception
* in some other way should consume it before returning from the callback.
* </p>
* @param t an exception to mark as consumed
* @throws IllegalStateException if it was already consumed
*/
public void consumeException(Throwable t) throws IllegalStateException {
impl.consumeException(t);
}
/**
* Tests whether a given exception has already been consumed by some logger.
* <p>
* Note that if an exception is consumed, any exception with that exception
* as its {@link Throwable#getCause} (possibly recursively) is also considered
* consumed. This is useful because Ant's <code>ProjectHelper.addLocationToBuildException</code>
* will annotate <code>BuildException</code>s with location information by constructing
* wrapper exceptions.
* </p>
* @param t an exception
* @return true if it (or a nested exception) has already been consumed by {@link #consumeException}
*/
public boolean isExceptionConsumed(Throwable t) {
return impl.isExceptionConsumed(t);
}
/**
* Get the (user-requested) verbosity level for this session.
* Generally only messages logged at this or lesser level (higher priority) should be displayed.
* @return the verbosity, e.g. {@link AntEvent#LOG_INFO}
*/
public int getVerbosity() {
return impl.getVerbosity();
}
/**
* Gets a set of user properties defined for this session.
* These might be a mixture of global default definitions and per-session properties.
* @return an immutable property map
* @since 3.52
*/
public Map<String,String> getProperties() {
return impl.getProperties();
}
/**
* Checks if the property is concealed.
* The value of the concealed property is not visible to the user.
* @param propertyName the property name to check
* @return true if property should not be visible to user
* @since 3.71
*/
public boolean isConcealed(String propertyName) {
return impl.isConcealed(propertyName);
}
/**
* Get a display name used for the session as a whole.
* @return a user-presentable display name appropriate for session-scope messaging
*/
public String getDisplayName() {
return impl.getDisplayName();
}
/**
* Convenience method to create a standard hyperlink implementation.
* The GUI of the hyperlink will be oriented toward error messages and
* may involve editor annotations.
* Line and column numbers start at 1.
* @param file a file to link to (may or may not exist, but hyperlink will not work if it does not)
* @param message a message to use e.g. for the status bar when clicking on the hyperlink,
* or for annotation tool tips
* @param line1 the starting line number, or -1 if there is no associated line number
* @param column1 the starting column number, or -1 if there is no associated column number
* (must be -1 if line1 is -1)
* @param line2 the ending line number, or -1 for a single-line link
* (must be -1 if line1 is -1)
* @param column2 the ending column number, or -1 if not applicable
* (must be -1 if either line2 or column1 is -1)
* @return a standard hyperlink suitable for {@link #println}
*/
public OutputListener createStandardHyperlink(URL file, String message, int line1, int column1, int line2, int column2) {
return impl.createStandardHyperlink(file, message, line1, column1, line2, column2);
}
/**
* Obtains the I/O handle for advanced operations such as {@link IOColors}.
* @return an I/O handle
* @since org.apache.tools.ant.module/3 3.35
*/
public InputOutput getIO() {
return impl.getIO();
}
@Override
public String toString() {
return impl.toString();
}
}