// Path: RosettaCore/src/main/java/com/hubspot/rosetta/Rosetta.java
// public enum Rosetta {
//   INSTANCE;
// 
//   private static final List<Module> MODULES = new CopyOnWriteArrayList<Module>(defaultModules());
//   private static final AtomicReference<ObjectMapper> MAPPER = new AtomicReference<ObjectMapper>(cloneAndCustomize(new ObjectMapper()));
// 
//   public static ObjectMapper getMapper() {
//     return INSTANCE.get();
//   }
// 
//   /**
//    * @deprecated To customize the ObjectMapper, use {@link com.hubspot.rosetta.jdbi.RosettaObjectMapperOverride}.
//    */
//   @Deprecated
//   public static void addModule(Module module) {
//     INSTANCE.add(module);
//   }
// 
//   /**
//    * @deprecated To customize the ObjectMapper, use {@link com.hubspot.rosetta.jdbi.RosettaObjectMapperOverride}.
//    */
//   @Deprecated
//   public static void setMapper(ObjectMapper mapper) {
//     INSTANCE.set(mapper);
//   }
// 
//   public static ObjectMapper cloneAndCustomize(ObjectMapper mapper) {
//     mapper = mapper.copy();
// 
//     // ObjectMapper#registerModules doesn't exist in 2.1.x
//     for (Module module : MODULES) {
//       mapper.registerModule(module);
//     }
// 
//     return mapper;
//   }
// 
//   private ObjectMapper get() {
//     return MAPPER.get();
//   }
// 
//   private void set(ObjectMapper mapper) {
//     MAPPER.set(cloneAndCustomize(mapper));
//   }
// 
//   private void add(Module module) {
//     MODULES.add(module);
//     MAPPER.get().registerModule(module);
//   }
// 
//   private static List<Module> defaultModules() {
//     List<Module> defaultModules = new ArrayList<Module>();
//     defaultModules.add(new RosettaModule());
// 
//     for (Module module : ServiceLoader.load(AutoDiscoveredModule.class)) {
//       defaultModules.add(module);
//     }
// 
//     for (Module module : ServiceLoader.load(Module.class)) {
//       defaultModules.add(module);
//     }
// 
//     return defaultModules;
//   }
// }
// 
// Path: RosettaCore/src/main/java/com/hubspot/rosetta/internal/RosettaModule.java
// @SuppressWarnings("serial")
// public class RosettaModule extends Module {
// 
//   @Override
//   public String getModuleName() {
//     return "RosettaModule";
//   }
// 
//   @Override
//   public Version version() {
//     return Version.unknownVersion();
//   }
// 
//   @Override
//   public void setupModule(SetupContext context) {
//     context.addBeanSerializerModifier(new StoredAsJsonBeanSerializerModifier());
// 
//     ObjectCodec codec = context.getOwner();
//     if (codec instanceof ObjectMapper) {
//       ObjectMapper mapper = (ObjectMapper) codec;
// 
//       context.insertAnnotationIntrospector(new RosettaAnnotationIntrospector(mapper));
// 
//       mapper.setSerializerProvider(new DefaultSerializerProvider.Impl());
//       mapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
//       mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//       mapper.setSerializationInclusion(Include.ALWAYS);
//     }
//   }
// }


import org.skife.jdbi.v2.DBI;
import org.skife.jdbi.v2.Handle;
import org.skife.jdbi.v2.IDBI;
import org.skife.jdbi.v2.SQLStatement;
import org.skife.jdbi.v2.StatementContext;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.hubspot.rosetta.Rosetta;
import com.hubspot.rosetta.internal.RosettaModule;
package com.hubspot.rosetta.jdbi;



public class RosettaObjectMapperOverride {
  public static final String ATTRIBUTE_NAME = "_rosetta_object_mapper";

  private final ObjectMapper objectMapper;

  public RosettaObjectMapperOverride(ObjectMapper objectMapper) {
    this.objectMapper = objectMapper.copy().registerModule(new RosettaModule());
  }

  public void override(DBI dbi) {
    override((IDBI) dbi);
  }

  public void override(IDBI dbi) {
    dbi.define(ATTRIBUTE_NAME, objectMapper);
  }

  public void override(Handle handle) {
    handle.define(ATTRIBUTE_NAME, objectMapper);
  }

  public void override(SQLStatement<?> statement) {
    statement.define(ATTRIBUTE_NAME, objectMapper);
  }

  public static ObjectMapper resolve(StatementContext context) {
    Object override = context.getAttribute(ATTRIBUTE_NAME);
// Path: RosettaCore/src/main/java/com/hubspot/rosetta/Rosetta.java
// public enum Rosetta {
//   INSTANCE;
// 
//   private static final List<Module> MODULES = new CopyOnWriteArrayList<Module>(defaultModules());
//   private static final AtomicReference<ObjectMapper> MAPPER = new AtomicReference<ObjectMapper>(cloneAndCustomize(new ObjectMapper()));
// 
//   public static ObjectMapper getMapper() {
//     return INSTANCE.get();
//   }
// 
//   /**
//    * @deprecated To customize the ObjectMapper, use {@link com.hubspot.rosetta.jdbi.RosettaObjectMapperOverride}.
//    */
//   @Deprecated
//   public static void addModule(Module module) {
//     INSTANCE.add(module);
//   }
// 
//   /**
//    * @deprecated To customize the ObjectMapper, use {@link com.hubspot.rosetta.jdbi.RosettaObjectMapperOverride}.
//    */
//   @Deprecated
//   public static void setMapper(ObjectMapper mapper) {
//     INSTANCE.set(mapper);
//   }
// 
//   public static ObjectMapper cloneAndCustomize(ObjectMapper mapper) {
//     mapper = mapper.copy();
// 
//     // ObjectMapper#registerModules doesn't exist in 2.1.x
//     for (Module module : MODULES) {
//       mapper.registerModule(module);
//     }
// 
//     return mapper;
//   }
// 
//   private ObjectMapper get() {
//     return MAPPER.get();
//   }
// 
//   private void set(ObjectMapper mapper) {
//     MAPPER.set(cloneAndCustomize(mapper));
//   }
// 
//   private void add(Module module) {
//     MODULES.add(module);
//     MAPPER.get().registerModule(module);
//   }
// 
//   private static List<Module> defaultModules() {
//     List<Module> defaultModules = new ArrayList<Module>();
//     defaultModules.add(new RosettaModule());
// 
//     for (Module module : ServiceLoader.load(AutoDiscoveredModule.class)) {
//       defaultModules.add(module);
//     }
// 
//     for (Module module : ServiceLoader.load(Module.class)) {
//       defaultModules.add(module);
//     }
// 
//     return defaultModules;
//   }
// }
// 
// Path: RosettaCore/src/main/java/com/hubspot/rosetta/internal/RosettaModule.java
// @SuppressWarnings("serial")
// public class RosettaModule extends Module {
// 
//   @Override
//   public String getModuleName() {
//     return "RosettaModule";
//   }
// 
//   @Override
//   public Version version() {
//     return Version.unknownVersion();
//   }
// 
//   @Override
//   public void setupModule(SetupContext context) {
//     context.addBeanSerializerModifier(new StoredAsJsonBeanSerializerModifier());
// 
//     ObjectCodec codec = context.getOwner();
//     if (codec instanceof ObjectMapper) {
//       ObjectMapper mapper = (ObjectMapper) codec;
// 
//       context.insertAnnotationIntrospector(new RosettaAnnotationIntrospector(mapper));
// 
//       mapper.setSerializerProvider(new DefaultSerializerProvider.Impl());
//       mapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
//       mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//       mapper.setSerializationInclusion(Include.ALWAYS);
//     }
//   }
// }


// Path: RosettaJdbi/src/main/java/com/hubspot/rosetta/jdbi/RosettaObjectMapperOverride.java
import org.skife.jdbi.v2.DBI;
import org.skife.jdbi.v2.Handle;
import org.skife.jdbi.v2.IDBI;
import org.skife.jdbi.v2.SQLStatement;
import org.skife.jdbi.v2.StatementContext;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.hubspot.rosetta.Rosetta;
import com.hubspot.rosetta.internal.RosettaModule;

package com.hubspot.rosetta.jdbi;



public class RosettaObjectMapperOverride {
  public static final String ATTRIBUTE_NAME = "_rosetta_object_mapper";

  private final ObjectMapper objectMapper;

  public RosettaObjectMapperOverride(ObjectMapper objectMapper) {
    this.objectMapper = objectMapper.copy().registerModule(new RosettaModule());
  }

  public void override(DBI dbi) {
    override((IDBI) dbi);
  }

  public void override(IDBI dbi) {
    dbi.define(ATTRIBUTE_NAME, objectMapper);
  }

  public void override(Handle handle) {
    handle.define(ATTRIBUTE_NAME, objectMapper);
  }

  public void override(SQLStatement<?> statement) {
    statement.define(ATTRIBUTE_NAME, objectMapper);
  }

  public static ObjectMapper resolve(StatementContext context) {
    Object override = context.getAttribute(ATTRIBUTE_NAME);
    return override == null ? Rosetta.getMapper() : (ObjectMapper) override;