001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.search.lucene.messaging;
016    
017    import com.liferay.portal.kernel.bean.PortalBeanLocatorUtil;
018    import com.liferay.portal.kernel.cluster.messaging.ClusterBridgeMessageListener;
019    import com.liferay.portal.kernel.messaging.BaseDestinationEventListener;
020    import com.liferay.portal.kernel.messaging.DestinationNames;
021    import com.liferay.portal.kernel.messaging.MessageBusUtil;
022    import com.liferay.portal.kernel.messaging.MessageListener;
023    import com.liferay.portal.kernel.search.BooleanQueryFactory;
024    import com.liferay.portal.kernel.search.BooleanQueryFactoryUtil;
025    import com.liferay.portal.kernel.search.TermQueryFactory;
026    import com.liferay.portal.kernel.search.TermQueryFactoryUtil;
027    import com.liferay.portal.kernel.search.messaging.BaseSearchEngineMessageListener;
028    import com.liferay.portal.kernel.search.messaging.SearchReaderMessageListener;
029    import com.liferay.portal.kernel.search.messaging.SearchWriterMessageListener;
030    import com.liferay.portal.search.lucene.LuceneSearchEngineImpl;
031    import com.liferay.portal.util.PropsValues;
032    
033    /**
034     * @author Michael C. Han
035     */
036    public class SearchEngineDestinationEventListener
037            extends BaseDestinationEventListener {
038    
039            public void messageListenerRegistered(
040                    String destinationName, MessageListener messageListener) {
041    
042                    if (!isProceed(destinationName, messageListener)) {
043                            return;
044                    }
045    
046                    MessageBusUtil.unregisterMessageListener(
047                            DestinationNames.SEARCH_READER, _searchReaderMessageListener);
048                    MessageBusUtil.unregisterMessageListener(
049                            DestinationNames.SEARCH_WRITER, _searchWriterMessageListener);
050    
051                    BaseSearchEngineMessageListener baseSearchEngineMessageListener =
052                            (BaseSearchEngineMessageListener)messageListener;
053    
054                    String searchEngineName =
055                            baseSearchEngineMessageListener.getSearchEngineName();
056    
057                    if (!searchEngineName.contains(LuceneSearchEngineImpl.NAME)) {
058                            setBooleanQueryFactory(
059                                    new com.liferay.portal.search.generic.
060                                            BooleanQueryFactoryImpl());
061                            setTermQueryFactory(
062                                    new com.liferay.portal.search.generic.TermQueryFactoryImpl());
063    
064                            _clusterSearchWriterMessageListener.setActive(false);
065                    }
066            }
067    
068            public void messageListenerUnregistered(
069                    String destinationName, MessageListener messageListener) {
070    
071                    if (!isProceed(destinationName, messageListener)) {
072                            return;
073                    }
074    
075                    MessageBusUtil.registerMessageListener(
076                            DestinationNames.SEARCH_READER, _searchReaderMessageListener);
077                    MessageBusUtil.registerMessageListener(
078                            DestinationNames.SEARCH_WRITER, _searchWriterMessageListener);
079    
080                    BaseSearchEngineMessageListener baseSearchEngineMessageListener =
081                            (BaseSearchEngineMessageListener)messageListener;
082    
083                    String searchEngineName =
084                            baseSearchEngineMessageListener.getSearchEngineName();
085    
086                    if (!searchEngineName.contains(LuceneSearchEngineImpl.NAME)) {
087                            setBooleanQueryFactory(
088                                    new com.liferay.portal.search.lucene.BooleanQueryFactoryImpl());
089                            setTermQueryFactory(
090                                    new com.liferay.portal.search.lucene.TermQueryFactoryImpl());
091    
092                            _clusterSearchWriterMessageListener.setActive(
093                                    PropsValues.LUCENE_REPLICATE_WRITE);
094                    }
095            }
096    
097            public void setClusterSearchWriterMessageListener(
098                    ClusterBridgeMessageListener clusterSearchWriterMessageListener) {
099    
100                    _clusterSearchWriterMessageListener =
101                            clusterSearchWriterMessageListener;
102    
103                    _clusterSearchWriterMessageListener.setActive(
104                            PropsValues.LUCENE_REPLICATE_WRITE);
105            }
106    
107            public void setSearchReaderMessageListener(
108                    SearchReaderMessageListener searchReaderMessageListener) {
109    
110                    _searchReaderMessageListener = searchReaderMessageListener;
111            }
112    
113            public void setSearchWriterMessageListener(
114                    SearchWriterMessageListener searchWriterMessageListener) {
115    
116                    _searchWriterMessageListener = searchWriterMessageListener;
117            }
118    
119            protected boolean isProceed(
120                    String destinationName, MessageListener messageListener) {
121    
122                    if ((!destinationName.equals(DestinationNames.SEARCH_READER)) ||
123                            (messageListener == _searchReaderMessageListener) ||
124                            !(messageListener instanceof SearchReaderMessageListener)) {
125    
126                            return false;
127                    }
128                    else {
129                            return true;
130                    }
131            }
132    
133            protected void setBooleanQueryFactory(
134                    BooleanQueryFactory booleanQueryFactory) {
135    
136                    BooleanQueryFactoryUtil booleanQueryFactoryUtil =
137                            (BooleanQueryFactoryUtil)PortalBeanLocatorUtil.locate(
138                                    BooleanQueryFactoryUtil.class.getName());
139    
140                    booleanQueryFactoryUtil.setBooleanQueryFactory(booleanQueryFactory);
141            }
142    
143            protected void setTermQueryFactory(TermQueryFactory termQueryFactory) {
144                    TermQueryFactoryUtil termQueryFactoryUtil =
145                            (TermQueryFactoryUtil)PortalBeanLocatorUtil.locate(
146                                    TermQueryFactoryUtil.class.getName());
147    
148                    termQueryFactoryUtil.setTermQueryFactory(termQueryFactory);
149            }
150    
151            private ClusterBridgeMessageListener _clusterSearchWriterMessageListener;
152            private SearchReaderMessageListener _searchReaderMessageListener;
153            private SearchWriterMessageListener _searchWriterMessageListener;
154    
155    }