1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
12   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
14   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
15   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
17   * SOFTWARE.
18   */
19  
20  package com.liferay.portal.search.lucene.messaging;
21  
22  import com.liferay.portal.kernel.log.Log;
23  import com.liferay.portal.kernel.log.LogFactoryUtil;
24  import com.liferay.portal.kernel.messaging.Message;
25  import com.liferay.portal.kernel.messaging.MessageBusUtil;
26  import com.liferay.portal.kernel.messaging.MessageListener;
27  import com.liferay.portal.kernel.messaging.sender.MessageSender;
28  import com.liferay.portal.kernel.search.Hits;
29  import com.liferay.portal.kernel.search.SearchEngine;
30  import com.liferay.portal.kernel.search.messaging.SearchRequest;
31  
32  /**
33   * <a href="LuceneReaderMessageListener.java.html"><b><i>View Source</i></b></a>
34   *
35   * @author Bruno Farache
36   *
37   */
38  public class LuceneReaderMessageListener implements MessageListener {
39  
40      public LuceneReaderMessageListener(MessageSender messageSender) {
41          _messageSender = messageSender;
42      }
43  
44      public void receive(Message message) {
45          try {
46              doReceive(message);
47          }
48          catch (Exception e) {
49              _log.error("Unable to process message " + message, e);
50          }
51      }
52  
53      public void setSearchEngine(SearchEngine searchEngine) {
54          _searchEngine = searchEngine;
55      }
56  
57      protected void doCommandSearch(Message message, SearchRequest searchRequest)
58          throws Exception {
59  
60          Hits hits = _searchEngine.getSearcher().search(
61              searchRequest.getCompanyId(), searchRequest.getQuery(),
62              searchRequest.getSorts(), searchRequest.getStart(),
63              searchRequest.getEnd());
64  
65          Message responseMessage = MessageBusUtil.createResponseMessage(
66              message, hits);
67  
68          _messageSender.send(responseMessage.getDestination(), responseMessage);
69      }
70  
71      protected void doReceive(Message message) throws Exception {
72          Object payload = message.getPayload();
73  
74          if (!_searchEngine.isRegistered() ||
75              !(payload instanceof SearchRequest)) {
76  
77              return;
78          }
79  
80          SearchRequest searchRequest = (SearchRequest)payload;
81  
82          String command = searchRequest.getCommand();
83  
84          if (command.equals(SearchRequest.COMMAND_SEARCH)) {
85              doCommandSearch(message, searchRequest);
86          }
87      }
88  
89      private static Log _log =
90          LogFactoryUtil.getLog(LuceneReaderMessageListener.class);
91  
92      private MessageSender _messageSender;
93      private SearchEngine _searchEngine;
94  
95  }