23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
24 */ |
24 */ |
25 |
25 |
26 package de.uapcore.lightpit.servlet |
26 package de.uapcore.lightpit.servlet |
27 |
27 |
|
28 import com.github.difflib.text.DiffRow |
|
29 import com.github.difflib.text.DiffRowGenerator |
28 import de.uapcore.lightpit.AbstractServlet |
30 import de.uapcore.lightpit.AbstractServlet |
29 import de.uapcore.lightpit.HttpRequest |
31 import de.uapcore.lightpit.HttpRequest |
30 import de.uapcore.lightpit.dao.DataAccessObject |
32 import de.uapcore.lightpit.dao.DataAccessObject |
31 import de.uapcore.lightpit.entities.IssueHistoryData |
33 import de.uapcore.lightpit.entities.IssueHistoryData |
32 import de.uapcore.lightpit.entities.IssueHistoryEntry |
34 import de.uapcore.lightpit.entities.IssueHistoryEntry |
34 import de.uapcore.lightpit.viewmodel.IssueFeed |
36 import de.uapcore.lightpit.viewmodel.IssueFeed |
35 import de.uapcore.lightpit.viewmodel.IssueFeedEntry |
37 import de.uapcore.lightpit.viewmodel.IssueFeedEntry |
36 import java.text.SimpleDateFormat |
38 import java.text.SimpleDateFormat |
37 import javax.servlet.annotation.WebServlet |
39 import javax.servlet.annotation.WebServlet |
38 |
40 |
|
41 |
39 @WebServlet(urlPatterns = ["/feed/*"]) |
42 @WebServlet(urlPatterns = ["/feed/*"]) |
40 class FeedServlet : AbstractServlet() { |
43 class FeedServlet : AbstractServlet() { |
41 |
44 |
42 init { |
45 init { |
43 get("/%project/issues.rss", this::issues) |
46 get("/%project/issues.rss", this::issues) |
44 } |
47 } |
45 |
|
46 private fun String.convertLF() = replace("\r", "").replace("\n", "<br>") |
|
47 |
48 |
48 private fun fullContent(issue: IssueHistoryData) = IssueDiff( |
49 private fun fullContent(issue: IssueHistoryData) = IssueDiff( |
49 issue.id, |
50 issue.id, |
50 issue.subject, |
51 issue.subject, |
51 issue.component, |
52 issue.component, |
52 issue.status.name, |
53 issue.status.name, |
53 issue.category.name, |
54 issue.category.name, |
54 issue.subject, |
55 issue.subject, |
55 issue.description.convertLF(), |
56 issue.description.replace("\r", ""), |
56 issue.assignee, |
57 issue.assignee, |
57 issue.eta?.let { SimpleDateFormat("dd.MM.yyyy").format(it) } ?: "", |
58 issue.eta?.let { SimpleDateFormat("dd.MM.yyyy").format(it) } ?: "", |
58 issue.affected, |
59 issue.affected, |
59 issue.resolved |
60 issue.resolved |
60 ) |
61 ) |
61 |
62 |
62 private fun diffContent(cur: IssueHistoryData, next: IssueHistoryData): IssueDiff { |
63 private fun diffContent(cur: IssueHistoryData, next: IssueHistoryData): IssueDiff { |
|
64 val generator = DiffRowGenerator.create() |
|
65 .showInlineDiffs(true) |
|
66 .mergeOriginalRevised(true) |
|
67 .inlineDiffByWord(true) |
|
68 .oldTag { start -> if (start) "<strike style=\"color:red\">" else "</strike>" } |
|
69 .newTag { start -> if (start) "<i style=\"color: green\">" else "</i>" } |
|
70 .build() |
|
71 |
63 val prev = fullContent(next) |
72 val prev = fullContent(next) |
64 val diff = fullContent(cur) |
73 val diff = fullContent(cur) |
65 // TODO: compute and apply diff |
74 |
|
75 val result = generator.generateDiffRows( |
|
76 listOf(prev.subject, prev.component, prev.status, |
|
77 prev.category, prev.assignee, prev.eta, prev.affected, prev.resolved), |
|
78 listOf(diff.subject, diff.component, diff.status, |
|
79 diff.category, diff.assignee, diff.eta, diff.affected, diff.resolved) |
|
80 ) |
|
81 |
|
82 diff.subject = result[0].oldLine |
|
83 diff.component = result[1].oldLine |
|
84 diff.status = result[2].oldLine |
|
85 diff.category = result[3].oldLine |
|
86 diff.assignee = result[4].oldLine |
|
87 diff.eta = result[5].oldLine |
|
88 diff.affected = result[6].oldLine |
|
89 diff.resolved = result[7].oldLine |
|
90 |
|
91 diff.description = generator.generateDiffRows( |
|
92 prev.description.split('\n'), |
|
93 diff.description.split('\n') |
|
94 ).joinToString("<br>", transform = DiffRow::getOldLine) |
|
95 |
66 return diff |
96 return diff |
67 } |
97 } |
68 |
98 |
69 /** |
99 /** |
70 * Generates the feed entries. |
100 * Generates the feed entries. |