[
https://issues.apache.org/jira/browse/ISIS-1469?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Andi Huber closed ISIS-1469.
----------------------------
Resolution: Abandoned
abandoned; closing
> MetaModel validator to detect duplicate schema/table names (read JDO/DN
> metadata at runtime)
> --------------------------------------------------------------------------------------------
>
> Key: ISIS-1469
> URL: https://issues.apache.org/jira/browse/ISIS-1469
> Project: Isis
> Issue Type: Improvement
> Components: Isis Persistence JDO
> Affects Versions: 1.13.0
> Reporter: Timothy Simecsek
> Priority: Minor
>
> Hi Dan,
> Today I came across a situation that might cause unexpected behavior, finding
> the real cause was not very easy because the situation showed through various
> errors, here some that I can remember:
> - Datanucleus enhancer failed with a message that there is duplicate
> signature&name
> - The same error as above but this time shown once the Unit-Tests started
> - “Unique index or primary key violation” in a domain object which name
> was a duplicate
> - Missing column exception
> The really sad thing is that we had already two domain objects with the same
> name for some builds, the error messages started when I started changing one
> of them.
> We are using autoCreateAll and are specifying table names for some classes as
> we are working on oracle and facing the limitation of 30 characters:
> {code}
> @javax.jdo.annotations.PersistenceCapable(schema =
> JdoConstants.A1FF_SCHEMA_NAME, table = "STEP_FIND_DSL_PORT_VULL")
> @javax.jdo.annotations.Inheritance(strategy = InheritanceStrategy.NEW_TABLE)
> {code}
> Therefore I introduced now a test checking for this. Might this be something
> for Apache ISIS metamodel validation or is that more a thing for Datanucleus?
> {code}
> import java.util.HashSet;
> import java.util.Set;
> import javax.jdo.annotations.Inheritance;
> import javax.jdo.annotations.InheritanceStrategy;
> import javax.jdo.annotations.PersistenceCapable;
> import org.junit.Test;
> import org.reflections.Reflections;
> import org.slf4j.Logger;
> import org.slf4j.LoggerFactory;
> import a1.oss.FulfillmentAppDomainModule;
> import static org.assertj.core.api.Assertions.assertThat;
> public class DuplicateDefinitionsTest {
> private final static Logger LOG =
> LoggerFactory.getLogger(DuplicateDefinitionsTest.class);
> @Test
> public void testTableNames() {
> HashSet<String> tableNames = new HashSet<>();
> final Set<Class<?>> persistentClasses = new
> Reflections(FulfillmentAppDomainModule.class.getPackage().getName())
> .getTypesAnnotatedWith(PersistenceCapable.class);
> for (Class aClass : persistentClasses) {
> // skip this class if it doesn't result in a separate table
> final Inheritance inheritance = (Inheritance)
> aClass.getAnnotation(Inheritance.class);
> if (inheritance != null &&
> (InheritanceStrategy.SUBCLASS_TABLE.equals(inheritance.strategy())
> ||
> InheritanceStrategy.SUPERCLASS_TABLE.equals(inheritance.strategy())))
> continue;
> String tableName = aClass.getSimpleName();
> // if persistent class has annotated tablename
> final PersistenceCapable annotation = (PersistenceCapable)
> aClass.getAnnotation(PersistenceCapable.class);
> if (annotation != null && !annotation.table().isEmpty()) {
> tableName = annotation.table();
> }
> assertThat(tableNames.add(tableName)).describedAs("Table '" +
> tableName + "' for class '" + aClass.getSimpleName() + "' is already used by
> another class")
> .isEqualTo(true);
> }
> assertThat(tableNames.size()).as("No persistent tables
> found!?").isGreaterThan(0);
> }
> }
> {code}
> Regards Timothy
--
This message was sent by Atlassian Jira
(v8.20.7#820007)