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

com.hubspot.singularity.data.transcoders.SingularityJsonTranscoderBinder Maven / Gradle / Ivy

package com.hubspot.singularity.data.transcoders;

import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.reflect.TypeParameter;
import com.google.common.reflect.TypeToken;
import com.google.inject.Binder;
import com.google.inject.Inject;
import com.google.inject.Key;
import com.google.inject.Provider;
import com.google.inject.Scopes;
import com.hubspot.singularity.Singularity;
import com.hubspot.singularity.SingularityId;
import com.hubspot.singularity.config.SingularityConfiguration;

@SuppressWarnings("serial")
public final class SingularityJsonTranscoderBinder {

  public static  SingularityJsonTranscoderBinder bindTranscoder(Binder binder) {
    return new SingularityJsonTranscoderBinder(binder);
  }

  private final Binder binder;

  public SingularityJsonTranscoderBinder(Binder binder) {
    this.binder = binder;
  }

  public  void asJson(Class clazz) {
    TypeToken> typeToken = new TypeToken>() {}
    .where(new TypeParameter() {}, clazz);
    @SuppressWarnings("unchecked")
    Key> key = (Key>) Key.get(typeToken.getType());
    binder
      .bind(key)
      .toProvider(new JsonTranscoderProvider(clazz))
      .in(Scopes.SINGLETON);
  }

  public  void asCompressedJson(Class clazz) {
    TypeToken> typeToken = new TypeToken>() {}
    .where(new TypeParameter() {}, clazz);
    @SuppressWarnings("unchecked")
    Key> key = (Key>) Key.get(typeToken.getType());
    binder
      .bind(key)
      .toProvider(new CompressingJsonTranscoderProvider(clazz))
      .in(Scopes.SINGLETON);
  }

  public  void asSingularityId(Class clazz) {
    TypeToken> typeToken = new TypeToken>() {}
    .where(new TypeParameter() {}, clazz);
    @SuppressWarnings("unchecked")
    Key> key = (Key>) Key.get(typeToken.getType());
    binder.bind(key).toInstance(new IdTranscoder(clazz));
  }

  static class JsonTranscoderProvider implements Provider> {
    private final Class clazz;
    private ObjectMapper objectMapper;

    JsonTranscoderProvider(Class clazz) {
      this.clazz = clazz;
    }

    @Inject
    void inject(@Singularity ObjectMapper objectMapper) {
      this.objectMapper = checkNotNull(objectMapper, "objectMapper is null");
    }

    @Override
    public JsonTranscoder get() {
      checkState(objectMapper != null, "objectMapper was never injected!");

      return new JsonTranscoder(objectMapper, clazz);
    }
  }

  static class CompressingJsonTranscoderProvider
    implements Provider> {
    private final Class clazz;
    private ObjectMapper objectMapper;
    private SingularityConfiguration singularityConfiguration;

    CompressingJsonTranscoderProvider(Class clazz) {
      this.clazz = clazz;
    }

    @Inject
    void inject(
      @Singularity ObjectMapper objectMapper,
      SingularityConfiguration singularityConfiguration
    ) {
      this.objectMapper = checkNotNull(objectMapper, "objectMapper is null");
      this.singularityConfiguration =
        checkNotNull(singularityConfiguration, "singularityConfiguration is null");
    }

    @Override
    public CompressingJsonTranscoder get() {
      checkState(objectMapper != null, "objectMapper was never injected!");
      checkState(
        singularityConfiguration != null,
        "singularityConfiguration was never injected!"
      );

      return new CompressingJsonTranscoder(
        singularityConfiguration,
        objectMapper,
        clazz
      );
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy