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