From 79f0d3a99a7f79e2c9389fc711721eab191aae01 Mon Sep 17 00:00:00 2001 From: Brett Morgan Date: Thu, 23 Jul 2015 11:12:07 -0400 Subject: [PATCH] added fix for components.xml merging. If the description tag contained embedded html, it needs to be escaped in the resulting merged components.xml. --- leiningen-core/pom.xml | 14 +- src/leiningen/uberjar.clj | 26 +- test/leiningen/test/uberjar.clj | 18 +- .../components1.xml | 73 +++ .../components2.xml | 218 ++++++++ .../expected-components.xml | 516 ++++++++++++++++++ 6 files changed, 854 insertions(+), 11 deletions(-) create mode 100644 test_projects/uberjar-components-merging/components1.xml create mode 100644 test_projects/uberjar-components-merging/components2.xml create mode 100644 test_projects/uberjar-components-merging/expected-components.xml diff --git a/leiningen-core/pom.xml b/leiningen-core/pom.xml index 6f2b48bc..50fd4560 100644 --- a/leiningen-core/pom.xml +++ b/leiningen-core/pom.xml @@ -3,7 +3,7 @@ leiningen-core leiningen-core jar - 2.5.1 + 2.5.2-SNAPSHOT leiningen-core Library for core functionality of Leiningen. https://github.com/technomancy/leiningen @@ -14,11 +14,11 @@ - scm:git:git://github.com/technomancy/leiningen.git - scm:git:ssh://git@github.com/technomancy/leiningen.git - f48846ff3cce9158d2c8ec5e6b488d45d74d286d + scm:git:git://github.com/towler73/leiningen.git + scm:git:ssh://git@github.com/towler73/leiningen.git + 7045e666e10bfe4dbb6630b497fd94dbc257519f - https://github.com/technomancy/leiningen + https://github.com/towler73/leiningen src @@ -43,7 +43,7 @@ central - http://repo1.maven.org/maven2/ + https://repo1.maven.org/maven2/ false @@ -106,7 +106,7 @@ org.clojure tools.nrepl - 0.2.3 + 0.2.6 org.clojure diff --git a/src/leiningen/uberjar.clj b/src/leiningen/uberjar.clj index 2e2d450e..74fe1c59 100644 --- a/src/leiningen/uberjar.clj +++ b/src/leiningen/uberjar.clj @@ -15,10 +15,30 @@ (java.util.zip ZipFile ZipOutputStream ZipEntry) (org.apache.commons.io.output CloseShieldOutputStream))) +(defn- tree-edit + "Walk the componment xml dom looking for description tag" + [zipper editor] + (loop [loc zipper] + (if (zip/end? loc) + (zip/root loc) + (if (= :description (:tag (zip/node loc))) + (let [new-loc (zip/edit loc editor)] + (recur (zip/next new-loc))) + (recur (zip/next loc)))))) + +(defn- html-escape-editor + "Escape <,>,& from content" + [node] + (let [content (get (:content node) 0)] + (if-not (nil? content) + (assoc-in node [:content 0] (clojure.string/escape content {\< "<" \> ">" \& "&" \" """})) + node))) + (defn- components-read [ins] - (->> ins xml/parse zip/xml-zip zip/children - (filter #(= (:tag %) :components)) - first :content)) + (let [zipper (->> ins xml/parse zip/xml-zip)] + (->> (tree-edit zipper html-escape-editor) zip/xml-zip zip/children + (filter #(= (:tag %) :components)) + first :content))) (defn- components-write [out components] (binding [*out* (PrintWriter. out)] diff --git a/test/leiningen/test/uberjar.clj b/test/leiningen/test/uberjar.clj index 49897437..4479b403 100644 --- a/test/leiningen/test/uberjar.clj +++ b/test/leiningen/test/uberjar.clj @@ -2,10 +2,11 @@ (:require [leiningen.uberjar :refer :all] [clojure.test :refer :all] [clojure.java.shell :refer [sh]] + [clojure.xml :as xml] [leiningen.test.helper :refer [sample-no-aot-project uberjar-merging-project provided-project]]) - (:import (java.io File) + (:import (java.io File FileOutputStream) (java.util.zip ZipFile))) (deftest test-uberjar @@ -41,6 +42,21 @@ (.getInputStream zf) slurp read-string))))))) +(deftest test-components-merger + (let [file1 (str "test_projects/uberjar-components-merging/components1.xml") + file2 (str "test_projects/uberjar-components-merging/components2.xml") + readxml (components-merger 0) + combine (components-merger 1) + writexml (components-merger 2) + combined-xml (combine (readxml file1) (readxml file2)) + expected-xml (xml/parse "test_projects/uberjar-components-merging/expected-components.xml") + result-file "test_projects/uberjar-components-merging/result-components.xml" + out-file (FileOutputStream. (File. result-file))] + (writexml out-file combined-xml) + (is (= expected-xml (xml/parse result-file))) + ) + ) + ;; TODO: this breaks on Java 6 (deftest ^:disabled test-uberjar-provided (let [bootclasspath "-Xbootclasspath/a:leiningen-core/lib/clojure-1.4.0.jar" diff --git a/test_projects/uberjar-components-merging/components1.xml b/test_projects/uberjar-components-merging/components1.xml new file mode 100644 index 00000000..8cf00aa7 --- /dev/null +++ b/test_projects/uberjar-components-merging/components1.xml @@ -0,0 +1,73 @@ + + + + org.apache.maven.doxia.Doxia + org.apache.maven.doxia.DefaultDoxia + Simple implementation of the Doxia interface: +uses a ParserManager to lookup a parser. + + + org.apache.maven.doxia.parser.manager.ParserManager + parserManager + + + + + org.apache.maven.doxia.macro.Macro + echo + org.apache.maven.doxia.macro.EchoMacro + A simple macro that prints out the key and value of some supplied parameters. + + + org.apache.maven.doxia.macro.manager.MacroManager + org.apache.maven.doxia.macro.manager.DefaultMacroManager + Default implementation of <code>MacroManager</code> + + + org.apache.maven.doxia.macro.Macro + macros + + + + + org.apache.maven.doxia.macro.Macro + snippet + org.apache.maven.doxia.macro.snippet.SnippetMacro + A macro that prints out the content of a file or a URL. + + + org.apache.maven.doxia.macro.Macro + swf + org.apache.maven.doxia.macro.SwfMacro + Macro for embedding Flash (SWF) within Maven documentation. + + + org.apache.maven.doxia.macro.Macro + toc + org.apache.maven.doxia.macro.toc.TocMacro + Macro to display a <code>Table Of Content</code> in a given <code>Sink</code>. + + + org.apache.maven.doxia.module.site.manager.SiteModuleManager + org.apache.maven.doxia.module.site.manager.DefaultSiteModuleManager + Simple implementation of the SiteModuleManager interface. + + + org.apache.maven.doxia.module.site.SiteModule + siteModules + + + + + org.apache.maven.doxia.parser.manager.ParserManager + org.apache.maven.doxia.parser.manager.DefaultParserManager + Simple implementation of the <code>ParserManager</code> interface. + + + org.apache.maven.doxia.parser.Parser + parsers + + + + + diff --git a/test_projects/uberjar-components-merging/components2.xml b/test_projects/uberjar-components-merging/components2.xml new file mode 100644 index 00000000..914663bc --- /dev/null +++ b/test_projects/uberjar-components-merging/components2.xml @@ -0,0 +1,218 @@ + + + + + + + + + org.apache.maven.doxia.macro.Macro + echo + org.apache.maven.doxia.macro.EchoMacro + A simple macro that prints out the key and value of some supplied + parameters. + + + org.apache.maven.doxia.macro.manager.MacroManager + org.apache.maven.doxia.macro.manager.DefaultMacroManager + Default implementation of <code>MacroManager</code> + + + org.apache.maven.doxia.macro.Macro + macros + + + + + org.apache.maven.doxia.macro.Macro + snippet + org.apache.maven.doxia.macro.snippet.SnippetMacro + A macro that prints out the content of a file or a URL. + + + org.apache.maven.doxia.macro.Macro + swf + org.apache.maven.doxia.macro.SwfMacro + Macro for embedding Flash (SWF) within Maven documentation. + + + org.apache.maven.doxia.macro.Macro + toc + org.apache.maven.doxia.macro.toc.TocMacro + Macro to display a <code>Table Of Content</code> in a + given <code>Sink</code>. + + + org.apache.maven.doxia.parser.manager.ParserManager + org.apache.maven.doxia.parser.manager.DefaultParserManager + Simple implementation of the + <code>ParserManager</code> interface. + + + org.apache.maven.doxia.parser.Parser + parsers + + + + + + + org.apache.maven.doxia.parser.Parser + apt + org.apache.maven.doxia.module.apt.AptParser + The APT parser. + + + org.apache.maven.doxia.macro.manager.MacroManager + macroManager + + + + + org.apache.maven.doxia.sink.SinkFactory + apt + org.apache.maven.doxia.module.apt.AptSinkFactory + APT implementation of the Sink factory. + + + + + org.apache.maven.doxia.parser.Parser + confluence + org.apache.maven.doxia.module.confluence.ConfluenceParser + Parse the <a href="http://www. + + + org.apache.maven.doxia.sink.SinkFactory + confluence + org.apache.maven.doxia.module.confluence.ConfluenceSinkFactory + Confluence implementation of the Sink factory. + + + + + org.apache.maven.doxia.parser.Parser + docbook + org.apache.maven.doxia.module.docbook.DocBookParser + Parse a <code>Docbook</code> document and emit events + into the specified doxia Sink. + + + org.apache.maven.doxia.sink.SinkFactory + docbook + org.apache.maven.doxia.module.docbook.DocbookSinkFactory + Docbook implementation of the Sink factory. + + + + + org.apache.maven.doxia.parser.Parser + fml + org.apache.maven.doxia.module.fml.FmlParser + Parse a fml model and emit events into the specified doxia Sink. + + + org.apache.maven.doxia.macro.manager.MacroManager + macroManager + + + + + + + org.apache.maven.doxia.sink.SinkFactory + fo + org.apache.maven.doxia.module.fo.FoSinkFactory + FO implementation of the Sink factory. + + + + + org.apache.maven.doxia.sink.SinkFactory + itext + org.apache.maven.doxia.module.itext.ITextSinkFactory + IText implementation of the Sink factory. + + + + + org.apache.maven.doxia.sink.SinkFactory + latex + org.apache.maven.doxia.module.latex.LatexSinkFactory + Latex implementation of the Sink factory. + + + + + org.apache.maven.doxia.sink.SinkFactory + rtf + org.apache.maven.doxia.module.rtf.RtfSinkFactory + APT implementation of the Sink factory. + + + + + org.apache.maven.doxia.parser.Parser + twiki + org.apache.maven.doxia.module.twiki.TWikiParser + Parse the <a href="http://twiki. + + + org.apache.maven.doxia.sink.SinkFactory + twiki + org.apache.maven.doxia.module.twiki.TWikiSinkFactory + TWiki implementation of the Sink factory. + + + + + org.apache.maven.doxia.parser.Parser + xdoc + org.apache.maven.doxia.module.xdoc.XdocParser + Parse an xdoc model and emit events into the specified doxia Sink. + + + org.apache.maven.doxia.macro.manager.MacroManager + macroManager + + + + + org.apache.maven.doxia.sink.SinkFactory + xdoc + org.apache.maven.doxia.module.xdoc.XdocSinkFactory + Xdoc implementation of the Sink factory. + + + + + org.apache.maven.doxia.parser.Parser + xhtml + org.apache.maven.doxia.module.xhtml.XhtmlParser + Parse an xhtml model and emit events into a Doxia Sink. + + + org.apache.maven.doxia.sink.SinkFactory + xhtml + org.apache.maven.doxia.module.xhtml.XhtmlSinkFactory + Xhtml implementation of the Sink factory. + + + diff --git a/test_projects/uberjar-components-merging/expected-components.xml b/test_projects/uberjar-components-merging/expected-components.xml new file mode 100644 index 00000000..27115f42 --- /dev/null +++ b/test_projects/uberjar-components-merging/expected-components.xml @@ -0,0 +1,516 @@ + + + + + +org.apache.maven.doxia.Doxia + + +org.apache.maven.doxia.DefaultDoxia + + +Simple implementation of the Doxia interface: +uses a ParserManager to lookup a parser. + + + + +org.apache.maven.doxia.parser.manager.ParserManager + + +parserManager + + + + + + +org.apache.maven.doxia.macro.Macro + + +echo + + +org.apache.maven.doxia.macro.EchoMacro + + +A simple macro that prints out the key and value of some supplied parameters. + + + + +org.apache.maven.doxia.macro.manager.MacroManager + + +org.apache.maven.doxia.macro.manager.DefaultMacroManager + + +Default implementation of <code>MacroManager</code> + + + + +org.apache.maven.doxia.macro.Macro + + +macros + + + + + + +org.apache.maven.doxia.macro.Macro + + +snippet + + +org.apache.maven.doxia.macro.snippet.SnippetMacro + + +A macro that prints out the content of a file or a URL. + + + + +org.apache.maven.doxia.macro.Macro + + +swf + + +org.apache.maven.doxia.macro.SwfMacro + + +Macro for embedding Flash (SWF) within Maven documentation. + + + + +org.apache.maven.doxia.macro.Macro + + +toc + + +org.apache.maven.doxia.macro.toc.TocMacro + + +Macro to display a <code>Table Of Content</code> in a given <code>Sink</code>. + + + + +org.apache.maven.doxia.module.site.manager.SiteModuleManager + + +org.apache.maven.doxia.module.site.manager.DefaultSiteModuleManager + + +Simple implementation of the SiteModuleManager interface. + + + + +org.apache.maven.doxia.module.site.SiteModule + + +siteModules + + + + + + +org.apache.maven.doxia.parser.manager.ParserManager + + +org.apache.maven.doxia.parser.manager.DefaultParserManager + + +Simple implementation of the <code>ParserManager</code> interface. + + + + +org.apache.maven.doxia.parser.Parser + + +parsers + + + + + + +org.apache.maven.doxia.macro.Macro + + +echo + + +org.apache.maven.doxia.macro.EchoMacro + + +A simple macro that prints out the key and value of some supplied + parameters. + + + + +org.apache.maven.doxia.macro.manager.MacroManager + + +org.apache.maven.doxia.macro.manager.DefaultMacroManager + + +Default implementation of <code>MacroManager</code> + + + + +org.apache.maven.doxia.macro.Macro + + +macros + + + + + + +org.apache.maven.doxia.macro.Macro + + +snippet + + +org.apache.maven.doxia.macro.snippet.SnippetMacro + + +A macro that prints out the content of a file or a URL. + + + + +org.apache.maven.doxia.macro.Macro + + +swf + + +org.apache.maven.doxia.macro.SwfMacro + + +Macro for embedding Flash (SWF) within Maven documentation. + + + + +org.apache.maven.doxia.macro.Macro + + +toc + + +org.apache.maven.doxia.macro.toc.TocMacro + + +Macro to display a <code>Table Of Content</code> in a + given <code>Sink</code>. + + + + +org.apache.maven.doxia.parser.manager.ParserManager + + +org.apache.maven.doxia.parser.manager.DefaultParserManager + + +Simple implementation of the + <code>ParserManager</code> interface. + + + + +org.apache.maven.doxia.parser.Parser + + +parsers + + + + + + +org.apache.maven.doxia.parser.Parser + + +apt + + +org.apache.maven.doxia.module.apt.AptParser + + +The APT parser. + + + + +org.apache.maven.doxia.macro.manager.MacroManager + + +macroManager + + + + + + +org.apache.maven.doxia.sink.SinkFactory + + +apt + + +org.apache.maven.doxia.module.apt.AptSinkFactory + + +APT implementation of the Sink factory. + + + + +org.apache.maven.doxia.parser.Parser + + +confluence + + +org.apache.maven.doxia.module.confluence.ConfluenceParser + + +Parse the <a href="http://www. + + + + +org.apache.maven.doxia.sink.SinkFactory + + +confluence + + +org.apache.maven.doxia.module.confluence.ConfluenceSinkFactory + + +Confluence implementation of the Sink factory. + + + + +org.apache.maven.doxia.parser.Parser + + +docbook + + +org.apache.maven.doxia.module.docbook.DocBookParser + + +Parse a <code>Docbook</code> document and emit events + into the specified doxia Sink. + + + + +org.apache.maven.doxia.sink.SinkFactory + + +docbook + + +org.apache.maven.doxia.module.docbook.DocbookSinkFactory + + +Docbook implementation of the Sink factory. + + + + +org.apache.maven.doxia.parser.Parser + + +fml + + +org.apache.maven.doxia.module.fml.FmlParser + + +Parse a fml model and emit events into the specified doxia Sink. + + + + +org.apache.maven.doxia.macro.manager.MacroManager + + +macroManager + + + + + + +org.apache.maven.doxia.sink.SinkFactory + + +fo + + +org.apache.maven.doxia.module.fo.FoSinkFactory + + +FO implementation of the Sink factory. + + + + +org.apache.maven.doxia.sink.SinkFactory + + +itext + + +org.apache.maven.doxia.module.itext.ITextSinkFactory + + +IText implementation of the Sink factory. + + + + +org.apache.maven.doxia.sink.SinkFactory + + +latex + + +org.apache.maven.doxia.module.latex.LatexSinkFactory + + +Latex implementation of the Sink factory. + + + + +org.apache.maven.doxia.sink.SinkFactory + + +rtf + + +org.apache.maven.doxia.module.rtf.RtfSinkFactory + + +APT implementation of the Sink factory. + + + + +org.apache.maven.doxia.parser.Parser + + +twiki + + +org.apache.maven.doxia.module.twiki.TWikiParser + + +Parse the <a href="http://twiki. + + + + +org.apache.maven.doxia.sink.SinkFactory + + +twiki + + +org.apache.maven.doxia.module.twiki.TWikiSinkFactory + + +TWiki implementation of the Sink factory. + + + + +org.apache.maven.doxia.parser.Parser + + +xdoc + + +org.apache.maven.doxia.module.xdoc.XdocParser + + +Parse an xdoc model and emit events into the specified doxia Sink. + + + + +org.apache.maven.doxia.macro.manager.MacroManager + + +macroManager + + + + + + +org.apache.maven.doxia.sink.SinkFactory + + +xdoc + + +org.apache.maven.doxia.module.xdoc.XdocSinkFactory + + +Xdoc implementation of the Sink factory. + + + + +org.apache.maven.doxia.parser.Parser + + +xhtml + + +org.apache.maven.doxia.module.xhtml.XhtmlParser + + +Parse an xhtml model and emit events into a Doxia Sink. + + + + +org.apache.maven.doxia.sink.SinkFactory + + +xhtml + + +org.apache.maven.doxia.module.xhtml.XhtmlSinkFactory + + +Xhtml implementation of the Sink factory. + + + +