1 /*************************************************************************************** 2 * Copyright (c) Jonas Bonér, Alexandre Vasseur. All rights reserved. * 3 * http://aspectwerkz.codehaus.org * 4 * ---------------------------------------------------------------------------------- * 5 * The software in this package is published under the terms of the LGPL license * 6 * a copy of which has been included with this distribution in the license.txt file. * 7 **************************************************************************************/ 8 package org.codehaus.aspectwerkz.task; 9 10 import org.apache.tools.ant.BuildException; 11 import org.apache.tools.ant.Task; 12 13 import java.io.BufferedReader; 14 import java.io.File; 15 import java.io.InputStreamReader; 16 17 /*** 18 * <code>OfflineTransformationTask</code> is an Ant Task that transforms the a class directory structure recursivly 19 * using the AspectWerkz -offline mode. 20 * 21 * @author <a href="mailto:jboner@codehaus.org">Jonas Bonér </a> 22 */ 23 public class OfflineTransformationTask extends Task { 24 /*** 25 * The home of the aspectwerkz distribution. 26 */ 27 private String m_aspectWerkzHome; 28 29 /*** 30 * The path to the classes to transform. 31 */ 32 private String m_classesToTransform; 33 34 /*** 35 * The path to the XML definition file. 36 */ 37 private String m_definitionFile; 38 39 /*** 40 * The class path. 41 */ 42 private String m_classPath; 43 44 /*** 45 * Sets the aspectwerkz home dir. 46 * 47 * @param aspectWerkzHome the aspectwerkz home dir 48 */ 49 public void setAspectWerkzHome(final String aspectWerkzHome) { 50 m_aspectWerkzHome = aspectWerkzHome; 51 } 52 53 /*** 54 * Sets the path to the classes to transform. 55 * 56 * @param classesToTransform the path to the classes 57 */ 58 public void setClassesToTransform(final String classesToTransform) { 59 m_classesToTransform = classesToTransform; 60 } 61 62 /*** 63 * Sets the path to the XML definition file. 64 * 65 * @param definitionFile the path to the XML definition file 66 */ 67 public void setDefinitionFile(final String definitionFile) { 68 m_definitionFile = definitionFile; 69 } 70 71 /*** 72 * The path to the meta-data dir. 73 * 74 * @param classPath the path to the meta-data dir 75 */ 76 public void setClassPath(final String classPath) { 77 m_classPath = classPath; 78 } 79 80 /*** 81 * Executes the task. 82 * 83 * @throws org.apache.tools.ant.BuildException 84 */ 85 public void execute() throws BuildException { 86 if (m_aspectWerkzHome == null) { 87 throw new BuildException("AspectWerkz home dir must be specified"); 88 } 89 if (m_classesToTransform == null) { 90 throw new BuildException("classes to transform must be specified"); 91 } 92 if (m_definitionFile == null) { 93 throw new BuildException("definition file must be specified"); 94 } 95 System.out 96 .println("CAUTION: This Ant task might be a bit shaky, does not show errors in compilation process properly (use at own risk or patch it :-))"); 97 System.out 98 .println("NOTE: Make shure that you don't transform your classes more than once (without recompiling first)"); 99 StringBuffer command = new StringBuffer(); 100 command.append(m_aspectWerkzHome); 101 command.append(File.separator); 102 command.append("bin"); 103 command.append(File.separator); 104 command.append("aspectwerkz"); 105 if (System.getProperty("os.name").startsWith("Win") || System.getProperty("os.name").startsWith("win")) { 106 command.append(".bat"); 107 } 108 command.append(" -offline "); 109 command.append(m_definitionFile); 110 command.append(' '); 111 if (m_classPath != null) { 112 command.append(m_classPath); 113 } 114 command.append(' '); 115 command.append(m_classesToTransform); 116 try { 117 Process p = Runtime.getRuntime().exec( 118 command.toString(), 119 new String[] { 120 "ASPECTWERKZ_HOME=" + m_aspectWerkzHome, 121 "JAVA_HOME=" + System.getProperty("java.home"), 122 "CLASSPATH=" + System.getProperty("java.class.path") 123 }); 124 System.out.flush(); 125 BufferedReader stdOut = new BufferedReader(new InputStreamReader(p.getInputStream())); 126 BufferedReader stdErr = new BufferedReader(new InputStreamReader(p.getErrorStream())); 127 String out; 128 String err = null; 129 while (((out = stdOut.readLine()) != null) || ((err = stdErr.readLine()) != null)) { 130 if (out != null) { 131 System.out.println(out); 132 System.out.flush(); 133 } 134 if (err != null) { 135 System.err.println("Error: " + err); 136 } 137 } 138 p.waitFor(); 139 if (p.exitValue() != 0) { 140 throw new BuildException("Failed to transform classes, exit code: " + p.exitValue()); 141 } 142 } catch (Throwable e) { 143 throw new BuildException("could not transform the classes due to: " + e); 144 } 145 } 146 }