Repository: ant-ivy Updated Branches: refs/heads/master c21193ae1 -> 895834440
Fix IVY-1104 by including extra attribute in XML report Project: http://git-wip-us.apache.org/repos/asf/ant-ivy/repo Commit: http://git-wip-us.apache.org/repos/asf/ant-ivy/commit/9a9b720d Tree: http://git-wip-us.apache.org/repos/asf/ant-ivy/tree/9a9b720d Diff: http://git-wip-us.apache.org/repos/asf/ant-ivy/diff/9a9b720d Branch: refs/heads/master Commit: 9a9b720db7c282cf1d162ec5f7396f74e0090f62 Parents: c21193a Author: aprelev <[email protected]> Authored: Sat Aug 4 00:06:35 2018 +0300 Committer: Gintas Grigelionis <[email protected]> Committed: Sat Aug 4 14:34:49 2018 +0200 ---------------------------------------------------------------------- .../ivy/plugins/report/XmlReportParser.java | 13 +--- .../ivy/plugins/report/XmlReportWriter.java | 20 ++++-- .../util/extendable/ExtendableItemHelper.java | 74 +++++++++++++++++++- .../java/org/apache/ivy/ant/IvyResolveTest.java | 18 +++++ test/java/org/apache/ivy/ant/ivy-1104.xml | 25 +++++++ .../ivy/plugins/report/XmlReportWriterTest.java | 4 +- 6 files changed, 133 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/9a9b720d/src/java/org/apache/ivy/plugins/report/XmlReportParser.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/ivy/plugins/report/XmlReportParser.java b/src/java/org/apache/ivy/plugins/report/XmlReportParser.java index b6f87f7..3f248c2 100644 --- a/src/java/org/apache/ivy/plugins/report/XmlReportParser.java +++ b/src/java/org/apache/ivy/plugins/report/XmlReportParser.java @@ -192,17 +192,8 @@ public class XmlReportParser { String name = attributes.getValue("module"); String branch = attributes.getValue("branch"); String revision = attributes.getValue("revision"); - Map<String, String> extraAttributes = new HashMap<>(); - for (int i = 0; i < attributes.getLength(); i++) { - String attName = attributes.getQName(i); - if (attName.startsWith("extra-")) { - String extraAttrName = attName.substring("extra-".length()); - String extraAttrValue = attributes.getValue(i); - extraAttributes.put(extraAttrName, extraAttrValue); - } - } - mRevisionId = ModuleRevisionId.newInstance(organisation, name, branch, - revision, extraAttributes); + mRevisionId = ModuleRevisionId.newInstance(organisation, name, branch, revision, + ExtendableItemHelper.getExtraAttributes(attributes, "extra-")); break; } } http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/9a9b720d/src/java/org/apache/ivy/plugins/report/XmlReportWriter.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/ivy/plugins/report/XmlReportWriter.java b/src/java/org/apache/ivy/plugins/report/XmlReportWriter.java index fdee32d..c5c0a8c 100644 --- a/src/java/org/apache/ivy/plugins/report/XmlReportWriter.java +++ b/src/java/org/apache/ivy/plugins/report/XmlReportWriter.java @@ -42,6 +42,7 @@ 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.XMLHelper; +import org.apache.ivy.util.extendable.ExtendableItemHelper; import static org.apache.ivy.util.StringUtils.joinArray; @@ -77,7 +78,7 @@ public class XmlReportWriter { if (mrid.getBranch() != null) { out.println("\t\tbranch=\"" + XMLHelper.escape(mrid.getBranch()) + "\""); } - out.println(extraToString(mrid.getExtraAttributes(), "\t\t")); + out.println(extraToString(mrid.getQualifiedExtraAttributes(), "\t\t")); out.println("\t\tconf=\"" + XMLHelper.escape(report.getConfiguration()) + "\""); out.println("\t\tconfs=\"" + XMLHelper.escape(joinArray(confs, ", ")) + "\""); out.println("\t\tdate=\"" + DateUtil.format(report.getDate()) + "\"/>"); @@ -139,8 +140,9 @@ public class XmlReportWriter { if (md != null && md.getHomePage() != null) { details.append(" homepage=\"").append(XMLHelper.escape(md.getHomePage())).append("\""); } - extraAttributes = (md != null) ? md.getExtraAttributes() : dep.getResolvedId() - .getExtraAttributes(); + extraAttributes = (md != null) + ? md.getQualifiedExtraAttributes() + : dep.getResolvedId().getQualifiedExtraAttributes(); details.append(extraToString(extraAttributes, SEPARATOR)); out.println(String.format("\t\t\t<revision name=\"%s\"%s%s downloaded=\"%s\" searched=\"%s\"%s conf=\"%s\" position=\"%d\">", XMLHelper.escape(dep.getResolvedId().getRevision()), @@ -172,8 +174,12 @@ public class XmlReportWriter { if (sb.length() > 0 && !SEPARATOR.equals(prefix)) { sb.append(System.lineSeparator()); } - sb.append(prefix).append("extra-").append(entry.getKey()).append("=\"") - .append(XMLHelper.escape(entry.getValue())).append("\""); + + sb.append(prefix); + sb.append(ExtendableItemHelper.encodeAttribute(entry.getKey(), "extra-")); + sb.append("=\""); + sb.append(XMLHelper.escape(entry.getValue())); + sb.append("\""); } return sb.toString(); } @@ -232,7 +238,7 @@ public class XmlReportWriter { XMLHelper.escape(dependencyDescriptor.getDependencyRevisionId().getRevision()), XMLHelper.escape(dependencyDescriptor.getDynamicConstraintDependencyRevisionId().getRevision()), XMLHelper.escape(caller.getModuleRevisionId().getRevision()), - extraToString(dependencyDescriptor.getExtraAttributes(), SEPARATOR))); + extraToString(dependencyDescriptor.getQualifiedExtraAttributes(), SEPARATOR))); } } @@ -242,7 +248,7 @@ public class XmlReportWriter { out.print("\t\t\t\t\t<artifact name=\"" + XMLHelper.escape(adr.getName()) + "\" type=\"" + XMLHelper.escape(adr.getType()) + "\" ext=\"" + XMLHelper.escape(adr.getExt()) + "\""); - out.print(extraToString(adr.getArtifact().getExtraAttributes(), SEPARATOR)); + out.print(extraToString(adr.getArtifact().getQualifiedExtraAttributes(), SEPARATOR)); out.print(" status=\"" + XMLHelper.escape(adr.getDownloadStatus().toString()) + "\""); out.print(" details=\"" + XMLHelper.escape(adr.getDownloadDetails()) + "\""); out.print(" size=\"" + adr.getSize() + "\""); http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/9a9b720d/src/java/org/apache/ivy/util/extendable/ExtendableItemHelper.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/ivy/util/extendable/ExtendableItemHelper.java b/src/java/org/apache/ivy/util/extendable/ExtendableItemHelper.java index 8dee1ec..d5de2e3 100644 --- a/src/java/org/apache/ivy/util/extendable/ExtendableItemHelper.java +++ b/src/java/org/apache/ivy/util/extendable/ExtendableItemHelper.java @@ -29,11 +29,83 @@ public final class ExtendableItemHelper { private ExtendableItemHelper() { } + private static final char separator = '.'; + + /** + * Decode qualified attribute name from blob. + * + * @param blob Encoded attribute name + * @param prefix Prefix used during encoding + * @return String + * @see #encodeAttribute(String, String) + */ + public static String decodeAttribute(String blob, String prefix) { + // Decoding <qualifier>:<attribute> from + // <pre><qlen><sep><qualifier><sep><attribute> + // where qualifier (with following separator) is optional. + StringBuilder builder = new StringBuilder(blob); + + // Skipping prefix + int cur = prefix.length(); + + // Resolving length of qualifier + int sepi = blob.indexOf(separator, cur); + int qlen = Integer.parseInt(blob.substring(cur, sepi)); + + // Skipping to attribute and reclaiming ':' + cur = sepi + 1; + if (qlen > 0) + builder.setCharAt(cur + qlen, ':'); + + return builder.substring(cur); + } + + /** + * Encode qualified attribute name into blob + * to be used in XML report. + * + * @param attribute Qualified (or unqualified) attribute name + * @param prefix Prefix + * @return String + * @see #decodeAttribute(String, String) + */ + public static String encodeAttribute(String attribute, String prefix) { + StringBuilder builder = new StringBuilder( + attribute.length() + prefix.length() + 5 + ); + + // Resolving length of qualifier + int coloni = attribute.indexOf(':'); + int qlen = coloni == -1 + ? 0 + : coloni; + + // Encoding <qualifier>:<attribute> as + // <pre><qlen><sep><qualifier><sep><attribute> + // where qualifier (with following separator) is optional; + // e.g. `extra-3.foo.bar` for `foo:bar`, or `extra-0.foo` for `foo` + builder.append(prefix); + builder.append(qlen); + builder.append(separator); + builder.append(attribute); + + // Replacing ':' with '.' in order for report XML to not + // deal with all those pesky namespaces (c) + if (qlen > 0) { + int cur = builder.length() - attribute.length(); + builder.setCharAt(cur + qlen, separator); + } + + return builder.toString(); + } + public static Map<String, String> getExtraAttributes(Attributes attributes, String prefix) { Map<String, String> ret = new HashMap<>(); for (int i = 0; i < attributes.getLength(); i++) { if (attributes.getQName(i).startsWith(prefix)) { - ret.put(attributes.getQName(i).substring(prefix.length()), attributes.getValue(i)); + String name = decodeAttribute(attributes.getQName(i), prefix); + String value = attributes.getValue(i); + ret.put(name, value); } } return ret; http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/9a9b720d/test/java/org/apache/ivy/ant/IvyResolveTest.java ---------------------------------------------------------------------- diff --git a/test/java/org/apache/ivy/ant/IvyResolveTest.java b/test/java/org/apache/ivy/ant/IvyResolveTest.java index 70dd022..3737d84 100644 --- a/test/java/org/apache/ivy/ant/IvyResolveTest.java +++ b/test/java/org/apache/ivy/ant/IvyResolveTest.java @@ -249,6 +249,24 @@ public class IvyResolveTest { assertEquals("false", getIvy().getVariable("ivy.deps.changed")); } + + /** + * Test for issue IVY-1104, + * which has to do with ${ivy.deps.changed} being always set + * dependencies with extra attributes. + */ + + @Test + public void testDepsWithAttributesChanged() { + resolve.setFile(new File("test/java/org/apache/ivy/ant/ivy-1104.xml")); + + resolve.execute(); + assertEquals("true", getIvy().getVariable("ivy.deps.changed")); + + resolve.execute(); + assertEquals("false", getIvy().getVariable("ivy.deps.changed")); + } + @Test public void testDontCheckIfChanged() { resolve.setFile(new File("test/java/org/apache/ivy/ant/ivy-simple.xml")); http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/9a9b720d/test/java/org/apache/ivy/ant/ivy-1104.xml ---------------------------------------------------------------------- diff --git a/test/java/org/apache/ivy/ant/ivy-1104.xml b/test/java/org/apache/ivy/ant/ivy-1104.xml new file mode 100644 index 0000000..c2caa0e --- /dev/null +++ b/test/java/org/apache/ivy/ant/ivy-1104.xml @@ -0,0 +1,25 @@ +<!-- + 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. +--> +<ivy-module version="1.0" xmlns:e="http://ant.apache.org/ivy/extra"> + <info organisation="apache" + module="ivy-1104" + revision="1.0" + status="release"/> + <dependencies> + <dependency org="org1" name="mod1.2" rev="2.0" e:foo="bar"/> + </dependencies> +</ivy-module> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ant-ivy/blob/9a9b720d/test/java/org/apache/ivy/plugins/report/XmlReportWriterTest.java ---------------------------------------------------------------------- diff --git a/test/java/org/apache/ivy/plugins/report/XmlReportWriterTest.java b/test/java/org/apache/ivy/plugins/report/XmlReportWriterTest.java index 4b36e85..d5c833d 100644 --- a/test/java/org/apache/ivy/plugins/report/XmlReportWriterTest.java +++ b/test/java/org/apache/ivy/plugins/report/XmlReportWriterTest.java @@ -125,8 +125,8 @@ public class XmlReportWriterTest { String orgAttribute = "organisation=\"org1\""; String modAttribute = "module=\"mod1\""; String revAttribute = "revision=\"1.0\""; - String extra1Attribute = "extra-blabla=\"abc\""; - String extra2Attribute = "extra-blabla2=\"123\""; + String extra1Attribute = "extra-0.blabla=\"abc\""; + String extra2Attribute = "extra-0.blabla2=\"123\""; assertTrue("XML doesn't contain organisation attribute", xml.contains(orgAttribute)); assertTrue("XML doesn't contain module attribute", xml.contains(modAttribute));
