1
19
20 package com.liferay.portal.util;
21
22 import com.liferay.portal.kernel.util.DiffHtml;
23 import com.liferay.portal.kernel.util.LocaleUtil;
24 import com.liferay.portal.kernel.util.StringPool;
25
26 import java.io.Reader;
27 import java.io.StringWriter;
28
29 import java.util.Locale;
30
31 import javax.xml.transform.TransformerFactory;
32 import javax.xml.transform.sax.SAXTransformerFactory;
33 import javax.xml.transform.sax.TransformerHandler;
34 import javax.xml.transform.stream.StreamResult;
35
36 import org.outerj.daisy.diff.HtmlCleaner;
37 import org.outerj.daisy.diff.XslFilter;
38 import org.outerj.daisy.diff.html.HTMLDiffer;
39 import org.outerj.daisy.diff.html.HtmlSaxDiffOutput;
40 import org.outerj.daisy.diff.html.TextNodeComparator;
41 import org.outerj.daisy.diff.html.dom.DomTreeBuilder;
42
43 import org.xml.sax.ContentHandler;
44 import org.xml.sax.InputSource;
45 import org.xml.sax.helpers.AttributesImpl;
46
47
59 public class DiffHtmlImpl implements DiffHtml {
60
61
70 public String diff(Reader source, Reader target) throws Exception {
71 InputSource oldSource = new InputSource(source);
72 InputSource newSource = new InputSource(target);
73
74 StringWriter stringWriter = new StringWriter();
75
76 SAXTransformerFactory saxTransformerFactory =
77 (SAXTransformerFactory)TransformerFactory.newInstance();
78
79 TransformerHandler tranformHandler =
80 saxTransformerFactory.newTransformerHandler();
81
82 tranformHandler.setResult(new StreamResult(stringWriter));
83
84 XslFilter xslFilter = new XslFilter();
85
86 ContentHandler contentHandler = xslFilter.xsl(
87 tranformHandler,
88 "com/liferay/portal/util/dependencies/diff_html.xsl");
89
90 HtmlCleaner htmlCleaner = new HtmlCleaner();
91
92 DomTreeBuilder oldDomTreeBuilder = new DomTreeBuilder();
93
94 htmlCleaner.cleanAndParse(oldSource, oldDomTreeBuilder);
95
96 Locale locale = LocaleUtil.getDefault();
97
98 TextNodeComparator leftTextNodeComparator = new TextNodeComparator(
99 oldDomTreeBuilder, locale);
100
101 DomTreeBuilder newDomTreeBuilder = new DomTreeBuilder();
102
103 htmlCleaner.cleanAndParse(newSource, newDomTreeBuilder);
104
105 TextNodeComparator rightTextNodeComparator = new TextNodeComparator(
106 newDomTreeBuilder, locale);
107
108 contentHandler.startDocument();
109 contentHandler.startElement(
110 StringPool.BLANK, _DIFF_REPORT, _DIFF_REPORT, new AttributesImpl());
111 contentHandler.startElement(
112 StringPool.BLANK, _DIFF, _DIFF, new AttributesImpl());
113
114 HtmlSaxDiffOutput htmlSaxDiffOutput = new HtmlSaxDiffOutput(
115 contentHandler, _DIFF);
116
117 HTMLDiffer htmlDiffer = new HTMLDiffer(htmlSaxDiffOutput);
118
119 htmlDiffer.diff(leftTextNodeComparator, rightTextNodeComparator);
120
121 contentHandler.endElement(StringPool.BLANK, _DIFF, _DIFF);
122 contentHandler.endElement(StringPool.BLANK, _DIFF_REPORT, _DIFF_REPORT);
123 contentHandler.endDocument();
124
125 stringWriter.flush();
126
127 return stringWriter.toString();
128 }
129
130 private static final String _DIFF = "diff";
131
132 private static final String _DIFF_REPORT = "diffreport";
133
134 }