All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.kapua.kura.simulator.simulation.ConfiguredSimulation Maven / Gradle / Ivy

/*******************************************************************************
 * Copyright (c) 2017 Red Hat Inc and others.
 *
 * 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
 *
 * Contributors:
 *     Red Hat Inc - initial API and implementation
 *******************************************************************************/
package org.eclipse.kapua.kura.simulator.simulation;

import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;

import org.eclipse.kapua.kura.simulator.app.Application;
import org.eclipse.kapua.kura.simulator.app.ApplicationContext;
import org.eclipse.kapua.kura.simulator.app.Descriptor;
import org.eclipse.kapua.kura.simulator.app.Handler;
import org.eclipse.kapua.kura.simulator.app.data.PeriodicGenerator;
import org.eclipse.kapua.kura.simulator.app.data.PeriodicGenerator.Topic;
import org.eclipse.kapua.kura.simulator.generator.Generator;
import org.eclipse.kapua.kura.simulator.generator.GeneratorFactories;
import org.eclipse.kapua.kura.simulator.generator.GeneratorScheduler;

public class ConfiguredSimulation implements Simulation {

    public static ConfiguredSimulation from(final Configuration.Application configuration, final String applicationId) {
        Objects.requireNonNull(configuration);
        Objects.requireNonNull(applicationId);

        // create generators

        final Map generators = new HashMap<>(configuration.getGenerators().size());

        for (final Map.Entry> entry : configuration.getGenerators().entrySet()) {
            final Optional generator = GeneratorFactories.create(entry.getValue());
            if (!generator.isPresent()) {
                throw new IllegalStateException(String.format("Unable to find generator factory for: " + entry.getValue()));
            }
            generators.put(entry.getKey(), generator.get());
        }

        // create metric mappings

        final Map topics = new HashMap<>(configuration.getTopics().size());
        configuration.getTopics().forEach((key, topic) -> topics.put(key, convertTopic(topic)));

        // create scheduler

        final GeneratorScheduler scheduler = new GeneratorScheduler(Duration.ofMillis(configuration.getScheduler().getPeriod()));

        // return result

        return new ConfiguredSimulation(applicationId, scheduler, generators, topics);
    }

    private static Topic convertTopic(final Configuration.Topic value) {
        if (value == null) {
            return null;
        }

        return new Topic(value.getPositionGenerator(), value.getBodyGenerator(), value.getMetrics());
    }

    private final Descriptor descriptor;
    private final GeneratorScheduler scheduler;

    private final Map generators;
    private final Map topics;

    private ConfiguredSimulation(final String applicationId, final GeneratorScheduler scheduler, final Map generators, final Map topics) {
        this.descriptor = new Descriptor(applicationId);
        this.scheduler = scheduler;
        this.generators = generators;
        this.topics = topics;
    }

    @Override
    public void close() throws Exception {
        this.scheduler.close();
    }

    @Override
    public Application createApplication(final String simulatorId) {
        return new Application() {

            @Override
            public Descriptor getDescriptor() {
                return ConfiguredSimulation.this.descriptor;
            }

            @Override
            public Handler createHandler(final ApplicationContext context) {
                return new PeriodicGenerator(context, ConfiguredSimulation.this.scheduler, ConfiguredSimulation.this.generators, ConfiguredSimulation.this.topics);
            }
        };
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy