/***************************************************************************** * * Copyright (C) Zenoss, Inc. 2011, all rights reserved. * * This content is made available according to terms specified in * License.zenoss under the directory where your Zenoss product is installed. * ****************************************************************************/ package org.zenoss.zep.index.impl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.context.ApplicationListener; import org.zenoss.protobufs.zep.Zep.EventDetailItem; import org.zenoss.zep.ZepException; import org.zenoss.zep.dao.EventDetailsConfigDao; import org.zenoss.zep.events.IndexDetailsUpdatedEvent; import org.zenoss.zep.events.IndexRebuildRequiredEvent; import org.zenoss.zep.index.IndexedDetailsConfiguration; import java.util.Map; /** * Used to maintain the current configuration for the indexed event details. */ public class IndexedDetailsConfigurationImpl implements IndexedDetailsConfiguration, ApplicationListener<IndexDetailsUpdatedEvent>, ApplicationEventPublisherAware { private static final Logger logger = LoggerFactory.getLogger(IndexedDetailsConfigurationImpl.class); private EventDetailsConfigDao eventDetailsConfigDao; private volatile boolean initialized = false; private volatile Map<String, EventDetailItem> eventDetailItemsByName; private ApplicationEventPublisher applicationEventPublisher; public void setEventDetailsConfigDao(EventDetailsConfigDao eventDetailsConfigDao) { this.eventDetailsConfigDao = eventDetailsConfigDao; } @Override public Map<String, EventDetailItem> getEventDetailItemsByName() throws ZepException { if (!initialized) { synchronized (this) { // Don't initialize twice if (!initialized) { this.eventDetailsConfigDao.init(); } initialized = true; } } if (eventDetailItemsByName == null) { synchronized (this) { if (eventDetailItemsByName == null) { this.eventDetailItemsByName = eventDetailsConfigDao.getEventDetailItemsByName(); for (EventDetailItem item : this.eventDetailItemsByName.values()) { logger.info("Indexed event detail: {} ({})", item.getKey(), item.getType()); } } } } return this.eventDetailItemsByName; } @Override public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { this.applicationEventPublisher = applicationEventPublisher; } @Override public void onApplicationEvent(IndexDetailsUpdatedEvent event) { this.eventDetailItemsByName = null; this.applicationEventPublisher.publishEvent(new IndexRebuildRequiredEvent(this)); } }