blob: 28b401dcedcd1896359b93ae952b60ab1872ff19 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.felix.dm.benchmark.dependencymanager;
import static org.apache.felix.dm.benchmark.scenario.Artist.ALBUMS;
import static org.apache.felix.dm.benchmark.scenario.Artist.ARTISTS;
import static org.apache.felix.dm.benchmark.scenario.Artist.TRACKS;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import org.apache.felix.dm.Component;
import org.apache.felix.dm.DependencyManager;
import org.apache.felix.dm.benchmark.controller.ScenarioController;
import org.apache.felix.dm.benchmark.scenario.Album;
import org.apache.felix.dm.benchmark.scenario.Artist;
import org.apache.felix.dm.benchmark.scenario.Helper;
import org.apache.felix.dm.benchmark.scenario.Track;
import org.apache.felix.dm.benchmark.scenario.impl.AlbumImpl;
import org.apache.felix.dm.benchmark.scenario.impl.ArtistImpl;
import org.apache.felix.dm.benchmark.scenario.impl.TrackImpl;
/**
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class Benchmark {
volatile DependencyManager m_dm;
volatile ScenarioController m_controller;
final List<Component> m_components = new ArrayList<>();
/**
* Initialize our Artists, Albums/Tracks, possibly using a parallel dependency manager.
*/
@SuppressWarnings("unused")
private void start() {
Helper.debug(() -> "Benchmark.start");
IntStream.range(0, ARTISTS)
// Creates a stream of Artist components
.mapToObj(i -> createArtists(m_dm)).peek(m_components::add)
// For each artist in the stream, creates a new stream of Album components
.flatMap(artist -> createAlbums(m_dm, artist)).peek(m_components::add)
// For each Album, creates a new stream of Track components
.flatMap(album -> createTracks(m_dm, album)).forEach(m_components::add);
m_components.stream().forEach(m_dm::add);
}
@SuppressWarnings("unused")
private void stop() {
m_components.forEach(m_dm::remove);
}
private Component createArtists(DependencyManager dm) {
return dm.createComponent().setInterface(Artist.class.getName(), null).setImplementation(new ArtistImpl(m_controller));
}
private Stream<Component> createAlbums(DependencyManager dm, Component artist) {
return IntStream.range(0, ALBUMS).mapToObj(i -> {
long id = Helper.generateId();
String filter = "(id=" + id + ")";
artist.add(dm.createServiceDependency().setService(Album.class, filter).setRequired(true).setCallbacks("addAlbum", null));
Hashtable<String, Object> props = new Hashtable<>();
props.put("id", String.valueOf(id));
return dm.createComponent().setInterface(Album.class.getName(), props).setImplementation(new AlbumImpl(m_controller));
});
}
private Stream<Component> createTracks(DependencyManager dm, Component album) {
return IntStream.range(0, TRACKS).mapToObj(i -> {
long id = Helper.generateId();
String f = "(id=" + String.valueOf(id) + ")";
album.add(dm.createServiceDependency().setService(Track.class, f).setRequired(true).setCallbacks("addTrack", null));
Hashtable<String, Object> p = new Hashtable<>();
p.put("id", String.valueOf(id));
return dm.createComponent().setInterface(Track.class.getName(), p).setImplementation(new TrackImpl(m_controller));
});
}
}