/* * * This file is part of the Hesperides distribution. * * (https://github.com/voyages-sncf-technologies/hesperides) * * Copyright (c) 2016 VSCT. * * * * Hesperides is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation, version 3. * * * * Hesperides is distributed in the hope that it will be useful, but * * WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package com.vsct.dt.hesperides.templating.packages.cache; import com.vsct.dt.hesperides.storage.EventStore; import com.vsct.dt.hesperides.storage.HesperidesSnapshotItem; import com.vsct.dt.hesperides.templating.modules.ModuleKey; import com.vsct.dt.hesperides.templating.modules.exception.ModuleNotFoundInDatabaseException; import com.vsct.dt.hesperides.templating.modules.template.Template; import com.vsct.dt.hesperides.templating.modules.template.event.AbstractTemplateCacheLoader; import com.vsct.dt.hesperides.templating.packages.TemplatePackageKey; import com.vsct.dt.hesperides.templating.packages.event.TemplatePackageContainer; import com.vsct.dt.hesperides.templating.packages.virtual.VirtualTemplatePackagesAggregate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; import java.util.Set; /** * Created by emeric_martineau on 19/01/2016. */ public class TemplatePackageCacheLoader extends AbstractTemplateCacheLoader<String, TemplatePackageContainer> implements TemplatePackageStoragePrefixInterface { /** * Logger. */ private static final Logger LOGGER = LoggerFactory.getLogger(TemplatePackageCacheLoader.class); /** * Constructor. * * @param store event store to load event from database */ public TemplatePackageCacheLoader(final EventStore store, final long nbEventBeforePersiste) { super(store, nbEventBeforePersiste); } @Override protected Logger getLogger() { return LOGGER; } @Override protected TemplatePackageContainer createEventBuilder() { return new TemplatePackageContainer(); } @Override protected String getObjectLoadName() { return "template package"; } @Override public TemplatePackageContainer load(final String namespace) throws ModuleNotFoundInDatabaseException { final String loadObjectName = getObjectLoadName(); getLogger().debug("Load {} with namespace '{}' from store", loadObjectName, namespace); final String redisKey = generateDbKey(new ModuleKey(namespace)); // First seach last snapshot final HesperidesSnapshotItem hesperidesSnapshotItem = getStore().findLastSnapshot(redisKey); TemplatePackageContainer templatePackageContainer; if (hesperidesSnapshotItem == null || hesperidesSnapshotItem.getCurrentNbEvents() < hesperidesSnapshotItem.getNbEvents()) { // Module builder templatePackageContainer = createEventBuilder(); final VirtualTemplatePackagesAggregate virtualTemplatePackagesAggregate = new VirtualTemplatePackagesAggregate(getStore()); virtualTemplatePackagesAggregate.replay(redisKey); updateTemplatePackagesContainer(namespace, templatePackageContainer, virtualTemplatePackagesAggregate); } else { templatePackageContainer = (TemplatePackageContainer) hesperidesSnapshotItem.getSnapshot(); if (hesperidesSnapshotItem.getCurrentNbEvents() > hesperidesSnapshotItem.getNbEvents()) { final VirtualTemplatePackagesAggregate virtualTemplatePackagesAggregate = new VirtualTemplatePackagesAggregate( getStore(), templatePackageContainer.loadAllTemplate()); final long start = hesperidesSnapshotItem.getNbEvents(); final long stop = hesperidesSnapshotItem.getCurrentNbEvents(); virtualTemplatePackagesAggregate.replay(redisKey, start, stop); updateTemplatePackagesContainer(namespace, templatePackageContainer, virtualTemplatePackagesAggregate); } } // Can't return null !!!! return templatePackageContainer; } /** * Update tempalte package container. * * @param namespace * @param templatePackageContainer * @param virtualTemplatePackagesAggregate */ private void updateTemplatePackagesContainer(final String namespace, final TemplatePackageContainer templatePackageContainer, final VirtualTemplatePackagesAggregate virtualTemplatePackagesAggregate) { Set<Template> listTemplate = virtualTemplatePackagesAggregate.getAllTemplates( new TemplatePackageKey(namespace)); if (listTemplate != null) { listTemplate.stream().forEach(t -> templatePackageContainer.addTemplate(t)); } } /** * Return list of modules. * * @return list of modules */ @Override public List<Template> getAllTemplates() { final String loadObjectName = getObjectLoadName(); getLogger().debug("Load all {} from store.", loadObjectName); // Redis key pattern to search all application tempalte final String redisKey = String.format("%s-*", getStreamPrefix()); // All application template redis key. final Set<String> templates = getStore().getStreamsLike(redisKey); // List of template return by method final List<Template> listTemplates = new ArrayList<>(templates.size()); final VirtualTemplatePackagesAggregate virtualTemplatePackagesAggregate = new VirtualTemplatePackagesAggregate(getStore()); for (String templateRedisKey : templates) { getLogger().debug("Load {} from store associate with key '{}' for {}.", loadObjectName, templateRedisKey, loadObjectName); virtualTemplatePackagesAggregate.replay(templateRedisKey); virtualTemplatePackagesAggregate.withAll(t -> listTemplates.add(t)); virtualTemplatePackagesAggregate.clear(); } getLogger().debug("All {} are loaded.", loadObjectName); // Can't return null !!!! return listTemplates; } }