package org.zenoss.zep.index.impl.solr; import com.google.common.base.Strings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; import org.springframework.scheduling.TaskScheduler; import org.zenoss.zep.Messages; import org.zenoss.zep.UUIDGenerator; import org.zenoss.zep.ZepException; import org.zenoss.zep.dao.EventArchiveDao; import org.zenoss.zep.dao.EventSummaryBaseDao; import org.zenoss.zep.index.IndexedDetailsConfiguration; public class SolrEventIndexBackendFactory implements FactoryBean<SolrEventIndexBackend>, DisposableBean { private static Logger logger = LoggerFactory.getLogger(SolrEventIndexBackendFactory.class); private SolrEventIndexBackend backend; private boolean enableSolr = false; private String solrURL = ""; private String name = ""; private EventArchiveDao dao; private IndexedDetailsConfiguration config; private int shards = 24; private int replicationFactor = 1; private int maxShardsPerNode = 0; private int concurrentUploadQueueSize = 10000; private int concurrentThreads = 4; private int tagSeverityCacheSize = 0; private int tagSeverityCacheTTL = 3600; private Messages messages; private TaskScheduler scheduler; private UUIDGenerator uuidGenerator; public void setShards(int shards) { this.shards = shards; } public void setReplicationFactor(int replicationFactor) { this.replicationFactor = replicationFactor; } public void setMaxShardsPerNode(int maxShardsPerNode) { this.maxShardsPerNode = maxShardsPerNode; } public void setConcurrentUploadQueueSize(int concurrentUploadQueueSize) { this.concurrentUploadQueueSize = concurrentUploadQueueSize; } public void setConcurrentThreads(int concurrentThreads) { this.concurrentThreads = concurrentThreads; } public void setMessages(Messages messages) { this.messages = messages; } public void setScheduler(TaskScheduler scheduler) { this.scheduler = scheduler; } public void setUuidGenerator(UUIDGenerator uuidGenerator) { this.uuidGenerator = uuidGenerator; } public void setTagSeverityCacheSize(int tagSeverityCacheSize) { this.tagSeverityCacheSize = tagSeverityCacheSize; } public void setTagSeverityCacheTTL(int tagSeverityCacheTTL) { this.tagSeverityCacheTTL = tagSeverityCacheTTL; } public void setSolrURL(String solrURL) { this.solrURL = solrURL; } public void setName(String name) { this.name = name; } public void setDao(EventArchiveDao dao) { this.dao = dao; } public void setConfig(IndexedDetailsConfiguration config) { this.config = config; } public void setEnableSolr(boolean enableSolr) { this.enableSolr = enableSolr; } @Override public SolrEventIndexBackend getObject() throws Exception { if (backend != null) { throw new RuntimeException("SolrEventIndexBackend already created"); } //explicitly check to see if solr indexing should be used if (!enableSolr) { logger.info("Solr Indexing disabled"); return null; } if (Strings.isNullOrEmpty(solrURL)) { throw new RuntimeException("Solr URL must be specified"); } if (Strings.isNullOrEmpty(name)) { throw new RuntimeException("Name for solr backend must be specified"); } if (dao == null) { throw new RuntimeException("EventSummaryBaseDao must be set"); } if (config == null) { throw new RuntimeException("IndexedDetailsConfiguration must be set"); } if (messages == null) { throw new RuntimeException("Messages must be set"); } if (scheduler == null) { throw new RuntimeException("Scheduler must be set"); } if (uuidGenerator == null) { throw new RuntimeException("UUIDGenerator must be set"); } logger.info("Attempting to initialize Solr Indexing with URL {}", solrURL); if (maxShardsPerNode <= 0) maxShardsPerNode = shards; backend = new SolrEventIndexBackend(name, solrURL, config, dao, shards, replicationFactor, maxShardsPerNode, concurrentUploadQueueSize, concurrentThreads, messages, scheduler, uuidGenerator, tagSeverityCacheSize, tagSeverityCacheTTL); backend.start(); return backend; } @Override public Class<SolrEventIndexBackend> getObjectType() { return SolrEventIndexBackend.class; } @Override public boolean isSingleton() { return true; } @Override public void destroy() throws Exception { if (backend != null) { backend.shutdown(); } } }