From a6f5ab8074800f847f3a39d57fbb5badf46239ff Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Fri, 9 Oct 2020 18:02:40 +1300 Subject: [PATCH] Refactor internals - move DbOffline, split VisitAllUsing into VisitProperties --- .../{dbmigration => api}/DbOffline.java | 2 +- .../dbmigration/DefaultDbMigration.java | 1 + .../model/build/ModelBuildElementTable.java | 4 +- .../build/ModelBuildPropertyVisitor.java | 2 +- .../model/visitor/VisitAllUsing.java | 121 +----------------- .../server/core/DatabasePlatformFactory.java | 2 +- .../server/core/DefaultContainer.java | 2 +- .../server/core/InternalConfiguration.java | 2 +- .../deploy/BeanPropertyAssocManySqlHelp.java | 6 +- .../visitor/BaseTablePropertyVisitor.java | 2 +- .../deploy}/visitor/BeanPropertyVisitor.java | 2 +- .../deploy/visitor/VisitProperties.java | 116 +++++++++++++++++ .../server/type/DefaultTypeManager.java | 2 +- .../dbmigration/DbMigrationSqlServerTest.java | 2 +- .../io/ebean/test/config/RunOnceMarker.java | 2 +- 15 files changed, 137 insertions(+), 131 deletions(-) rename ebean-core/src/main/java/io/ebeaninternal/{dbmigration => api}/DbOffline.java (98%) rename ebean-core/src/main/java/io/ebeaninternal/{dbmigration/model => server/deploy}/visitor/BaseTablePropertyVisitor.java (95%) rename ebean-core/src/main/java/io/ebeaninternal/{dbmigration/model => server/deploy}/visitor/BeanPropertyVisitor.java (95%) create mode 100644 ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/VisitProperties.java diff --git a/ebean-core/src/main/java/io/ebeaninternal/dbmigration/DbOffline.java b/ebean-core/src/main/java/io/ebeaninternal/api/DbOffline.java similarity index 98% rename from ebean-core/src/main/java/io/ebeaninternal/dbmigration/DbOffline.java rename to ebean-core/src/main/java/io/ebeaninternal/api/DbOffline.java index 2d0dfa1b3..3c5ca5a7b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/dbmigration/DbOffline.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/DbOffline.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.dbmigration; +package io.ebeaninternal.api; import io.ebean.annotation.Platform; import org.slf4j.Logger; diff --git a/ebean-core/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java b/ebean-core/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java index 8557c2cee..7fd496b22 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java +++ b/ebean-core/src/main/java/io/ebeaninternal/dbmigration/DefaultDbMigration.java @@ -29,6 +29,7 @@ import io.ebean.config.dbplatform.sqlserver.SqlServer16Platform; import io.ebean.config.dbplatform.sqlserver.SqlServer17Platform; import io.ebean.dbmigration.DbMigration; import io.ebean.migration.MigrationVersion; +import io.ebeaninternal.api.DbOffline; import io.ebeaninternal.api.SpiEbeanServer; import io.ebeaninternal.dbmigration.ddlgeneration.DdlOptions; import io.ebeaninternal.dbmigration.ddlgeneration.DdlWrite; diff --git a/ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildElementTable.java b/ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildElementTable.java index 744250e5f..157145d7d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildElementTable.java +++ b/ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildElementTable.java @@ -1,7 +1,7 @@ package io.ebeaninternal.dbmigration.model.build; import io.ebeaninternal.dbmigration.model.MTable; -import io.ebeaninternal.dbmigration.model.visitor.VisitAllUsing; +import io.ebeaninternal.server.deploy.visitor.VisitProperties; import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.deploy.BeanPropertyAssocMany; import io.ebeaninternal.server.deploy.BeanTable; @@ -20,7 +20,7 @@ public class ModelBuildElementTable { BeanDescriptor targetDescriptor = manyProp.getTargetDescriptor(); MTable table = new MTable(beanTable.getBaseTable()); - VisitAllUsing.visitOne(targetDescriptor, new ModelBuildPropertyVisitor(ctx, table, targetDescriptor)); + VisitProperties.visit(targetDescriptor, new ModelBuildPropertyVisitor(ctx, table, targetDescriptor)); ctx.addTableElementCollection(table); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildPropertyVisitor.java b/ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildPropertyVisitor.java index 2d474883b..7b13cf581 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildPropertyVisitor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/build/ModelBuildPropertyVisitor.java @@ -7,7 +7,7 @@ import io.ebeaninternal.dbmigration.model.MCompoundForeignKey; import io.ebeaninternal.dbmigration.model.MCompoundUniqueConstraint; import io.ebeaninternal.dbmigration.model.MIndex; import io.ebeaninternal.dbmigration.model.MTable; -import io.ebeaninternal.dbmigration.model.visitor.BaseTablePropertyVisitor; +import io.ebeaninternal.server.deploy.visitor.BaseTablePropertyVisitor; import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.deploy.BeanProperty; import io.ebeaninternal.server.deploy.BeanPropertyAssocMany; diff --git a/ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/visitor/VisitAllUsing.java b/ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/visitor/VisitAllUsing.java index 2796dbd4e..6ffbe1fd4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/visitor/VisitAllUsing.java +++ b/ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/visitor/VisitAllUsing.java @@ -2,11 +2,8 @@ package io.ebeaninternal.dbmigration.model.visitor; import io.ebeaninternal.api.SpiEbeanServer; import io.ebeaninternal.server.deploy.BeanDescriptor; -import io.ebeaninternal.server.deploy.BeanProperty; -import io.ebeaninternal.server.deploy.BeanPropertyAssocMany; -import io.ebeaninternal.server.deploy.BeanPropertyAssocOne; -import io.ebeaninternal.server.deploy.InheritInfo; -import io.ebeaninternal.server.deploy.InheritInfoVisitor; +import io.ebeaninternal.server.deploy.visitor.BeanPropertyVisitor; +import io.ebeaninternal.server.deploy.visitor.VisitProperties; import java.util.List; @@ -14,25 +11,16 @@ import java.util.List; * Makes use of BeanVisitor and PropertyVisitor to navigate BeanDescriptors * and their properties. */ -public class VisitAllUsing { +public class VisitAllUsing extends VisitProperties { - /** - * Visit a single Descriptor using the given visitor. - */ - public static void visitOne(BeanDescriptor descriptor, BeanPropertyVisitor visitor) { + private final BeanVisitor visitor; - new VisitAllUsing().visitProperties(descriptor, visitor); - } - - protected final BeanVisitor visitor; - - protected final List> descriptors; + private final List> descriptors; /** * Visit all the descriptors for a given server. */ public VisitAllUsing(BeanVisitor visitor, SpiEbeanServer server) { - this(visitor, server.getBeanDescriptors()); } @@ -44,11 +32,6 @@ public class VisitAllUsing { this.descriptors = descriptors; } - private VisitAllUsing() { - this.visitor = null; - this.descriptors = null; - } - public void visitAllBeans() { for (BeanDescriptor desc : descriptors) { if (desc.isBaseTable()) { @@ -61,104 +44,10 @@ public class VisitAllUsing { * Visit the bean using a visitor. */ protected void visitBean(BeanDescriptor desc, BeanVisitor visitor) { - BeanPropertyVisitor propertyVisitor = visitor.visitBean(desc); if (propertyVisitor != null) { visitProperties(desc, propertyVisitor); } } - private void visitProperties(BeanDescriptor desc, BeanPropertyVisitor propertyVisitor) { - BeanProperty idProp = desc.getIdProperty(); - if (idProp != null) { - visit(propertyVisitor, idProp); - } - - BeanPropertyAssocOne unidirectional = desc.getUnidirectional(); - if (unidirectional != null) { - visit(propertyVisitor, unidirectional); - } - - BeanProperty[] propertiesNonTransient = desc.propertiesNonTransient(); - for (BeanProperty p : propertiesNonTransient) { - if (p.isDDLColumn()) { - visit(propertyVisitor, p); - } - } - - visitInheritanceProperties(desc, propertyVisitor); - propertyVisitor.visitEnd(); - } - - /** - * Visit the property. - */ - protected void visit(BeanPropertyVisitor pv, BeanProperty p) { - - if (p instanceof BeanPropertyAssocMany) { - // oneToMany or manyToMany - pv.visitMany((BeanPropertyAssocMany) p); - - } else if (p instanceof BeanPropertyAssocOne) { - BeanPropertyAssocOne assocOne = (BeanPropertyAssocOne) p; - if (assocOne.isEmbedded()) { - // Embedded bean - pv.visitEmbedded(assocOne); - BeanProperty[] embProps = assocOne.getProperties(); - for (BeanProperty embProp : embProps) { - pv.visitEmbeddedScalar(embProp, assocOne); - } - - } else if (assocOne.isOneToOneExported()) { - // associated one exported - pv.visitOneExported(assocOne); - - } else { - // associated one imported - pv.visitOneImported(assocOne); - } - - } else { - // simple scalar type - pv.visitScalar(p); - } - } - - - /** - * Visit all the other inheritance properties that are not on the root. - */ - protected void visitInheritanceProperties(BeanDescriptor descriptor, BeanPropertyVisitor pv) { - - InheritInfo inheritInfo = descriptor.getInheritInfo(); - if (inheritInfo != null && inheritInfo.isRoot()) { - // add all properties on the children objects - inheritInfo.visitChildren(new InheritChildVisitor(this, pv)); - } - } - - - /** - * Helper used to visit all the inheritInfo/BeanDescriptor in - * the inheritance hierarchy (to add their 'local' properties). - */ - protected static class InheritChildVisitor implements InheritInfoVisitor { - - private final VisitAllUsing owner; - private final BeanPropertyVisitor pv; - - protected InheritChildVisitor(VisitAllUsing owner, BeanPropertyVisitor pv) { - this.owner = owner; - this.pv = pv; - } - - @Override - public void visit(InheritInfo inheritInfo) { - for (BeanProperty beanProperty : inheritInfo.desc().propertiesLocal()) { - if (beanProperty.isDDLColumn()) { - owner.visit(pv, beanProperty); - } - } - } - } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java index 9210f5389..18c1051a0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DatabasePlatformFactory.java @@ -21,7 +21,7 @@ import io.ebean.config.dbplatform.sqlite.SQLitePlatform; import io.ebean.config.dbplatform.sqlserver.SqlServer16Platform; import io.ebean.config.dbplatform.sqlserver.SqlServer17Platform; import io.ebean.util.JdbcClose; -import io.ebeaninternal.dbmigration.DbOffline; +import io.ebeaninternal.api.DbOffline; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java index 74b3eddc2..777af3605 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultContainer.java @@ -13,7 +13,7 @@ import io.ebean.config.dbplatform.h2.H2Platform; import io.ebean.service.SpiContainer; import io.ebeaninternal.api.SpiBackgroundExecutor; import io.ebeaninternal.api.SpiEbeanServer; -import io.ebeaninternal.dbmigration.DbOffline; +import io.ebeaninternal.api.DbOffline; import io.ebeaninternal.server.cluster.ClusterManager; import io.ebeaninternal.server.core.bootup.BootupClassPathSearch; import io.ebeaninternal.server.core.bootup.BootupClasses; 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 bca7a97a6..1913b1e87 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 @@ -31,7 +31,7 @@ import io.ebeaninternal.api.SpiLogManager; import io.ebeaninternal.api.SpiLogger; import io.ebeaninternal.api.SpiLoggerFactory; import io.ebeaninternal.api.SpiProfileHandler; -import io.ebeaninternal.dbmigration.DbOffline; +import io.ebeaninternal.api.DbOffline; import io.ebeaninternal.server.autotune.AutoTuneService; import io.ebeaninternal.server.autotune.AutoTuneServiceProvider; import io.ebeaninternal.server.autotune.NoAutoTuneService; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManySqlHelp.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManySqlHelp.java index 0cd4831de..398713a18 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManySqlHelp.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManySqlHelp.java @@ -4,8 +4,8 @@ import io.ebean.Transaction; import io.ebeaninternal.api.SpiEbeanServer; import io.ebeaninternal.api.SpiQuery; import io.ebeaninternal.api.SpiSqlUpdate; -import io.ebeaninternal.dbmigration.model.visitor.BaseTablePropertyVisitor; -import io.ebeaninternal.dbmigration.model.visitor.VisitAllUsing; +import io.ebeaninternal.server.deploy.visitor.BaseTablePropertyVisitor; +import io.ebeaninternal.server.deploy.visitor.VisitProperties; import io.ebeaninternal.server.core.DefaultSqlUpdate; import java.util.List; @@ -50,7 +50,7 @@ class BeanPropertyAssocManySqlHelp { append(sb); Cols cols = new Cols(sb); - VisitAllUsing.visitOne(many.targetDescriptor, cols); + VisitProperties.visit(many.targetDescriptor, cols); sb.append(") values ("); appendBind(sb, exportedProperties.length, true); appendBind(sb, cols.colCount, false); diff --git a/ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/visitor/BaseTablePropertyVisitor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/BaseTablePropertyVisitor.java similarity index 95% rename from ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/visitor/BaseTablePropertyVisitor.java rename to ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/BaseTablePropertyVisitor.java index 5092b57d7..cc23a5c1f 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/visitor/BaseTablePropertyVisitor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/BaseTablePropertyVisitor.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.dbmigration.model.visitor; +package io.ebeaninternal.server.deploy.visitor; import io.ebeaninternal.server.deploy.BeanProperty; import io.ebeaninternal.server.deploy.BeanPropertyAssocMany; diff --git a/ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/visitor/BeanPropertyVisitor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/BeanPropertyVisitor.java similarity index 95% rename from ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/visitor/BeanPropertyVisitor.java rename to ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/BeanPropertyVisitor.java index 8081f9b40..1cadc2b1b 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/dbmigration/model/visitor/BeanPropertyVisitor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/BeanPropertyVisitor.java @@ -1,4 +1,4 @@ -package io.ebeaninternal.dbmigration.model.visitor; +package io.ebeaninternal.server.deploy.visitor; import io.ebeaninternal.server.deploy.BeanProperty; import io.ebeaninternal.server.deploy.BeanPropertyAssocMany; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/VisitProperties.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/VisitProperties.java new file mode 100644 index 000000000..deab1104c --- /dev/null +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/visitor/VisitProperties.java @@ -0,0 +1,116 @@ +package io.ebeaninternal.server.deploy.visitor; + +import io.ebeaninternal.server.deploy.BeanDescriptor; +import io.ebeaninternal.server.deploy.BeanProperty; +import io.ebeaninternal.server.deploy.BeanPropertyAssocMany; +import io.ebeaninternal.server.deploy.BeanPropertyAssocOne; +import io.ebeaninternal.server.deploy.InheritInfo; +import io.ebeaninternal.server.deploy.InheritInfoVisitor; + +/** + * Makes use of BeanVisitor and PropertyVisitor to navigate BeanDescriptors + * and their properties. + */ +public class VisitProperties { + + /** + * Visit a single Descriptor using the given visitor. + */ + public static void visit(BeanDescriptor descriptor, BeanPropertyVisitor visitor) { + new VisitProperties().visitProperties(descriptor, visitor); + } + + protected void visitProperties(BeanDescriptor desc, BeanPropertyVisitor propertyVisitor) { + BeanProperty idProp = desc.getIdProperty(); + if (idProp != null) { + visit(propertyVisitor, idProp); + } + + BeanPropertyAssocOne unidirectional = desc.getUnidirectional(); + if (unidirectional != null) { + visit(propertyVisitor, unidirectional); + } + + BeanProperty[] propertiesNonTransient = desc.propertiesNonTransient(); + for (BeanProperty p : propertiesNonTransient) { + if (p.isDDLColumn()) { + visit(propertyVisitor, p); + } + } + + visitInheritanceProperties(desc, propertyVisitor); + propertyVisitor.visitEnd(); + } + + /** + * Visit the property. + */ + protected void visit(BeanPropertyVisitor pv, BeanProperty p) { + + if (p instanceof BeanPropertyAssocMany) { + // oneToMany or manyToMany + pv.visitMany((BeanPropertyAssocMany) p); + + } else if (p instanceof BeanPropertyAssocOne) { + BeanPropertyAssocOne assocOne = (BeanPropertyAssocOne) p; + if (assocOne.isEmbedded()) { + // Embedded bean + pv.visitEmbedded(assocOne); + BeanProperty[] embProps = assocOne.getProperties(); + for (BeanProperty embProp : embProps) { + pv.visitEmbeddedScalar(embProp, assocOne); + } + + } else if (assocOne.isOneToOneExported()) { + // associated one exported + pv.visitOneExported(assocOne); + + } else { + // associated one imported + pv.visitOneImported(assocOne); + } + + } else { + // simple scalar type + pv.visitScalar(p); + } + } + + + /** + * Visit all the other inheritance properties that are not on the root. + */ + protected void visitInheritanceProperties(BeanDescriptor descriptor, BeanPropertyVisitor pv) { + + InheritInfo inheritInfo = descriptor.getInheritInfo(); + if (inheritInfo != null && inheritInfo.isRoot()) { + // add all properties on the children objects + inheritInfo.visitChildren(new InheritChildVisitor(this, pv)); + } + } + + + /** + * Helper used to visit all the inheritInfo/BeanDescriptor in + * the inheritance hierarchy (to add their 'local' properties). + */ + protected static class InheritChildVisitor implements InheritInfoVisitor { + + private final VisitProperties owner; + private final BeanPropertyVisitor pv; + + protected InheritChildVisitor(VisitProperties owner, BeanPropertyVisitor pv) { + this.owner = owner; + this.pv = pv; + } + + @Override + public void visit(InheritInfo inheritInfo) { + for (BeanProperty beanProperty : inheritInfo.desc().propertiesLocal()) { + if (beanProperty.isDDLColumn()) { + owner.visit(pv, beanProperty); + } + } + } + } +} diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java index 87d56c137..b429b4f58 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/DefaultTypeManager.java @@ -18,7 +18,7 @@ import io.ebean.types.Cidr; import io.ebean.types.Inet; import io.ebean.util.AnnotationUtil; import io.ebeaninternal.api.ExtraTypeFactory; -import io.ebeaninternal.dbmigration.DbOffline; +import io.ebeaninternal.api.DbOffline; import io.ebeaninternal.server.core.bootup.BootupClasses; import io.ebeaninternal.server.deploy.meta.DeployBeanProperty; import io.ebeanservice.docstore.api.mapping.DocPropertyType; diff --git a/ebean-core/src/test/java/io/ebean/dbmigration/DbMigrationSqlServerTest.java b/ebean-core/src/test/java/io/ebean/dbmigration/DbMigrationSqlServerTest.java index 286e3525a..2ee20516c 100644 --- a/ebean-core/src/test/java/io/ebean/dbmigration/DbMigrationSqlServerTest.java +++ b/ebean-core/src/test/java/io/ebean/dbmigration/DbMigrationSqlServerTest.java @@ -1,7 +1,7 @@ package io.ebean.dbmigration; import io.ebean.annotation.Platform; -import io.ebeaninternal.dbmigration.DbOffline; +import io.ebeaninternal.api.DbOffline; import org.junit.Test; public class DbMigrationSqlServerTest { diff --git a/ebean-test/src/main/java/io/ebean/test/config/RunOnceMarker.java b/ebean-test/src/main/java/io/ebean/test/config/RunOnceMarker.java index 8a9193fa0..a8eea6904 100644 --- a/ebean-test/src/main/java/io/ebean/test/config/RunOnceMarker.java +++ b/ebean-test/src/main/java/io/ebean/test/config/RunOnceMarker.java @@ -1,6 +1,6 @@ package io.ebean.test.config; -import io.ebeaninternal.dbmigration.DbOffline; +import io.ebeaninternal.api.DbOffline; class RunOnceMarker {