/* * 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; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.spotify.heroic.aggregation.Aggregation; import com.spotify.heroic.aggregation.AggregationInstance; import com.spotify.heroic.analytics.AnalyticsModule; import com.spotify.heroic.cluster.ClusterDiscoveryModule; import com.spotify.heroic.cluster.RpcProtocolModule; import com.spotify.heroic.common.Duration; import com.spotify.heroic.common.DurationSerialization; import com.spotify.heroic.common.Groups; import com.spotify.heroic.common.GroupsSerialization; import com.spotify.heroic.common.TypeNameMixin; import com.spotify.heroic.consumer.ConsumerModule; import com.spotify.heroic.filter.FilterRegistry; import com.spotify.heroic.generator.MetadataGenerator; import com.spotify.heroic.generator.MetricGeneratorModule; import com.spotify.heroic.grammar.QueryParser; import com.spotify.heroic.metadata.MetadataModule; import com.spotify.heroic.metric.Event; import com.spotify.heroic.metric.EventSerialization; import com.spotify.heroic.metric.MetricCollection; import com.spotify.heroic.metric.MetricCollectionSerialization; import com.spotify.heroic.metric.MetricGroup; import com.spotify.heroic.metric.MetricGroupSerialization; import com.spotify.heroic.metric.MetricModule; import com.spotify.heroic.metric.MetricType; import com.spotify.heroic.metric.MetricTypeSerialization; import com.spotify.heroic.metric.Point; import com.spotify.heroic.metric.PointSerialization; import com.spotify.heroic.metric.Spread; import com.spotify.heroic.metric.SpreadSerialization; import com.spotify.heroic.querylogging.QueryLoggingModule; import com.spotify.heroic.statistics.StatisticsModule; import com.spotify.heroic.suggest.SuggestModule; /** * Contains factories for setting up ObjectMapper's for different purposes in Heroic. * * @author udoprog */ public final class HeroicMappers { public static final String APPLICATION_JSON_INTERNAL = "application/json+internal"; public static final String APPLICATION_JSON = "application/json"; public static final String APPLICATION_HEROIC_CONFIG = "application/heroic-config"; /** * Setup the ObjectMapper used to deserialize configuration files. * * @return */ public static ObjectMapper config() { final ObjectMapper m = new ObjectMapper(new YAMLFactory()); m.addMixIn(ClusterDiscoveryModule.class, TypeNameMixin.class); m.addMixIn(RpcProtocolModule.class, TypeNameMixin.class); m.addMixIn(ConsumerModule.Builder.class, TypeNameMixin.class); m.addMixIn(MetadataModule.class, TypeNameMixin.class); m.addMixIn(SuggestModule.class, TypeNameMixin.class); m.addMixIn(MetricModule.class, TypeNameMixin.class); m.addMixIn(MetricGeneratorModule.class, TypeNameMixin.class); m.addMixIn(MetadataGenerator.class, TypeNameMixin.class); m.addMixIn(AnalyticsModule.Builder.class, TypeNameMixin.class); m.addMixIn(StatisticsModule.class, TypeNameMixin.class); m.addMixIn(QueryLoggingModule.class, TypeNameMixin.class); m.registerModule(commonSerializers()); /* support Optional */ m.registerModule(new Jdk8Module()); return m; } public static ObjectMapper json(final QueryParser parser) { final ObjectMapper mapper = new ObjectMapper(); mapper.addMixIn(AggregationInstance.class, TypeNameMixin.class); mapper.addMixIn(Aggregation.class, TypeNameMixin.class); mapper.registerModule(new Jdk8Module().configureAbsentsAsNulls(true)); mapper.registerModule(commonSerializers()); mapper.registerModule(jsonSerializers()); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); mapper.registerModule(FilterRegistry.registry().module(parser)); return mapper; } public static Module commonSerializers() { final SimpleModule serializers = new SimpleModule("common"); serializers.addDeserializer(Duration.class, new DurationSerialization.Deserializer()); serializers.addDeserializer(Groups.class, new GroupsSerialization.Deserializer()); return serializers; } public static SimpleModule jsonSerializers() { final SimpleModule module = new SimpleModule("serializers"); module.addSerializer(Point.class, new PointSerialization.Serializer()); module.addDeserializer(Point.class, new PointSerialization.Deserializer()); module.addSerializer(Event.class, new EventSerialization.Serializer()); module.addDeserializer(Event.class, new EventSerialization.Deserializer()); module.addSerializer(Spread.class, new SpreadSerialization.Serializer()); module.addDeserializer(Spread.class, new SpreadSerialization.Deserializer()); module.addSerializer(MetricGroup.class, new MetricGroupSerialization.Serializer()); module.addDeserializer(MetricGroup.class, new MetricGroupSerialization.Deserializer()); module.addSerializer(MetricCollection.class, new MetricCollectionSerialization.Serializer()); module.addDeserializer(MetricCollection.class, new MetricCollectionSerialization.Deserializer()); module.addSerializer(MetricType.class, new MetricTypeSerialization.Serializer()); module.addDeserializer(MetricType.class, new MetricTypeSerialization.Deserializer()); return module; } }