/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.ivy.plugins.report;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.ivy.core.cache.ArtifactOrigin;
import org.apache.ivy.core.module.descriptor.License;
import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
import org.apache.ivy.core.module.id.ModuleId;
import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.core.report.ArtifactDownloadReport;
import org.apache.ivy.core.report.ConfigurationResolveReport;
import org.apache.ivy.core.report.MetadataArtifactDownloadReport;
import org.apache.ivy.core.resolve.IvyNode;
import org.apache.ivy.core.resolve.IvyNodeCallers.Caller;
import org.apache.ivy.core.resolve.IvyNodeEviction.EvictionData;
import org.apache.ivy.util.DateUtil;
import org.apache.ivy.util.StringUtils;
import org.apache.ivy.util.XMLHelper;
/**
* XmlReportWriter allows to write ResolveReport in an xml format.
*/
public class XmlReportWriter {
static final String REPORT_ENCODING = "UTF-8";
public void output(ConfigurationResolveReport report, OutputStream stream) {
output(report, new String[] {report.getConfiguration()}, stream);
}
public void output(ConfigurationResolveReport report, String[] confs, OutputStream stream) {
OutputStreamWriter encodedOutStream;
try {
encodedOutStream = new OutputStreamWriter(stream, REPORT_ENCODING);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(REPORT_ENCODING + " is not known on your jvm", e);
}
PrintWriter out = new PrintWriter(new BufferedWriter(encodedOutStream));
ModuleRevisionId mrid = report.getModuleDescriptor().getModuleRevisionId();
// out.println("");
out.println("");
out.println("");
out.println("");
out.println("\t");
out.println("\t");
// create a list of ModuleRevisionIds indicating the position for each dependency
List dependencies = new ArrayList(report.getModuleRevisionIds());
for (Iterator iter = report.getModuleIds().iterator(); iter.hasNext();) {
ModuleId mid = (ModuleId) iter.next();
out.println("\t\t");
for (Iterator it2 = report.getNodes(mid).iterator(); it2.hasNext();) {
IvyNode dep = (IvyNode) it2.next();
ouputRevision(report, out, dependencies, dep);
}
out.println("\t\t");
}
out.println("\t");
out.println("");
out.flush();
}
private void ouputRevision(ConfigurationResolveReport report, PrintWriter out,
List dependencies, IvyNode dep) {
Map extraAttributes;
ModuleDescriptor md = null;
if (dep.getModuleRevision() != null) {
md = dep.getModuleRevision().getDescriptor();
}
StringBuffer details = new StringBuffer();
if (dep.isLoaded()) {
details.append(" status=\"");
details.append(XMLHelper.escape(dep.getDescriptor().getStatus()));
details.append("\" pubdate=\"");
details.append(DateUtil.format(new Date(dep.getPublication())));
details.append("\" resolver=\"");
details.append(XMLHelper.escape(dep.getModuleRevision().getResolver().getName()));
details.append("\" artresolver=\"");
details.append(XMLHelper
.escape(dep.getModuleRevision().getArtifactResolver().getName()));
details.append("\"");
}
if (dep.isEvicted(report.getConfiguration())) {
EvictionData ed = dep.getEvictedData(report.getConfiguration());
if (ed.getConflictManager() != null) {
details.append(" evicted=\"")
.append(XMLHelper.escape(ed.getConflictManager().toString())).append("\"");
} else {
details.append(" evicted=\"transitive\"");
}
details.append(" evicted-reason=\"")
.append(XMLHelper.escape(ed.getDetail() == null ? "" : ed.getDetail()))
.append("\"");
}
if (dep.hasProblem()) {
details.append(" error=\"").append(XMLHelper.escape(dep.getProblem().getMessage()))
.append("\"");
}
if (md != null && md.getHomePage() != null) {
details.append(" homepage=\"").append(XMLHelper.escape(md.getHomePage())).append("\"");
}
extraAttributes = md != null ? md.getExtraAttributes() : dep.getResolvedId()
.getExtraAttributes();
for (Iterator iterator = extraAttributes.keySet().iterator(); iterator.hasNext();) {
String attName = (String) iterator.next();
details.append(" extra-").append(attName).append("=\"")
.append(XMLHelper.escape(extraAttributes.get(attName).toString())).append("\"");
}
String defaultValue = dep.getDescriptor() != null ? " default=\""
+ dep.getDescriptor().isDefault() + "\"" : "";
int position = dependencies.indexOf(dep.getResolvedId());
out.println("\t\t\t");
if (md != null) {
License[] licenses = md.getLicenses();
for (int i = 0; i < licenses.length; i++) {
String lurl;
if (licenses[i].getUrl() != null) {
lurl = " url=\"" + XMLHelper.escape(licenses[i].getUrl()) + "\"";
} else {
lurl = "";
}
out.println("\t\t\t\t");
}
}
outputMetadataArtifact(out, dep);
outputEvictionInformation(report, out, dep);
outputCallers(report, out, dep);
outputArtifacts(report, out, dep);
out.println("\t\t\t");
}
private void outputEvictionInformation(ConfigurationResolveReport report, PrintWriter out,
IvyNode dep) {
if (dep.isEvicted(report.getConfiguration())) {
EvictionData ed = dep.getEvictedData(report.getConfiguration());
Collection selected = ed.getSelected();
if (selected != null) {
for (Iterator it3 = selected.iterator(); it3.hasNext();) {
IvyNode sel = (IvyNode) it3.next();
out.println("\t\t\t\t");
}
}
}
}
private void outputMetadataArtifact(PrintWriter out, IvyNode dep) {
if (dep.getModuleRevision() != null) {
MetadataArtifactDownloadReport madr = dep.getModuleRevision().getReport();
out.print("\t\t\t\t");
}
}
private void outputCallers(ConfigurationResolveReport report, PrintWriter out, IvyNode dep) {
Caller[] callers = dep.getCallers(report.getConfiguration());
for (int i = 0; i < callers.length; i++) {
StringBuffer callerDetails = new StringBuffer();
Map callerExtraAttributes = callers[i].getDependencyDescriptor().getExtraAttributes();
for (Iterator iterator = callerExtraAttributes.keySet().iterator(); iterator.hasNext();) {
String attName = (String) iterator.next();
callerDetails.append(" extra-").append(attName).append("=\"")
.append(XMLHelper.escape(callerExtraAttributes.get(attName).toString()))
.append("\"");
}
out.println("\t\t\t\t");
}
}
private void outputArtifacts(ConfigurationResolveReport report, PrintWriter out, IvyNode dep) {
Map extraAttributes;
ArtifactDownloadReport[] adr = report.getDownloadReports(dep.getResolvedId());
out.println("\t\t\t\t");
for (int i = 0; i < adr.length; i++) {
out.print("\t\t\t\t\t");
out.println("\t\t\t\t\t\t");
out.println("\t\t\t\t\t");
} else {
out.println("/>");
}
}
out.println("\t\t\t\t");
}
private String toString(String[] strs) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < strs.length; i++) {
buf.append(strs[i]);
if (i + 1 < strs.length) {
buf.append(", ");
}
}
return XMLHelper.escape(buf.toString());
}
}