/** * Copyright (c) 2014-2016 by the respective copyright holders. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.eclipse.smarthome.model.rule.jvmmodel; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import org.eclipse.smarthome.model.core.ModelRepository; import org.eclipse.smarthome.model.script.engine.action.ActionService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * The {@link RulesRefresher} is responsible for reloading rules resources every time. * * @author Oliver Libutzki - Initial contribution * @author Kai Kreuzer - added delayed execution * @author Maoliang Huang - refactor * */ public class RulesRefresher { // delay before rule resources are refreshed after items or services have changed private static final long REFRESH_DELAY = 2000; private final Logger logger = LoggerFactory.getLogger(RulesRefresher.class); ModelRepository modelRepository; private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); private ScheduledFuture<?> job; public void setModelRepository(ModelRepository modelRepository) { this.modelRepository = modelRepository; } public void unsetModelRepository(ModelRepository modelRepository) { this.modelRepository = null; } protected void addActionService(ActionService actionService) { scheduleRuleRefresh(); } protected void removeActionService(ActionService actionService) { scheduleRuleRefresh(); } protected synchronized void scheduleRuleRefresh() { if (job != null && !job.isDone()) { job.cancel(false); } job = scheduler.schedule(runnable, REFRESH_DELAY, TimeUnit.MILLISECONDS); } Runnable runnable = new Runnable() { @Override public void run() { try { if (modelRepository != null) { modelRepository.reloadAllModelsOfType("rules"); } } catch (Exception e) { logger.debug("Exception occurred during execution: {}", e.getMessage(), e); } } }; }