📄 xmllogger.java
字号:
* * @param event An event with any relevant extra information. * Will not be <code>null</code>. */ public void targetFinished(BuildEvent event) { Target target = event.getTarget(); TimedElement targetElement = (TimedElement) targets.get(target); if (targetElement != null) { long totalTime = System.currentTimeMillis() - targetElement.startTime; targetElement.element.setAttribute(TIME_ATTR, DefaultLogger.formatTime(totalTime)); TimedElement parentElement = null; Stack threadStack = getStack(); if (!threadStack.empty()) { TimedElement poppedStack = (TimedElement) threadStack.pop(); if (poppedStack != targetElement) { throw new RuntimeException("Mismatch - popped element = " + poppedStack + " finished target element = " + targetElement); } if (!threadStack.empty()) { parentElement = (TimedElement) threadStack.peek(); } } if (parentElement == null) { buildElement.element.appendChild(targetElement.element); } else { parentElement.element.appendChild(targetElement.element); } } targets.remove(target); } /** * Fired when a task starts building, this pushes a timed element * for the task onto the stack of elements for the current thread, * remembering the current time and the name of the task. * * @param event An event with any relevant extra information. * Will not be <code>null</code>. */ public void taskStarted(BuildEvent event) { TimedElement taskElement = new TimedElement(); taskElement.startTime = System.currentTimeMillis(); taskElement.element = doc.createElement(TASK_TAG); Task task = event.getTask(); String name = event.getTask().getTaskName(); if (name == null) { name = ""; } taskElement.element.setAttribute(NAME_ATTR, name); taskElement.element.setAttribute(LOCATION_ATTR, event.getTask().getLocation().toString()); tasks.put(task, taskElement); getStack().push(taskElement); } /** * Fired when a task finishes building, this adds the time taken * and any error stacktrace to the appropriate task element in the log. * * @param event An event with any relevant extra information. * Will not be <code>null</code>. */ public void taskFinished(BuildEvent event) { Task task = event.getTask(); TimedElement taskElement = (TimedElement) tasks.get(task); if (taskElement != null) { long totalTime = System.currentTimeMillis() - taskElement.startTime; taskElement.element.setAttribute(TIME_ATTR, DefaultLogger.formatTime(totalTime)); Target target = task.getOwningTarget(); TimedElement targetElement = null; if (target != null) { targetElement = (TimedElement) targets.get(target); } if (targetElement == null) { buildElement.element.appendChild(taskElement.element); } else { targetElement.element.appendChild(taskElement.element); } Stack threadStack = getStack(); if (!threadStack.empty()) { TimedElement poppedStack = (TimedElement) threadStack.pop(); if (poppedStack != taskElement) { throw new RuntimeException("Mismatch - popped element = " + poppedStack + " finished task element = " + taskElement); } } tasks.remove(task); } else { throw new RuntimeException("Unknown task " + task + " not in " + tasks); } } /** * Get the TimedElement associated with a task. * * Where the task is not found directly, search for unknown elements which * may be hiding the real task */ private TimedElement getTaskElement(Task task) { TimedElement element = (TimedElement) tasks.get(task); if (element != null) { return element; } for (Enumeration e = tasks.keys(); e.hasMoreElements();) { Task key = (Task) e.nextElement(); if (key instanceof UnknownElement) { if (((UnknownElement) key).getTask() == task) { return (TimedElement) tasks.get(key); } } } return null; } /** * Fired when a message is logged, this adds a message element to the * most appropriate parent element (task, target or build) and records * the priority and text of the message. * * @param event An event with any relevant extra information. * Will not be <code>null</code>. */ public void messageLogged(BuildEvent event) { int priority = event.getPriority(); if (priority > msgOutputLevel) { return; } Element messageElement = doc.createElement(MESSAGE_TAG); String name = "debug"; switch (event.getPriority()) { case Project.MSG_ERR: name = "error"; break; case Project.MSG_WARN: name = "warn"; break; case Project.MSG_INFO: name = "info"; break; default: name = "debug"; break; } messageElement.setAttribute(PRIORITY_ATTR, name); Throwable ex = event.getException(); if (Project.MSG_DEBUG <= msgOutputLevel && ex != null) { Text errText = doc.createCDATASection(StringUtils.getStackTrace(ex)); Element stacktrace = doc.createElement(STACKTRACE_TAG); stacktrace.appendChild(errText); buildElement.element.appendChild(stacktrace); } Text messageText = doc.createCDATASection(event.getMessage()); messageElement.appendChild(messageText); TimedElement parentElement = null; Task task = event.getTask(); Target target = event.getTarget(); if (task != null) { parentElement = getTaskElement(task); } if (parentElement == null && target != null) { parentElement = (TimedElement) targets.get(target); } /* if (parentElement == null) { Stack threadStack = (Stack) threadStacks.get(Thread.currentThread()); if (threadStack != null) { if (!threadStack.empty()) { parentElement = (TimedElement) threadStack.peek(); } } } */ if (parentElement != null) { parentElement.element.appendChild(messageElement); } else { buildElement.element.appendChild(messageElement); } } // -------------------------------------------------- BuildLogger interface /** * Set the logging level when using this as a Logger * * @param level the logging level - * see {@link org.apache.tools.ant.Project#MSG_ERR Project} * class for level definitions */ public void setMessageOutputLevel(int level) { msgOutputLevel = level; } /** * Set the output stream to which logging output is sent when operating * as a logger. * * @param output the output PrintStream. */ public void setOutputPrintStream(PrintStream output) { this.outStream = new PrintStream(output, true); } /** * Ignore emacs mode, as it has no meaning in XML format * * @param emacsMode true if logger should produce emacs compatible * output */ public void setEmacsMode(boolean emacsMode) { } /** * Ignore error print stream. All output will be written to * either the XML log file or the PrintStream provided to * setOutputPrintStream * * @param err the stream we are going to ignore. */ public void setErrorPrintStream(PrintStream err) { }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -