1 6 package fr.jayasoft.ivy.report; 7 8 import java.io.File ; 9 import java.io.FileOutputStream ; 10 import java.io.IOException ; 11 import java.io.OutputStream ; 12 import java.io.PrintWriter ; 13 import java.util.ArrayList ; 14 import java.util.Collection ; 15 import java.util.Date ; 16 import java.util.Iterator ; 17 import java.util.List ; 18 import java.util.Map ; 19 20 import fr.jayasoft.ivy.ArtifactOrigin; 21 import fr.jayasoft.ivy.Ivy; 22 import fr.jayasoft.ivy.IvyNode; 23 import fr.jayasoft.ivy.License; 24 import fr.jayasoft.ivy.ModuleDescriptor; 25 import fr.jayasoft.ivy.ModuleId; 26 import fr.jayasoft.ivy.ModuleRevisionId; 27 import fr.jayasoft.ivy.util.FileUtil; 28 import fr.jayasoft.ivy.util.Message; 29 import fr.jayasoft.ivy.util.StringUtils; 30 31 35 public class XmlReportOutputter implements ReportOutputter { 36 37 public String getName() { 38 return XML; 39 } 40 41 public void output(ResolveReport report, File destDir) { 42 String [] confs = report.getConfigurations(); 43 for (int i = 0; i < confs.length; i++) { 44 output(report.getConfigurationReport(confs[i]), confs, destDir); 45 } 46 } 47 48 public void output(ConfigurationResolveReport report, File destDir) { 49 output(report, new String [] {report.getConfiguration()}, destDir); 50 } 51 52 public void output(ConfigurationResolveReport report, String [] confs, File destDir) { 53 try { 54 destDir.mkdirs(); 55 File reportFile = new File (destDir, getReportFileName(report)); 56 OutputStream stream = new FileOutputStream (reportFile); 57 output(report, confs, stream); 58 stream.close(); 59 60 Message.verbose("\treport for "+report.getModuleDescriptor().getModuleRevisionId()+" "+report.getConfiguration()+" produced in "+reportFile); 61 62 File reportXsl = new File (destDir, "ivy-report.xsl"); 63 File reportCss = new File (destDir, "ivy-report.css"); 64 if (!reportXsl.exists()) { 65 FileUtil.copy(XmlReportOutputter.class.getResource("ivy-report.xsl"), reportXsl, null); 66 } 67 if (!reportCss.exists()) { 68 FileUtil.copy(XmlReportOutputter.class.getResource("ivy-report.css"), reportCss, null); 69 } 70 } catch (IOException ex) { 71 Message.error("impossible to produce report for "+report.getModuleDescriptor()+": "+ex.getMessage()); 72 } 73 } 74 75 public void output(ConfigurationResolveReport report, OutputStream stream) { 76 output(report, new String [] {report.getConfiguration()}, stream); 77 } 78 public void output(ConfigurationResolveReport report, String [] confs, OutputStream stream) { 79 PrintWriter out = new PrintWriter (stream); 80 ModuleRevisionId mrid = report.getModuleDescriptor().getModuleRevisionId(); 81 out.println("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"); 82 out.println("<?xml-stylesheet type=\"text/xsl\" HREF=\"ivy-report.xsl\"?>"); 83 out.println("<ivy-report version=\"1.0\">"); 84 out.println("\t<info"); 85 out.println("\t\torganisation=\""+mrid.getOrganisation()+"\""); 86 out.println("\t\tmodule=\""+mrid.getName()+"\""); 87 out.println("\t\tconf=\""+report.getConfiguration()+"\""); 88 out.println("\t\tconfs=\""+StringUtils.join(confs, ", ")+"\""); 89 out.println("\t\tdate=\""+Ivy.DATE_FORMAT.format(report.getDate())+"\"/>"); 90 91 out.println("\t<dependencies>"); 92 93 List dependencies = new ArrayList (report.getModuleRevisionIds()); 95 96 for (Iterator iter = report.getModuleIds().iterator(); iter.hasNext();) { 97 ModuleId mid = (ModuleId) iter.next(); 98 out.println("\t\t<module organisation=\""+mid.getOrganisation()+"\"" + 99 " name=\""+mid.getName()+"\"" + 100 " resolver=\""+report.getIvy().getResolverName(mid)+"\">"); 101 for (Iterator it2 = report.getNodes(mid).iterator(); it2.hasNext();) { 102 IvyNode dep = (IvyNode)it2.next(); 103 ModuleDescriptor md = null; 104 if (dep.getModuleRevision() != null) { 105 md = dep.getModuleRevision().getDescriptor(); 106 } 107 StringBuffer details = new StringBuffer (); 108 if (dep.isLoaded()) { 109 details.append(" status=\"").append(dep.getDescriptor().getStatus()).append("\"").append( 110 " pubdate=\"").append(Ivy.DATE_FORMAT.format(new Date (dep.getPublication()))).append("\"").append( 111 " resolver=\"").append(dep.getModuleRevision().getResolver().getName()).append("\"").append( 112 " artresolver=\"").append(dep.getModuleRevision().getArtifactResolver().getName()).append("\""); 113 } 114 if (dep.isEvicted(report.getConfiguration())) { 115 IvyNode.EvictionData ed = dep.getEvictedData(report.getConfiguration()); 116 if (ed.getConflictManager() != null) { 117 details.append(" evicted=\"").append(ed.getConflictManager()).append("\""); 118 } else { 119 details.append(" evicted=\"transitive\""); 120 } 121 } 122 if (dep.hasProblem()) { 123 details.append(" error=\"").append(dep.getProblem().getMessage()).append("\""); 124 } 125 if (md != null && md.getHomePage() != null) { 126 details.append(" homepage=\"").append(md.getHomePage()).append("\""); 127 } 128 Map extraAttributes = md!=null?md.getExtraAttributes():dep.getResolvedId().getExtraAttributes(); 129 for (Iterator iterator = extraAttributes.keySet().iterator(); iterator.hasNext();) { 130 String attName = (String )iterator.next(); 131 details.append(" extra-").append(attName).append("=\"").append(extraAttributes.get(attName)).append("\""); 132 } 133 String defaultValue = dep.getDescriptor() != null ? " default=\""+dep.getDescriptor().isDefault()+"\"" : ""; 134 int position = dependencies.indexOf(dep.getResolvedId()); 135 out.println("\t\t\t<revision name=\""+dep.getResolvedId().getRevision()+"\"" + 136 (dep.getResolvedId().getBranch() == null?"":" branch=\""+dep.getResolvedId().getBranch()+"\"")+ 137 details + 138 " downloaded=\""+dep.isDownloaded()+"\""+ 139 " searched=\""+dep.isSearched()+"\""+ 140 defaultValue+ 141 " conf=\""+toString(dep.getConfigurations(report.getConfiguration()))+"\""+ 142 " position=\""+position+"\">"); 143 if (md != null) { 144 License[] licenses = md.getLicenses(); 145 for (int i = 0; i < licenses.length; i++) { 146 String lurl; 147 if (licenses[i].getUrl() != null) { 148 lurl = " url=\""+licenses[i].getUrl()+"\""; 149 } else { 150 lurl = ""; 151 } 152 out.println("\t\t\t\t<license name=\""+licenses[i].getName()+"\""+lurl+"/>"); 153 } 154 } 155 if (dep.isEvicted(report.getConfiguration())) { 156 IvyNode.EvictionData ed = dep.getEvictedData(report.getConfiguration()); 157 Collection selected = ed.getSelected(); 158 if (selected != null) { 159 for (Iterator it3 = selected.iterator(); it3.hasNext();) { 160 IvyNode sel = (IvyNode)it3.next(); 161 out.println("\t\t\t\t<evicted-by rev=\""+sel.getResolvedId().getRevision()+"\"/>"); 162 } 163 } 164 } 165 IvyNode.Caller[] callers = dep.getCallers(report.getConfiguration()); 166 for (int i = 0; i < callers.length; i++) { 167 StringBuffer callerDetails = new StringBuffer (); 168 Map callerExtraAttributes = callers[i].getDependencyDescriptor().getExtraAttributes(); 169 for (Iterator iterator = callerExtraAttributes.keySet().iterator(); iterator.hasNext();) { 170 String attName = (String )iterator.next(); 171 callerDetails.append(" extra-").append(attName).append("=\"").append(callerExtraAttributes.get(attName)).append("\""); 172 } 173 174 out.println("\t\t\t\t<caller organisation=\""+callers[i].getModuleRevisionId().getOrganisation()+"\"" + 175 " name=\""+callers[i].getModuleRevisionId().getName()+"\"" + 176 " conf=\""+toString(callers[i].getCallerConfigurations())+"\""+ 177 " rev=\""+callers[i].getAskedDependencyId().getRevision()+"\""+ 178 callerDetails+ 179 "/>"); 180 } 181 ArtifactDownloadReport[] adr = report.getDownloadReports(dep.getResolvedId()); 182 out.println("\t\t\t\t<artifacts>"); 183 for (int i = 0; i < adr.length; i++) { 184 out.print("\t\t\t\t\t<artifact name=\""+adr[i].getName()+"\" type=\""+adr[i].getType()+"\" ext=\""+adr[i].getExt()+"\""); 185 extraAttributes = adr[i].getArtifact().getExtraAttributes(); 186 for (Iterator iterator = extraAttributes.keySet().iterator(); iterator.hasNext();) { 187 String attName = (String )iterator.next(); 188 out.print(" extra-"+attName+"=\""+extraAttributes.get(attName)+"\""); 189 } 190 out.print(" status=\""+adr[i].getDownloadStatus()+"\""); 191 out.print(" size=\""+adr[i].getSize()+"\""); 192 193 ArtifactOrigin origin = adr[i].getArtifactOrigin(); 194 if (origin != null) { 195 out.println(">"); 196 out.println("\t\t\t\t\t\t<origin-location is-local=\"" + String.valueOf(origin.isLocal()) + "\"" + 197 " location=\"" + origin.getLocation() + "\"/>"); 198 out.println("\t\t\t\t\t</artifact>"); 199 } else { 200 out.println("/>"); 201 } 202 } 203 out.println("\t\t\t\t</artifacts>"); 204 out.println("\t\t\t</revision>"); 205 } 206 out.println("\t\t</module>"); 207 } 208 out.println("\t</dependencies>"); 209 out.println("</ivy-report>"); 210 out.flush(); 211 } 212 213 private String toString(String [] strs) { 214 StringBuffer buf = new StringBuffer (); 215 for (int i = 0; i < strs.length; i++) { 216 buf.append(strs[i]); 217 if (i + 1 < strs.length) { 218 buf.append(", "); 219 } 220 } 221 return buf.toString(); 222 } 223 224 public static String getReportFileName(ConfigurationResolveReport report) { 225 return getReportFileName( 226 report.getModuleDescriptor().getModuleRevisionId().getModuleId(), 227 report.getConfiguration()); 228 } 229 230 public static String getReportFileName(ModuleId mid, String conf) { 231 return 232 mid.getOrganisation() 233 + "-" + mid.getName() 234 + "-" + conf+".xml"; 235 } 236 237 } 238 | Popular Tags |