src/main/kotlin/de/uapcore/lightpit/servlet/FeedServlet.kt

changeset 236
819c5178b6fe
parent 235
4258b9e010ae
child 238
1d48b38ca349
equal deleted inserted replaced
235:4258b9e010ae 236:819c5178b6fe
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.

mercurial