From 1f1868fdd3bb558963cb290b42941ddae70bf482 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Thu, 15 Oct 2020 22:04:36 +1300 Subject: [PATCH] #2079 - Refactor to make Jackson core an optional dependency --- ebean-api/pom.xml | 5 +- .../java/io/ebean/config/ClassLoadConfig.java | 4 ++ ebean-core/pom.xml | 6 +- .../server/core/InternalConfiguration.java | 46 ++++----------- .../server/deploy/BeanDescriptor.java | 10 +++- .../server/deploy/BeanDescriptorManager.java | 56 ++++--------------- .../server/deploy/BeanDescriptorMap.java | 5 ++ .../server/deploy/BeanPropertyAssocMany.java | 2 +- ebean-test/pom.xml | 11 ++++ 9 files changed, 57 insertions(+), 88 deletions(-) diff --git a/ebean-api/pom.xml b/ebean-api/pom.xml index 6fa586dc4..e05ea5fd5 100644 --- a/ebean-api/pom.xml +++ b/ebean-api/pom.xml @@ -10,8 +10,8 @@ ebean-api - 2.10.0 - 2.10.0 + 2.11.3 + 2.11.3 @@ -79,6 +79,7 @@ com.fasterxml.jackson.core jackson-core ${jackson-core.version} + true diff --git a/ebean-api/src/main/java/io/ebean/config/ClassLoadConfig.java b/ebean-api/src/main/java/io/ebean/config/ClassLoadConfig.java index 78f5c903e..3c3648193 100644 --- a/ebean-api/src/main/java/io/ebean/config/ClassLoadConfig.java +++ b/ebean-api/src/main/java/io/ebean/config/ClassLoadConfig.java @@ -69,6 +69,10 @@ public class ClassLoadConfig { return isPresent("com.fasterxml.jackson.annotation.JsonIgnore"); } + public boolean isJacksonCorePresent() { + return isPresent("com.fasterxml.jackson.core.JsonParser"); + } + /** * Return true if Jackson ObjectMapper is present. */ diff --git a/ebean-core/pom.xml b/ebean-core/pom.xml index dab004ab6..9c1af0b92 100644 --- a/ebean-core/pom.xml +++ b/ebean-core/pom.xml @@ -18,8 +18,8 @@ - 2.10.0 - 2.10.0 + 2.11.3 + 2.11.3 @@ -131,9 +131,9 @@ com.fasterxml.jackson.core jackson-core ${jackson-core.version} + true - com.fasterxml.jackson.core jackson-databind diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java index c1f392c2b..56ea7589a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/InternalConfiguration.java @@ -118,69 +118,41 @@ public class InternalConfiguration { private static final Logger logger = LoggerFactory.getLogger(InternalConfiguration.class); private final TableModState tableModState; - private final boolean online; - private final DatabaseConfig config; - private final BootupClasses bootupClasses; - private final DatabasePlatform databasePlatform; - private final DeployInherit deployInherit; - private final TypeManager typeManager; - private final DtoBeanManager dtoBeanManager; - private final ClockService clockService; - private final DataTimeZone dataTimeZone; - private final Binder binder; - private final DeployCreateProperties deployCreateProperties; - private final DeployUtil deployUtil; - private final BeanDescriptorManager beanDescriptorManager; - private final CQueryEngine cQueryEngine; - private final ClusterManager clusterManager; - private final SpiCacheManager cacheManager; - private final ServerCachePlugin serverCachePlugin; - - private ServerCacheNotify cacheNotify; - - private boolean localL2Caching; - + private final boolean jacksonCorePresent; private final ExpressionFactory expressionFactory; - private final SpiBackgroundExecutor backgroundExecutor; - private final JsonFactory jsonFactory; - private final DocStoreFactory docStoreFactory; - - /** - * List of plugins (that ultimately the DefaultServer configures late in construction). - */ private final List plugins = new ArrayList<>(); - private final MultiValueBind multiValueBind; - private final SpiLogManager logManager; - private final ExtraMetrics extraMetrics = new ExtraMetrics(); + private ServerCacheNotify cacheNotify; + private boolean localL2Caching; InternalConfiguration(boolean online, ClusterManager clusterManager, SpiBackgroundExecutor backgroundExecutor, DatabaseConfig config, BootupClasses bootupClasses) { this.online = online; this.config = config; + this.jacksonCorePresent = config.getClassLoadConfig().isJacksonCorePresent(); this.clockService = new ClockService(config.getClock()); this.tableModState = new TableModState(); this.logManager = initLogManager(); @@ -210,6 +182,10 @@ public class InternalConfiguration { this.cQueryEngine = new CQueryEngine(config, databasePlatform, binder, asOfTableMapping, draftTableMap); } + public boolean isJacksonCorePresent() { + return jacksonCorePresent; + } + private InternalConfigXmlMap initExternalMapping() { final List xmEbeans = readExternalMapping(); return new InternalConfigXmlMap(xmEbeans, config.getClassLoadConfig().getClassLoader()); @@ -307,7 +283,7 @@ public class InternalConfiguration { * Return the ChangeLogListener to use with a default implementation if none defined. */ public ChangeLogListener changeLogListener(ChangeLogListener listener) { - return plugin((listener != null) ? listener : new DefaultChangeLogListener()); + return plugin((listener != null) ? listener : jacksonCorePresent ? new DefaultChangeLogListener() : null); } /** @@ -315,7 +291,7 @@ public class InternalConfiguration { */ ReadAuditLogger getReadAuditLogger() { ReadAuditLogger found = bootupClasses.getReadAuditLogger(); - return plugin(found != null ? found : new DefaultReadAuditLogger()); + return plugin(found != null ? found : jacksonCorePresent? new DefaultReadAuditLogger(): null); } /** @@ -356,7 +332,7 @@ public class InternalConfiguration { } SpiJsonContext createJsonContext(SpiEbeanServer server) { - return new DJsonContext(server, jsonFactory, typeManager); + return jacksonCorePresent ? new DJsonContext(server, jsonFactory, typeManager) : null; } AutoTuneService createAutoTuneService(SpiEbeanServer server) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index 6c0f6f0b2..218e57a3c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -432,7 +432,7 @@ public class BeanDescriptor implements BeanType, STreeType { boolean noRelationships = propertiesOne.length + propertiesMany.length == 0; this.cacheSharableBeans = noRelationships && deploy.getCacheOptions().isReadOnly(); this.cacheHelp = new BeanDescriptorCacheHelp<>(this, owner.getCacheManager(), deploy.getCacheOptions(), cacheSharableBeans, propertiesOneImported); - this.jsonHelp = new BeanDescriptorJsonHelp<>(this); + this.jsonHelp = initJsonHelp(); this.draftHelp = new BeanDescriptorDraftHelp<>(this); this.docStoreAdapter = owner.createDocStoreBeanAdapter(this, deploy); this.docStoreQueueId = docStoreAdapter.getQueueId(); @@ -469,6 +469,14 @@ public class BeanDescriptor implements BeanType, STreeType { } } + public boolean isJacksonCorePresent() { + return owner.isJacksonCorePresent(); + } + + private BeanDescriptorJsonHelp initJsonHelp() { + return isJacksonCorePresent() ? new BeanDescriptorJsonHelp<>(this) : null; + } + /** * Return true if the bean should be treated as a reference bean when it only has its id populated. * To be true it has other scalar properties that are not generated on insert. diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java index 7102a4bc0..33722793a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorManager.java @@ -95,87 +95,47 @@ public class BeanDescriptorManager implements BeanDescriptorMap { private static final BeanDescComparator beanDescComparator = new BeanDescComparator(); private final ReadAnnotations readAnnotations; - private final TransientProperties transientProperties; - - /** - * Helper to derive inheritance information. - */ private final DeployInherit deplyInherit; - private final BeanPropertyAccess beanPropertyAccess = new EnhanceBeanPropertyAccess(); - private final DeployUtil deployUtil; - private final PersistControllerManager persistControllerManager; - private final PostLoadManager postLoadManager; - private final PostConstructManager postConstructManager; - private final BeanFinderManager beanFinderManager; - private final PersistListenerManager persistListenerManager; - private final BeanQueryAdapterManager beanQueryAdapterManager; - private final NamingConvention namingConvention; - private final DeployCreateProperties createProperties; - private final BeanManagerFactory beanManagerFactory; - private final DatabaseConfig config; - private final ChangeLogListener changeLogListener; - private final ChangeLogRegister changeLogRegister; - private final ChangeLogPrepare changeLogPrepare; - private final DocStoreFactory docStoreFactory; - private final MultiValueBind multiValueBind; - private final TypeManager typeManager; - - private int entityBeanCount; - private final BootupClasses bootupClasses; - private final String serverName; - private final Map, BeanTable> beanTableMap = new HashMap<>(); - private final Map> descMap = new HashMap<>(); - private final Map> descQueueMap = new HashMap<>(); - private final Map> beanManagerMap = new HashMap<>(); - private final Map>> tableToDescMap = new HashMap<>(); - private final Map>> tableToViewDescMap = new HashMap<>(); - - private List> immutableDescriptorList; - private final DbIdentity dbIdentity; - private final DataSource dataSource; - private final DatabasePlatform databasePlatform; - private final SpiCacheManager cacheManager; - private final BackgroundExecutor backgroundExecutor; - private final EncryptKeyManager encryptKeyManager; - private final IdBinderFactory idBinderFactory; - private final BeanLifecycleAdapterFactory beanLifecycleAdapterFactory; - private final String asOfViewSuffix; + private final boolean jacksonCorePresent; + private final int queryPlanTTLSeconds; + private int entityBeanCount; + private List> immutableDescriptorList; /** * Map of base tables to 'with history views' used to support 'as of' queries. @@ -187,8 +147,6 @@ public class BeanDescriptorManager implements BeanDescriptorMap { */ private final Map draftTableMap = new HashMap<>(); - private final int queryPlanTTLSeconds; - // temporary collections used during startup and then cleared private Map, DeployBeanInfo> deployInfoMap = new HashMap<>(); @@ -232,6 +190,12 @@ public class BeanDescriptorManager implements BeanDescriptorMap { this.changeLogPrepare = config.changeLogPrepare(bootupClasses.getChangeLogPrepare()); this.changeLogListener = config.changeLogListener(bootupClasses.getChangeLogListener()); this.changeLogRegister = config.changeLogRegister(bootupClasses.getChangeLogRegister()); + this.jacksonCorePresent = config.isJacksonCorePresent(); + } + + @Override + public boolean isJacksonCorePresent() { + return jacksonCorePresent; } /** diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorMap.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorMap.java index dc473b098..1ff397f0a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorMap.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorMap.java @@ -71,4 +71,9 @@ public interface BeanDescriptorMap { * Return the scalarType for the given logical type. */ ScalarType getScalarType(String cast); + + /** + * Return true if Jackson core is present on the classpath. + */ + boolean isJacksonCorePresent(); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java index f20d4b9b3..8b98e1679 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java @@ -144,7 +144,7 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc implements ST } this.inverseJoin = deploy.createInverseTableJoin(); this.modifyListenMode = deploy.getModifyListenMode(); - this.jsonHelp = new BeanPropertyAssocManyJsonHelp(this); + this.jsonHelp = descriptor.isJacksonCorePresent() ? new BeanPropertyAssocManyJsonHelp(this) : null; } @Override diff --git a/ebean-test/pom.xml b/ebean-test/pom.xml index 6abe6439d..46a3c120a 100644 --- a/ebean-test/pom.xml +++ b/ebean-test/pom.xml @@ -9,6 +9,10 @@ ebean-test + + 2.11.3 + + @@ -31,6 +35,13 @@ 12.5.1-SNAPSHOT + + com.fasterxml.jackson.core + jackson-databind + ${jackson-databind.version} + true + + io.ebean.test ebean-test-docker