@Test public void testBuildWithModules_manyWithAll() { doModuleSetup(moduleA, "moduleA"); doModuleSetup(moduleB, "moduleB"); doModuleSetup(moduleC, "moduleC"); ConfiguredObjectMapper result1 = builder .addRegisteredModules(ImmutableList.of(moduleA, moduleB)) .addRegisteredModules(ImmutableList.of(moduleC)) .build(); Mockito.verify(moduleA, atLeastOnce()).setupModule(any(SetupContext.class)); Mockito.verify(moduleB, atLeastOnce()).setupModule(any(SetupContext.class)); Mockito.verify(moduleC, atLeastOnce()).setupModule(any(SetupContext.class)); assertEquals(1, cache.size()); ConfiguredObjectMapper result2 = builder .addRegisteredModules(ImmutableList.of(moduleA, moduleB, moduleC)) .build(); assertEquals(1, cache.size()); assertSame(result1, result2); }
@Test public void testEviction() { doModuleSetup(moduleA, "moduleA"); builder = new ConfiguredObjectMapper.Builder(cache, 1); builder.addRegisteredModules(ImmutableList.of(moduleA)).build(); assertEquals(1, cache.size()); Mockito.verify(moduleA, atLeastOnce()).setupModule(any(SetupContext.class)); Mockito.reset(); cache = Maps.newLinkedHashMap(); doModuleSetup(moduleB, "moduleB"); doModuleSetup(moduleA, "moduleA"); // Evict the other entries new ConfiguredObjectMapper.Builder(cache, 1) .addRegisteredModules(ImmutableList.of(moduleB)) .build(); // Now this is a miss new ConfiguredObjectMapper.Builder(cache, 1) .addRegisteredModules(ImmutableList.of(moduleA)) .build(); assertEquals(1, cache.size()); Mockito.verify(moduleA, atLeastOnce()).setupModule(any(SetupContext.class)); Mockito.verify(moduleB, atLeastOnce()).setupModule(any(SetupContext.class)); Mockito.reset(); }
@Test public void testBuildWithModules_oneWithAll() { doModuleSetup(moduleA, "moduleA"); doModuleSetup(moduleB, "moduleB"); doModuleSetup(moduleC, "moduleC"); builder.addRegisteredModules(ImmutableList.of(moduleA, moduleB, moduleC)).build(); Mockito.verify(moduleA, atLeastOnce()).setupModule(any(SetupContext.class)); Mockito.verify(moduleB, atLeastOnce()).setupModule(any(SetupContext.class)); Mockito.verify(moduleC, atLeastOnce()).setupModule(any(SetupContext.class)); assertEquals(1, cache.size()); }
public void setupModule(Module.SetupContext paramSetupContext) { if (this._serializers != null) paramSetupContext.addSerializers(this._serializers); if (this._deserializers != null) paramSetupContext.addDeserializers(this._deserializers); if (this._keySerializers != null) paramSetupContext.addKeySerializers(this._keySerializers); if (this._keyDeserializers != null) paramSetupContext.addKeyDeserializers(this._keyDeserializers); if (this._abstractTypes != null) paramSetupContext.addAbstractTypeResolver(this._abstractTypes); if (this._valueInstantiators != null) paramSetupContext.addValueInstantiators(this._valueInstantiators); if (this._deserializerModifier != null) paramSetupContext.addBeanDeserializerModifier(this._deserializerModifier); if (this._serializerModifier != null) paramSetupContext.addBeanSerializerModifier(this._serializerModifier); if ((this._subtypes != null) && (this._subtypes.size() > 0)) paramSetupContext.registerSubtypes((NamedType[])this._subtypes.toArray(new NamedType[this._subtypes.size()])); if (this._mixins != null) { Iterator localIterator = this._mixins.entrySet().iterator(); while (localIterator.hasNext()) { Map.Entry localEntry = (Map.Entry)localIterator.next(); paramSetupContext.setMixInAnnotations((Class)localEntry.getKey(), (Class)localEntry.getValue()); } } }
void setupModule(final SetupContext context, final boolean includeStacktrace, final boolean stacktraceAsString) { // JRE classes: we cannot edit those with Jackson annotations context.setMixInAnnotations(StackTraceElement.class, StackTraceElementMixIn.class); // Log4j API classes: we do not want to edit those with Jackson annotations because the API module should not depend on Jackson. context.setMixInAnnotations(Marker.class, MarkerMixIn.class); context.setMixInAnnotations(Level.class, LevelMixIn.class); context.setMixInAnnotations(Instant.class, InstantMixIn.class); context.setMixInAnnotations(LogEvent.class, LogEventWithContextListMixIn.class); // Log4j Core classes: we do not want to bring in Jackson at runtime if we do not have to. context.setMixInAnnotations(ExtendedStackTraceElement.class, ExtendedStackTraceElementMixIn.class); context.setMixInAnnotations(ThrowableProxy.class, includeStacktrace ? (stacktraceAsString ? ThrowableProxyWithStacktraceAsStringMixIn.class : ThrowableProxyMixIn.class ) : ThrowableProxyWithoutStacktraceMixIn.class); }
void setupModule(final SetupContext context, final boolean includeStacktrace, final boolean stacktraceAsString) { // JRE classes: we cannot edit those with Jackson annotations context.setMixInAnnotations(StackTraceElement.class, StackTraceElementMixIn.class); // Log4j API classes: we do not want to edit those with Jackson annotations because the API module should not depend on Jackson. context.setMixInAnnotations(Marker.class, MarkerMixIn.class); context.setMixInAnnotations(Level.class, LevelMixIn.class); context.setMixInAnnotations(Instant.class, InstantMixIn.class); context.setMixInAnnotations(LogEvent.class, LogEventJsonMixIn.class); // different ThreadContext handling // Log4j Core classes: we do not want to bring in Jackson at runtime if we do not have to. context.setMixInAnnotations(ExtendedStackTraceElement.class, ExtendedStackTraceElementMixIn.class); context.setMixInAnnotations(ThrowableProxy.class, includeStacktrace ? (stacktraceAsString ? ThrowableProxyWithStacktraceAsStringMixIn.class : ThrowableProxyMixIn.class ) : ThrowableProxyWithoutStacktraceMixIn.class); }