1 6 package fr.jayasoft.ivy.ant; 7 8 import java.io.File ; 9 import java.io.FileNotFoundException ; 10 import java.io.FileOutputStream ; 11 import java.io.PrintWriter ; 12 import java.io.StringWriter ; 13 import java.io.Writer ; 14 import java.util.ArrayList ; 15 import java.util.Arrays ; 16 import java.util.HashMap ; 17 import java.util.HashSet ; 18 import java.util.Iterator ; 19 import java.util.List ; 20 import java.util.Map ; 21 import java.util.Set ; 22 23 import org.apache.tools.ant.BuildException; 24 import org.apache.tools.ant.Project; 25 import org.apache.tools.ant.filters.LineContainsRegExp; 26 import org.apache.tools.ant.filters.TokenFilter; 27 import org.apache.tools.ant.taskdefs.Concat; 28 import org.apache.tools.ant.types.FileSet; 29 import org.apache.tools.ant.types.FilterChain; 30 import org.apache.tools.ant.types.RegularExpression; 31 32 import fr.jayasoft.ivy.ModuleRevisionId; 33 34 41 public class IvyExtractFromSources extends IvyTask { 42 public static class Ignore { 43 String _package; 44 public String getPackage() { 45 return _package; 46 } 47 public void setPackage(String package1) { 48 _package = package1; 49 } 50 } 51 private String _organisation; 52 private String _module; 53 private String _revision; 54 private String _status; 55 private List _ignoredPackaged = new ArrayList (); private Map _mapping = new HashMap (); private Concat _concat = new Concat(); 58 private File _to; 59 60 public void addConfiguredIgnore(Ignore ignore) { 61 _ignoredPackaged.add(ignore.getPackage()); 62 } 63 public File getTo() { 64 return _to; 65 } 66 public void setTo(File to) { 67 _to = to; 68 } 69 public String getModule() { 70 return _module; 71 } 72 public void setModule(String module) { 73 _module = module; 74 } 75 public String getOrganisation() { 76 return _organisation; 77 } 78 public void setOrganisation(String organisation) { 79 _organisation = organisation; 80 } 81 public String getRevision() { 82 return _revision; 83 } 84 public void setRevision(String revision) { 85 _revision = revision; 86 } 87 public String getStatus() { 88 return _status; 89 } 90 public void setStatus(String status) { 91 _status = status; 92 } 93 public void addConfiguredMapping(PackageMapping mapping) { 94 _mapping.put(mapping.getPackage(), mapping.getModuleRevisionId()); 95 } 96 public void addFileSet(FileSet fileSet) { 97 _concat.addFileset(fileSet); 98 } 99 100 public void execute() throws BuildException { 101 configureConcat(); 102 Writer out = new StringWriter (); 103 _concat.setWriter(out); 104 _concat.execute(); 105 Set importsSet = new HashSet (Arrays.asList(out.toString().split("\n"))); 106 Set dependencies = new HashSet (); 107 for (Iterator iter = importsSet.iterator(); iter.hasNext();) { 108 String pack = ((String )iter.next()).trim(); 109 ModuleRevisionId mrid = getMapping(pack); 110 if (mrid != null) { 111 dependencies.add(mrid); 112 } 113 } 114 try { 115 PrintWriter writer = new PrintWriter (new FileOutputStream (_to)); 116 writer.println("<ivy-module version=\"1.0\">"); 117 writer.println("\t<info organisation=\""+_organisation+"\""); 118 writer.println("\t module=\""+_module+"\""); 119 if (_revision != null) { 120 writer.println("\t revision=\""+_revision+"\""); 121 } 122 if (_status != null) { 123 writer.println("\t status=\""+_status+"\""); 124 } else { 125 writer.println("\t status=\"integration\""); 126 } 127 writer.println("\t/>"); 128 if (!dependencies.isEmpty()) { 129 writer.println("\t<dependencies>"); 130 for (Iterator iter = dependencies.iterator(); iter.hasNext();) { 131 ModuleRevisionId mrid = (ModuleRevisionId)iter.next(); 132 writer.println("\t\t<dependency org=\""+mrid.getOrganisation()+"\" name=\""+mrid.getName()+"\" rev=\""+mrid.getRevision()+"\"/>"); 133 } 134 writer.println("\t</dependencies>"); 135 } 136 writer.println("</ivy-module>"); 137 writer.close(); 138 log(dependencies.size()+" dependencies put in "+_to); 139 } catch (FileNotFoundException e) { 140 throw new BuildException("impossible to create file "+_to+": "+e, e); 141 } 142 } 143 144 148 private ModuleRevisionId getMapping(String pack) { 149 String askedPack = pack; 150 ModuleRevisionId ret = null; 151 while (ret == null && pack.length() > 0) { 152 if (_ignoredPackaged.contains(pack)) { 153 return null; 154 } 155 ret = (ModuleRevisionId)_mapping.get(pack); 156 int lastDotIndex = pack.lastIndexOf('.'); 157 if (lastDotIndex != -1) { 158 pack = pack.substring(0, lastDotIndex); 159 } else { 160 break; 161 } 162 } 163 if (ret == null) { 164 log("no mapping found for "+askedPack, Project.MSG_VERBOSE); 165 } 166 return ret; 167 } 168 private void configureConcat() { 169 _concat.setProject(getProject()); 170 _concat.setTaskName(getTaskName()); 171 FilterChain filterChain = new FilterChain(); 172 LineContainsRegExp lcre = new LineContainsRegExp(); 173 RegularExpression regexp = new RegularExpression(); 174 regexp.setPattern("^import .+;"); 175 lcre.addConfiguredRegexp(regexp); 176 filterChain.add(lcre); 177 TokenFilter tf = new TokenFilter(); 178 TokenFilter.ReplaceRegex rre = new TokenFilter.ReplaceRegex(); 179 rre.setPattern("import (.+);.*"); 180 rre.setReplace("\\1"); 181 tf.add(rre); 182 filterChain.add(tf); 183 _concat.addFilterChain(filterChain); 184 } 185 } 186 | Popular Tags |