-
Notifications
You must be signed in to change notification settings - Fork 158
/
MessageVO.java
140 lines (110 loc) · 3.07 KB
/
MessageVO.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package com.jdon.jivejdon.domain.model.message;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Stream;
import org.jsoup.Jsoup;
import com.jdon.jivejdon.domain.model.ForumMessage;
/**
* ForumMessage's value object created by MessageVOCreatedBuilder
*
* there are two kinds MessageVO; 1. applied business rule filter in
* FilterPipleSpec 2. original that saved in repository
*
*/
public final class MessageVO implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
private final ForumMessage forumMessage;
private final String subject;
private final String body;
private final Map<Integer,String> caches = new HashMap<>();
/**
* only using builder pattern to create MessageVO!
* <p>
* MessageVO..builder().subject().body().message().build();
*/
private MessageVO(String subject, String body, ForumMessage forumMessage) {
this.forumMessage = forumMessage;
this.subject = subject;
this.body = body;
}
// used for compass lucene search
public MessageVO() {
this("", "", null);
}
/**
* build a messageVO
*/
public RequireSubject builder() {
return subject -> body -> new MessageVOFinalStage(subject, body, getForumMessage());
}
/**
* @return Returns the subject.
*/
public String getSubject() {
return subject;
}
public String getBody() {
return body;
}
public String getShortBody(int length) {
return caches.computeIfAbsent(length,k-> Stream.of(shortenNoHTML(getBody())).map(s -> s.substring(0, Math.min(s.length(), length))).findFirst().orElse(""));
}
public String getBodyText(int length) {
String text = getBody().substring(0, Math.min(getBody().length(), length));
return Jsoup.parse(text).wholeText();
}
public String shortenNoHTML(String in) {
return Jsoup.parse(in).wholeText();
}
public String shortenNoHTMLText(String in) {
return Jsoup.parse(in).wholeText();
}
public int getBodyLengthK(){
return getBody().length()/1024;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public ForumMessage getForumMessage() {
return forumMessage;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
MessageVO that = (MessageVO) o;
return subject.equals(that.getSubject()) && body.equals(that.getBody());
}
@Override
public int hashCode() {
return Objects.hash(subject, body);
}
@FunctionalInterface
public interface RequireSubject {
RequireBody subject(String subject);
}
@FunctionalInterface
public interface RequireBody {
MessageVOFinalStage body(String body);
}
public static class MessageVOFinalStage {
private final String subject;
private final String body;
private final ForumMessage message;
// constructor
public MessageVOFinalStage(String subject, String body, ForumMessage message) {
this.subject = subject;
this.body = body;
this.message = message;
}
public MessageVO build() {
return new MessageVO(subject, body, message);
}
}
}