001
014
015 package com.liferay.portal.search;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.search.DummyIndexer;
020 import com.liferay.portal.kernel.search.Indexer;
021 import com.liferay.portal.kernel.search.IndexerRegistry;
022 import com.liferay.portal.kernel.util.PortalClassLoaderUtil;
023 import com.liferay.portal.kernel.util.ProxyUtil;
024 import com.liferay.portal.search.buffer.BufferedIndexerInvocationHandler;
025 import com.liferay.portal.search.buffer.IndexerRequestBuffer;
026 import com.liferay.portal.service.PersistedModelLocalServiceRegistry;
027 import com.liferay.portal.service.PersistedModelLocalServiceRegistryUtil;
028 import com.liferay.portal.spring.aop.ServiceBeanAopCacheManagerUtil;
029 import com.liferay.portal.util.PropsValues;
030
031 import java.util.ArrayList;
032 import java.util.HashSet;
033 import java.util.List;
034 import java.util.Map;
035 import java.util.concurrent.ConcurrentHashMap;
036
037 import org.apache.commons.lang.ClassUtils;
038
039
042 public class IndexerRegistryImpl implements IndexerRegistry {
043
044 @Override
045 public Indexer getIndexer(String className) {
046 Indexer indexer = _indexers.get(className);
047
048 return proxyIndexer(className, indexer);
049 }
050
051 @Override
052 public List<Indexer> getIndexers() {
053 return new ArrayList<Indexer>(new HashSet<Indexer>(_indexers.values()));
054 }
055
056 @Override
057 public Indexer nullSafeGetIndexer(String className) {
058 Indexer indexer = getIndexer(className);
059
060 if (indexer != null) {
061 return indexer;
062 }
063
064 if (_log.isInfoEnabled()) {
065 _log.info("No indexer found for " + className);
066 }
067
068 return _dummyIndexer;
069 }
070
071 protected Indexer proxyIndexer(String className, Indexer indexer) {
072 if (indexer == null) {
073 return null;
074 }
075
076 IndexerRequestBuffer indexerRequestBuffer = IndexerRequestBuffer.get();
077
078 if ((indexerRequestBuffer == null) ||
079 !PropsValues.INDEX_REQUEST_BUFFER_ENABLED) {
080
081 return indexer;
082 }
083
084 Indexer proxiedIndexer = _proxiedIndexers.get(className);
085
086 if (proxiedIndexer == null) {
087 List<?> interfaces = ClassUtils.getAllInterfaces(
088 indexer.getClass());
089
090 PersistedModelLocalServiceRegistry
091 persistedModelLocalServiceRegistry =
092 PersistedModelLocalServiceRegistryUtil.
093 getPersistedModelLocalServiceRegistry();
094
095 BufferedIndexerInvocationHandler bufferedIndexerInvocationHandler =
096 new BufferedIndexerInvocationHandler(
097 indexer, persistedModelLocalServiceRegistry);
098
099 proxiedIndexer = (Indexer)ProxyUtil.newProxyInstance(
100 PortalClassLoaderUtil.getClassLoader(),
101 interfaces.toArray(new Class[interfaces.size()]),
102 bufferedIndexerInvocationHandler);
103
104 _proxiedIndexers.put(className, proxiedIndexer);
105 }
106
107 return (Indexer)proxiedIndexer;
108 }
109
110 @Override
111 public void register(String className, Indexer indexerInstance) {
112 _indexers.put(className, indexerInstance);
113
114 ServiceBeanAopCacheManagerUtil.reset();
115 }
116
117 @Override
118 public void unregister(String className) {
119 _indexers.remove(className);
120 }
121
122 private static Log _log = LogFactoryUtil.getLog(IndexerRegistryImpl.class);
123
124 private Indexer _dummyIndexer = new DummyIndexer();
125 private Map<String, Indexer> _indexers =
126 new ConcurrentHashMap<String, Indexer>();
127
128 private final Map<String, Indexer> _proxiedIndexers =
129 new ConcurrentHashMap<String, Indexer>();
130
131 }