/** * Copyright (c) 2014-2017 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.persistence.internal; import java.util.LinkedList; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.smarthome.core.persistence.PersistenceManager; import org.eclipse.smarthome.core.persistence.PersistenceService; import org.eclipse.smarthome.core.persistence.PersistenceServiceConfiguration; import org.eclipse.smarthome.core.persistence.SimpleFilter; import org.eclipse.smarthome.core.persistence.SimpleItemConfiguration; import org.eclipse.smarthome.core.persistence.config.SimpleAllConfig; import org.eclipse.smarthome.core.persistence.config.SimpleConfig; import org.eclipse.smarthome.core.persistence.config.SimpleGroupConfig; import org.eclipse.smarthome.core.persistence.config.SimpleItemConfig; import org.eclipse.smarthome.core.persistence.strategy.SimpleCronStrategy; import org.eclipse.smarthome.core.persistence.strategy.SimpleStrategy; import org.eclipse.smarthome.model.core.EventType; import org.eclipse.smarthome.model.core.ModelRepository; import org.eclipse.smarthome.model.core.ModelRepositoryChangeListener; import org.eclipse.smarthome.model.persistence.persistence.AllConfig; import org.eclipse.smarthome.model.persistence.persistence.CronStrategy; import org.eclipse.smarthome.model.persistence.persistence.Filter; import org.eclipse.smarthome.model.persistence.persistence.GroupConfig; import org.eclipse.smarthome.model.persistence.persistence.ItemConfig; import org.eclipse.smarthome.model.persistence.persistence.PersistenceConfiguration; import org.eclipse.smarthome.model.persistence.persistence.PersistenceModel; import org.eclipse.smarthome.model.persistence.persistence.Strategy; /** * This class is the central part of the persistence management and delegation. It reads the persistence * models, schedules timers and manages the invocation of {@link PersistenceService}s upon events. * * @author Kai Kreuzer - Initial contribution and API * @author Markus Rathgeb - Move non-model logic to core.persistence * */ public class PersistenceModelManager implements ModelRepositoryChangeListener { private ModelRepository modelRepository; private PersistenceManager manager; public PersistenceModelManager() { } protected void activate() { modelRepository.addModelRepositoryChangeListener(this); for (String modelName : modelRepository.getAllModelNamesOfType("persist")) { String serviceName = modelName.substring(0, modelName.length() - ".persist".length()); manager.startEventHandling(serviceName); } } protected void deactivate() { modelRepository.removeModelRepositoryChangeListener(this); for (String modelName : modelRepository.getAllModelNamesOfType("persist")) { manager.stopEventHandling(modelName); } } protected void setModelRepository(ModelRepository modelRepository) { this.modelRepository = modelRepository; } protected void unsetModelRepository(ModelRepository modelRepository) { this.modelRepository = null; } protected void setPersistenceManager(final PersistenceManager manager) { this.manager = manager; } protected void unsetPersistenceManager(final PersistenceManager manager) { this.manager = null; } @Override public void modelChanged(String modelName, EventType type) { if (modelName.endsWith(".persist")) { final String dbId = modelName.substring(0, modelName.length() - ".persist".length()); if (type == EventType.REMOVED || type == EventType.MODIFIED) { manager.removeConfig(dbId); } if (type == EventType.ADDED || type == EventType.MODIFIED) { final PersistenceModel model = (PersistenceModel) modelRepository.getModel(modelName); if (model != null) { manager.addConfig(dbId, new PersistenceServiceConfiguration(mapConfigs(model.getConfigs()), mapStrategies(model.getDefaults()), mapStrategies(model.getStrategies()))); } } } } private List<SimpleItemConfiguration> mapConfigs(List<PersistenceConfiguration> configs) { final List<SimpleItemConfiguration> lst = new LinkedList<>(); for (final PersistenceConfiguration config : configs) { lst.add(mapConfig(config)); } return lst; } private SimpleItemConfiguration mapConfig(PersistenceConfiguration config) { final List<SimpleConfig> items = new LinkedList<>(); for (final EObject item : config.getItems()) { if (item instanceof AllConfig) { items.add(new SimpleAllConfig()); } else if (item instanceof GroupConfig) { items.add(new SimpleGroupConfig(((GroupConfig) item).getGroup())); } else if (item instanceof ItemConfig) { items.add(new SimpleItemConfig(((ItemConfig) item).getItem())); } } return new SimpleItemConfiguration(items, config.getAlias(), mapStrategies(config.getStrategies()), mapFilters(config.getFilters())); } private List<SimpleStrategy> mapStrategies(List<Strategy> strategies) { final List<SimpleStrategy> lst = new LinkedList<>(); for (final Strategy strategy : strategies) { lst.add(mapStrategy(strategy)); } return lst; } private SimpleStrategy mapStrategy(Strategy strategy) { if (strategy instanceof CronStrategy) { return new SimpleCronStrategy(strategy.getName(), ((CronStrategy) strategy).getCronExpression()); } else { return new SimpleStrategy(strategy.getName()); } } private List<SimpleFilter> mapFilters(List<Filter> filters) { final List<SimpleFilter> lst = new LinkedList<>(); for (final Filter filter : filters) { lst.add(mapFilter(filter)); } return lst; } private SimpleFilter mapFilter(Filter filter) { return new SimpleFilter(); } }