001
014
015 package com.liferay.portal.kernel.search.facet.util;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.search.SearchContext;
020 import com.liferay.portal.kernel.search.facet.Facet;
021 import com.liferay.portal.kernel.search.facet.config.FacetConfiguration;
022 import com.liferay.registry.Registry;
023 import com.liferay.registry.RegistryUtil;
024 import com.liferay.registry.ServiceReference;
025 import com.liferay.registry.ServiceTracker;
026 import com.liferay.registry.ServiceTrackerCustomizer;
027
028 import java.util.Map;
029 import java.util.concurrent.ConcurrentHashMap;
030
031
034 public class FacetFactoryUtil {
035
036 public static Facet create(
037 SearchContext searchContext, FacetConfiguration facetConfiguration)
038 throws Exception {
039
040 String className = facetConfiguration.getClassName();
041
042 FacetFactory facetFactory = _instance._facetFactories.get(className);
043
044 if (facetFactory == null) {
045 if (_log.isDebugEnabled()) {
046 _log.debug(
047 "Unable to find facet factory for class " + className);
048 }
049
050 return null;
051 }
052
053 Facet facet = facetFactory.newInstance(searchContext);
054
055 facet.setFacetConfiguration(facetConfiguration);
056
057 return facet;
058 }
059
060 public FacetFactoryUtil() {
061 Registry registry = RegistryUtil.getRegistry();
062
063 _serviceTracker = registry.trackServices(
064 FacetFactory.class, new FacetFactoryServiceTrackerCustomizer());
065
066 _serviceTracker.open();
067 }
068
069 private static final Log _log = LogFactoryUtil.getLog(
070 FacetFactoryUtil.class);
071
072 private static final FacetFactoryUtil _instance = new FacetFactoryUtil();
073
074 private final Map<String, FacetFactory> _facetFactories =
075 new ConcurrentHashMap<>();
076 private final ServiceTracker<FacetFactory, FacetFactory> _serviceTracker;
077
078 private class FacetFactoryServiceTrackerCustomizer
079 implements ServiceTrackerCustomizer<FacetFactory, FacetFactory> {
080
081 @Override
082 public FacetFactory addingService(
083 ServiceReference<FacetFactory> serviceReference) {
084
085 Registry registry = RegistryUtil.getRegistry();
086
087 FacetFactory facetFactory = registry.getService(serviceReference);
088
089 _facetFactories.put(facetFactory.getFacetClassName(), facetFactory);
090
091 return facetFactory;
092 }
093
094 @Override
095 public void modifiedService(
096 ServiceReference<FacetFactory> serviceReference,
097 FacetFactory facetFactory) {
098 }
099
100 @Override
101 public void removedService(
102 ServiceReference<FacetFactory> serviceReference,
103 FacetFactory facetFactory) {
104
105 Registry registry = RegistryUtil.getRegistry();
106
107 registry.ungetService(serviceReference);
108
109 _facetFactories.remove(facetFactory.getFacetClassName());
110 }
111
112 }
113
114 }