001 package org.shiftone.jrat.inject.ant; 002 003 004 import org.apache.tools.ant.BuildException; 005 import org.apache.tools.ant.Project; 006 import org.apache.tools.ant.taskdefs.Copy; 007 import org.apache.tools.ant.types.FilterSet; 008 import org.apache.tools.ant.types.FilterSetCollection; 009 import org.shiftone.jrat.core.criteria.IncludeExcludeMethodCriteria; 010 import org.shiftone.jrat.core.criteria.MatcherMethodCriteria; 011 import org.shiftone.jrat.inject.Injector; 012 import org.shiftone.jrat.inject.process.ArchiveFileProcessor; 013 import org.shiftone.jrat.util.io.IOUtil; 014 import org.shiftone.jrat.util.log.Logger; 015 016 import java.io.File; 017 import java.util.Enumeration; 018 import java.util.Iterator; 019 import java.util.Map; 020 import java.util.TreeMap; 021 022 023 /** 024 * Apache Ant Task that extends the common Copy task. 025 * 026 * @author jeff@shiftone.org (Jeff Drost) 027 */ 028 public class InjectCopyTask extends Copy { 029 030 private static final Logger LOG = Logger.getLogger(InjectCopyTask.class); 031 private Injector injector; 032 private IncludeExcludeMethodCriteria methodCriteria; 033 034 public InjectCopyTask() { 035 036 injector = new Injector(); 037 methodCriteria = new IncludeExcludeMethodCriteria(); 038 039 injector.setMethodCriteria(methodCriteria); 040 } 041 042 043 public MatcherMethodCriteria createInclude() { 044 045 MatcherMethodCriteria newCriteria = new MatcherMethodCriteria(); 046 047 methodCriteria.addPositive(newCriteria); 048 049 return newCriteria; 050 } 051 052 053 public MatcherMethodCriteria createExclude() { 054 055 MatcherMethodCriteria newCriteria = new MatcherMethodCriteria(); 056 057 methodCriteria.addNegative(newCriteria); 058 059 return newCriteria; 060 } 061 062 063 private void copyOrInjectFile(String fromFile, String toFile, FilterSetCollection executionFilters) 064 throws Exception { 065 066 String extention = IOUtil.getExtention(fromFile); 067 068 if ((extention != null) 069 && ("class".equalsIgnoreCase(extention) || ArchiveFileProcessor.isArchiveExtention(extention))) { 070 injector.inject(fromFile, toFile); 071 } else { 072 if (fromFile.equals(toFile)) { 073 log("Skipping self-copy of " + fromFile, verbosity); 074 } else { 075 076 //log("Copying " + fromFile, Project.MSG_VERBOSE); 077 getFileUtils().copyFile( // 078 fromFile, // 079 toFile, // 080 executionFilters, // token filtering 081 getFilterChains(), // token filtering 082 forceOverwrite, // 083 preserveLastModified, // 084 getEncoding(), // 085 getProject()); 086 } 087 } 088 } 089 090 091 private String getString(Object to) { 092 093 // http://sourceforge.net/tracker/index.php?func=detail&aid=1011493&group_id=41841&atid=431431 094 if (to instanceof String) { 095 return (String) to; 096 } else if (to instanceof String[]) { 097 return ((String[]) to)[0]; 098 } else { 099 throw new RuntimeException("Error - please report a bug : " + to.getClass().getName()); 100 } 101 } 102 103 104 /** 105 * Actually does the file (and possibly empty directory) copies. This is a 106 * good method for subclasses to override. 107 */ 108 protected void doFileOperations() { 109 110 Iterator sourceFiles; 111 Map orderedCopyMap = new TreeMap(fileCopyMap); 112 113 if (orderedCopyMap.size() > 0) { 114 log("Copying " + orderedCopyMap.size() + " file" + ((orderedCopyMap.size() == 1) 115 ? "" 116 : "s") + " to " + destDir.getAbsolutePath(), verbosity); 117 118 sourceFiles = orderedCopyMap.keySet().iterator(); 119 120 // injector.setForceOverwrite(forceOverwrite); 121 // injector.setPreserveLastModified(preserveLastModified); 122 while (sourceFiles.hasNext()) { 123 String fromFile = (String) sourceFiles.next(); 124 Object to = orderedCopyMap.get(fromFile); 125 String toFile; 126 127 // http://sourceforge.net/tracker/index.php?func=detail&aid=1011493&group_id=41841&atid=431431 128 toFile = getString(to); 129 130 //log(fromFile, verbosity); 131 try { 132 FilterSetCollection executionFilters = new FilterSetCollection(); 133 134 if (filtering) { 135 executionFilters.addFilterSet(getProject().getGlobalFilterSet()); 136 } 137 138 for (Enumeration filterEnum = getFilterSets().elements(); filterEnum.hasMoreElements();) { 139 executionFilters.addFilterSet((FilterSet) filterEnum.nextElement()); 140 } 141 142 copyOrInjectFile(fromFile, toFile, executionFilters); 143 } 144 catch (Exception e) { 145 LOG.error("InjectCopyTask error", e); 146 147 throw new BuildException("Error instramenting " + fromFile, e, getLocation()); 148 } 149 } 150 } 151 152 if (includeEmpty) { 153 copyEmptyDirectories(); 154 } 155 } 156 157 158 private void copyEmptyDirectories() { 159 160 Enumeration e = dirCopyMap.elements(); 161 int count = 0; 162 163 while (e.hasMoreElements()) { 164 File d = new File(getString(e.nextElement())); 165 166 if (!d.exists()) { 167 if (!d.mkdirs()) { 168 log("Unable to column directory " + d.getAbsolutePath(), Project.MSG_ERR); 169 } else { 170 count++; 171 } 172 } 173 } 174 175 if (count > 0) { 176 log("Copied " + count + " empty director" + ((count == 1) 177 ? "y" 178 : "ies") + " to " + destDir.getAbsolutePath(), verbosity); 179 } 180 } 181 182 183 public void execute() throws BuildException { 184 185 try { 186 super.execute(); 187 } 188 catch (BuildException e) { 189 LOG.error("copy failed", e); 190 191 throw e; 192 } 193 catch (Throwable e) { 194 LOG.error("copy failed", e); 195 196 throw new BuildException(e); 197 } 198 } 199 }