1
22
23 package com.liferay.portlet.journal.util;
24
25 import com.liferay.portal.kernel.search.Document;
26 import com.liferay.portal.kernel.search.DocumentImpl;
27 import com.liferay.portal.kernel.search.DocumentSummary;
28 import com.liferay.portal.kernel.search.Field;
29 import com.liferay.portal.kernel.search.SearchEngineUtil;
30 import com.liferay.portal.kernel.search.SearchException;
31 import com.liferay.portal.kernel.util.HtmlUtil;
32 import com.liferay.portal.kernel.util.StringPool;
33 import com.liferay.portal.kernel.util.StringUtil;
34 import com.liferay.portal.kernel.xml.Element;
35 import com.liferay.portal.kernel.xml.SAXReaderUtil;
36 import com.liferay.portal.util.PortletKeys;
37 import com.liferay.portlet.journal.service.JournalArticleLocalServiceUtil;
38
39 import java.util.Date;
40
41 import javax.portlet.PortletURL;
42
43
51 public class Indexer implements com.liferay.portal.kernel.search.Indexer {
52
53 public static final String PORTLET_ID = PortletKeys.JOURNAL;
54
55 public static void addArticle(
56 long companyId, long groupId, String articleId, double version,
57 String title, String description, String content, String type,
58 Date displayDate, String[] tagsEntries)
59 throws SearchException {
60
61 Document doc = getArticleDocument(
62 companyId, groupId, articleId, version, title, description, content,
63 type, displayDate, tagsEntries);
64
65 SearchEngineUtil.addDocument(companyId, doc);
66 }
67
68 public static void deleteArticle(
69 long companyId, long groupId, String articleId)
70 throws SearchException {
71
72 SearchEngineUtil.deleteDocument(
73 companyId, getArticleUID(groupId, articleId));
74 }
75
76 public static Document getArticleDocument(
77 long companyId, long groupId, String articleId, double version,
78 String title, String description, String content, String type,
79 Date displayDate, String[] tagsEntries) {
80
81 if ((content != null) &&
82 ((content.indexOf("<dynamic-content") != -1) ||
83 (content.indexOf("<static-content") != -1))) {
84
85 content = _getIndexableContent(content);
86
87 content = StringUtil.replace(
88 content, "<![CDATA[", StringPool.BLANK);
89 content = StringUtil.replace(content, "]]>", StringPool.BLANK);
90 }
91
92 content = StringUtil.replace(content, "&", "&");
93 content = StringUtil.replace(content, "<", "<");
94 content = StringUtil.replace(content, ">", ">");
95
96 content = HtmlUtil.extractText(content);
97
98 Document doc = new DocumentImpl();
99
100 doc.addUID(PORTLET_ID, groupId, articleId);
101
102 doc.addModifiedDate(displayDate);
103
104 doc.addKeyword(Field.COMPANY_ID, companyId);
105 doc.addKeyword(Field.PORTLET_ID, PORTLET_ID);
106 doc.addKeyword(Field.GROUP_ID, groupId);
107
108 doc.addText(Field.TITLE, title);
109 doc.addText(Field.CONTENT, content);
110 doc.addText(Field.DESCRIPTION, description);
111 doc.addKeyword(Field.TAGS_ENTRIES, tagsEntries);
112
113 doc.addKeyword(Field.ENTRY_CLASS_PK, articleId);
114 doc.addKeyword(Field.VERSION, version);
115 doc.addKeyword(Field.TYPE, type);
116
117 return doc;
118 }
119
120 public static String getArticleUID(long groupId, String articleId) {
121 Document doc = new DocumentImpl();
122
123 doc.addUID(PORTLET_ID, groupId, articleId);
124
125 return doc.get(Field.UID);
126 }
127
128 public static void updateArticle(
129 long companyId, long groupId, String articleId, double version,
130 String title, String description, String content, String type,
131 Date displayDate, String[] tagsEntries)
132 throws SearchException {
133
134 Document doc = getArticleDocument(
135 companyId, groupId, articleId, version, title, description, content,
136 type, displayDate, tagsEntries);
137
138 SearchEngineUtil.updateDocument(companyId, doc.get(Field.UID), doc);
139 }
140
141 public DocumentSummary getDocumentSummary(
142 com.liferay.portal.kernel.search.Document doc, PortletURL portletURL) {
143
144
146 String title = doc.get(Field.TITLE);
147
148
150 String content = doc.get(Field.CONTENT);
151
152 content = StringUtil.shorten(content, 200);
153
154
156 String groupId = doc.get("groupId");
157 String articleId = doc.get(Field.ENTRY_CLASS_PK);
158 String version = doc.get("version");
159
160 portletURL.setParameter("struts_action", "/journal/edit_article");
161 portletURL.setParameter("groupId", groupId);
162 portletURL.setParameter("articleId", articleId);
163 portletURL.setParameter("version", version);
164
165 return new DocumentSummary(title, content, portletURL);
166 }
167
168 public void reIndex(String[] ids) throws SearchException {
169 try {
170 JournalArticleLocalServiceUtil.reIndex(ids);
171 }
172 catch (Exception e) {
173 throw new SearchException(e);
174 }
175 }
176
177 private static String _getIndexableContent(String content) {
178 try {
179 StringBuilder sb = new StringBuilder();
180
181 com.liferay.portal.kernel.xml.Document doc = SAXReaderUtil.read(
182 content);
183
184 Element root = doc.getRootElement();
185
186 _getIndexableContent(sb, root);
187
188 return sb.toString();
189 }
190 catch (Exception e) {
191 e.printStackTrace();
192
193 return content;
194 }
195 }
196
197 private static void _getIndexableContent(StringBuilder sb, Element root)
198 throws Exception {
199
200 for (Element el : root.elements()) {
201 String elType = el.attributeValue("type", StringPool.BLANK);
202
203 if (elType.equals("text") || elType.equals("text_box") ||
204 elType.equals("text_area")) {
205
206 for (Element dynamicContent : el.elements("dynamic-content")) {
207 String text = dynamicContent.getText();
208
209 sb.append(text);
210 sb.append(StringPool.SPACE);
211 }
212 }
213 else if (el.getName().equals("static-content")) {
214 String text = el.getText();
215
216 sb.append(text);
217 sb.append(StringPool.SPACE);
218 }
219
220 _getIndexableContent(sb, el);
221 }
222 }
223
224 }