1
22
23 package com.liferay.portal.servlet;
24
25 import com.liferay.portal.kernel.job.JobSchedulerUtil;
26 import com.liferay.portal.kernel.log.Log;
27 import com.liferay.portal.kernel.log.LogFactoryUtil;
28 import com.liferay.portal.kernel.util.GetterUtil;
29 import com.liferay.portal.kernel.util.ObjectValuePair;
30 import com.liferay.portal.kernel.util.PropsKeys;
31 import com.liferay.portal.search.lucene.CleanUpJob;
32 import com.liferay.portal.search.lucene.LuceneIndexer;
33 import com.liferay.portal.search.lucene.LuceneUtil;
34 import com.liferay.portal.util.PortalInstances;
35 import com.liferay.portal.util.PropsUtil;
36 import com.liferay.portal.util.PropsValues;
37
38 import java.util.ArrayList;
39 import java.util.List;
40
41 import javax.servlet.ServletConfig;
42 import javax.servlet.ServletException;
43 import javax.servlet.http.HttpServlet;
44
45
51 public class LuceneServlet extends HttpServlet {
52
53 public void init(ServletConfig servletConfig) throws ServletException {
54 super.init(servletConfig);
55
56 long[] companyIds = PortalInstances.getCompanyIds();
57
58 for (int i = 0; i < companyIds.length; i++) {
59 long companyId = companyIds[i];
60
61 if (GetterUtil.getBoolean(
62 PropsUtil.get(PropsKeys.INDEX_ON_STARTUP))) {
63
64 if (_log.isInfoEnabled()) {
65 _log.info("Indexing Lucene on startup");
66 }
67
68 LuceneIndexer indexer = new LuceneIndexer(companyId);
69 Thread indexerThread = null;
70
71 if (GetterUtil.getBoolean(
72 PropsUtil.get(PropsKeys.INDEX_WITH_THREAD))) {
73
74 indexerThread = new Thread(
75 indexer, THREAD_NAME + "." + companyId);
76
77 indexerThread.setPriority(THREAD_PRIORITY);
78
79 indexerThread.start();
80 }
81 else {
82 indexer.reIndex();
83 }
84
85 _indexers.add(
86 new ObjectValuePair<LuceneIndexer, Thread>(
87 indexer, indexerThread));
88 }
89 else {
90 LuceneUtil.checkLuceneDir(companyId);
91 }
92
93 if (PropsValues.LUCENE_STORE_JDBC_AUTO_CLEAN_UP) {
94 JobSchedulerUtil.schedule(new CleanUpJob());
95 }
96 }
97 }
98
99 public void destroy() {
100
101
103 for (int i = 0; i < _indexers.size(); i++) {
104 ObjectValuePair<LuceneIndexer, Thread> ovp = _indexers.get(i);
105
106 LuceneIndexer indexer = ovp.getKey();
107 Thread indexerThread = ovp.getValue();
108
109 if ((indexer != null) && (!indexer.isFinished()) &&
110 (indexerThread != null)) {
111
112 if (_log.isWarnEnabled()) {
113 _log.warn("Waiting for Lucene indexer to shutdown");
114 }
115
116 indexer.halt();
117
118 try {
119 indexerThread.join(THREAD_TIMEOUT);
120 }
121 catch (InterruptedException e) {
122 _log.error("Lucene indexer shutdown interrupted", e);
123 }
124 }
125 }
126
127
129 super.destroy();
130 }
131
132 private static final String THREAD_NAME = LuceneIndexer.class.getName();
133
134 private static final int THREAD_PRIORITY = Thread.MIN_PRIORITY;
135
136 private static final int THREAD_TIMEOUT = 60000;
137
138 private static Log _log = LogFactoryUtil.getLog(LuceneServlet.class);
139
140 private List<ObjectValuePair<LuceneIndexer, Thread>> _indexers =
141 new ArrayList<ObjectValuePair<LuceneIndexer, Thread>>();
142
143 }