/* * Copyright (c) 2015 Spotify AB. * * 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 com.spotify.heroic.test; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.DoubleNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.TextNode; import com.spotify.heroic.ExtraParameters; import com.spotify.heroic.HeroicConfiguration; import com.spotify.heroic.HeroicMappers; import com.spotify.heroic.HeroicModule; import com.spotify.heroic.common.ReflectionUtils; import com.spotify.heroic.dagger.CoreLoadingComponent; import com.spotify.heroic.dagger.DaggerCoreLoadingComponent; import com.spotify.heroic.dagger.LoadingComponent; import com.spotify.heroic.dagger.LoadingModule; import com.spotify.heroic.filter.Filter; import com.spotify.heroic.grammar.Expression; import com.spotify.heroic.grammar.QueryParser; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ForkJoinPool; import lombok.Data; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class FakeModuleLoader { private final LoadingComponent loading; private final ObjectMapper json; public FakeModuleLoader load(final Class<? extends HeroicModule> module) { final HeroicModule instance = ReflectionUtils.buildInstance(module); instance.setup(loading).run(); return this; } public ObjectMapper config() { return loading.configMapper(); } public ObjectMapper json() { return json; } public static Builder builder() { return new Builder(); } public JsonBuilder jsonObject() { return new JsonBuilder(); } public static class Builder { private final List<Class<? extends HeroicModule>> modules = new ArrayList<>(); public Builder module(final Class<? extends HeroicModule> module) { this.modules.add(module); return this; } public FakeModuleLoader build() { final FakeHeroicConfiguration config = new FakeHeroicConfiguration(); final CoreLoadingComponent loadingComponent = DaggerCoreLoadingComponent .builder() .loadingModule(new LoadingModule(ForkJoinPool.commonPool(), false, config, ExtraParameters.empty())) .build(); modules.forEach(m -> { ReflectionUtils.buildInstance(m).setup(loadingComponent).run(); }); final QueryParser parser = new FakeQueryParser(); final ObjectMapper m = HeroicMappers.json(parser); m.registerModule(loadingComponent.aggregationRegistry().module()); return new FakeModuleLoader(loadingComponent, m); } } public static class FakeHeroicConfiguration implements HeroicConfiguration { @Override public boolean isDisableLocal() { return false; } @Override public boolean isOneshot() { return false; } } public static class FakeQueryParser implements QueryParser { @Override public Filter parseFilter(final String filter) { throw new RuntimeException("Cannot parse filter: " + filter); } @Override public List<Expression> parse(final String statements) { throw new RuntimeException("Cannot parse statements: " + statements); } } /** * Helper for building Json Objects in test cases. */ @Data public class JsonBuilder { private final Map<String, JsonNode> fields = new HashMap<>(); public JsonBuilder put(final String key, final String value) { fields.put(key, new TextNode(value)); return this; } public JsonBuilder put(final String key, final double value) { fields.put(key, new DoubleNode(value)); return this; } public JsonBuilder put(final String key, final JsonNode value) { fields.put(key, value); return this; } public JsonNode object() { return new ObjectNode(json.getNodeFactory(), fields); } public String string() { try { return json.writeValueAsString(new ObjectNode(json.getNodeFactory(), fields)); } catch (final JsonProcessingException e) { throw new RuntimeException(e); } } } }