/* * RHQ Management Platform * Copyright (C) 2010 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.plugins.ant; import java.util.Date; import org.apache.tools.ant.BuildEvent; import org.apache.tools.ant.BuildListener; import org.apache.tools.ant.util.StringUtils; import org.rhq.core.domain.bundle.BundleResourceDeployment; import org.rhq.core.domain.bundle.BundleResourceDeploymentHistory; import org.rhq.core.domain.bundle.BundleResourceDeploymentHistory.Category; import org.rhq.core.domain.bundle.BundleResourceDeploymentHistory.Status; import org.rhq.core.pluginapi.bundle.BundleManagerProvider; /** * Ant build listener that sends targetFinished and taskFinished events to the Server to be stored as entries in the * deployment history. * * @author Ian Springer */ public class DeploymentAuditorBuildListener implements BuildListener { private BundleManagerProvider bundleManagerProvider; private BundleResourceDeployment bundleResourceDeployment; public DeploymentAuditorBuildListener(BundleManagerProvider bundleManagerProvider, BundleResourceDeployment bundleResourceDeployment) { this.bundleManagerProvider = bundleManagerProvider; this.bundleResourceDeployment = bundleResourceDeployment; } public void buildStarted(BuildEvent event) { return; } public void buildFinished(BuildEvent event) { return; } public void targetStarted(BuildEvent event) { return; } public void targetFinished(BuildEvent event) { auditEvent(event); } public void taskStarted(BuildEvent event) { return; } public void taskFinished(BuildEvent event) { auditEvent(event); } public void messageLogged(BuildEvent event) { try { // this will see if this is an audit message (e.g. <rhq:audit>) and if so, send it up to the server // see org.rhq.bundle.ant.task.AuditTask.execute() // RHQ_AUDIT_MESSAGE___<status>___<action>___<info>___<message>___<details> String[] eventStrings = event.getMessage().split("___"); int index = 0; if (eventStrings[index++].equals("RHQ_AUDIT_MESSAGE")) { Status status = Status.SUCCESS; String action = "Audit Message"; String info = "Recipe Audit Message"; String message = new Date().toString(); String details = null; try { String statusStr = eventStrings[index++]; status = Status.valueOf(statusStr.toUpperCase()); action = eventStrings[index++]; info = eventStrings[index++]; message = eventStrings[index++]; details = eventStrings[index++]; } catch (ArrayIndexOutOfBoundsException e) { // the message didn't have all the info, just skip looking for the rest and log what we have } this.bundleManagerProvider.auditDeployment(this.bundleResourceDeployment, action, info, Category.AUDIT_MESSAGE, status, message, details); } } catch (Exception e) { throw new RuntimeException(e); } return; } private void auditEvent(BuildEvent event) { BundleResourceDeploymentHistory.Status status = (event.getException() == null) ? BundleResourceDeploymentHistory.Status.SUCCESS : BundleResourceDeploymentHistory.Status.FAILURE; String action = createAction(event); String message = createMessage(action, event); try { this.bundleManagerProvider.auditDeployment(this.bundleResourceDeployment, "Build Event", action, null, status, message, null); } catch (Exception e) { throw new RuntimeException(e); } return; } private static String createAction(BuildEvent event) { StringBuilder msg = new StringBuilder(); if (event.getTarget() != null) { msg.append("[").append(event.getTarget().getName()).append("] "); } if (event.getTask() != null) { msg.append("<").append(event.getTask().getTaskName()).append("> "); } return msg.toString(); } private static String createMessage(String action, BuildEvent event) { StringBuilder msg = new StringBuilder(action); if (event.getMessage() != null) { msg.append(event.getMessage()); } if (event.getException() != null) { msg.append("\n").append(StringUtils.getStackTrace(event.getException())); } return msg.toString(); } }