Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix package name handling in JpaJandexScavenger #20763

Merged
merged 1 commit into from
Oct 14, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,17 @@ private static String safeGetClassName(String packagePrefix, ManagedType managed
if (name == null) {
throw new IllegalArgumentException("Missing attribute '" + nodeName + ".class'");
}
return packagePrefix + name;
return qualifyIfNecessary(packagePrefix, name);
}

// See org.hibernate.cfg.annotations.reflection.internal.XMLContext.buildSafeClassName(java.lang.String, java.lang.String)
private static String qualifyIfNecessary(String packagePrefix, String name) {
if (name.indexOf('.') < 0) {
return packagePrefix + name;
} else {
// The class name is already qualified; don't apply the package prefix.
return name;
}
}

private void enlistHbmXmlMapping(Collector collector, JaxbHbmHibernateMapping mapping) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package io.quarkus.hibernate.orm.xml.orm;

import static org.assertj.core.api.Assertions.assertThat;

import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.transaction.Transactional;

import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.hibernate.orm.SchemaUtil;
import io.quarkus.hibernate.orm.SmokeTestUtils;
import io.quarkus.test.QuarkusUnitTest;

/**
* Test that the <package> element is correctly interpreted in an orm.xml mapping file.
*/
public class OrmXmlPackageTest {

@RegisterExtension
static QuarkusUnitTest runner = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClass(SmokeTestUtils.class)
.addClass(SchemaUtil.class)
.addClass(NonAnnotatedEntity.class)
.addClass(OtherNonAnnotatedEntity.class)
.addAsResource("META-INF/orm-package.xml", "my-orm.xml"))
.withConfigurationResource("application.properties")
.overrideConfigKey("quarkus.hibernate-orm.mapping-files", "my-orm.xml");

@Inject
EntityManagerFactory entityManagerFactory;

@Inject
EntityManager entityManager;

@Test
@Transactional
public void ormXmlTakenIntoAccount() {
assertThat(SchemaUtil.getColumnNames(entityManagerFactory, NonAnnotatedEntity.class))
.contains("thename")
.doesNotContain("name");
assertThat(SchemaUtil.getColumnNames(entityManagerFactory, OtherNonAnnotatedEntity.class))
.contains("thename")
.doesNotContain("name");
}

@Test
@Transactional
public void smokeTest() {
SmokeTestUtils.testSimplePersistRetrieveUpdateDelete(entityManager,
NonAnnotatedEntity.class, NonAnnotatedEntity::new,
NonAnnotatedEntity::getId, NonAnnotatedEntity::setName, NonAnnotatedEntity::getName);
SmokeTestUtils.testSimplePersistRetrieveUpdateDelete(entityManager,
OtherNonAnnotatedEntity.class, OtherNonAnnotatedEntity::new,
OtherNonAnnotatedEntity::getId, OtherNonAnnotatedEntity::setName, OtherNonAnnotatedEntity::getName);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package io.quarkus.hibernate.orm.xml.orm;

public class OtherNonAnnotatedEntity {

private long id;

private String name;

public OtherNonAnnotatedEntity() {
}

public OtherNonAnnotatedEntity(String name) {
this.name = name;
}

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings
xmlns="http://java.sun.com/xml/ns/persistence/orm"
version="2.0">

<package>io.quarkus.hibernate.orm.xml.orm</package>

<entity class="NonAnnotatedEntity">
<attributes>
<id name="id">
<generated-value strategy="IDENTITY" />
</id>
<basic name="name">
<column name="thename" />
</basic>
</attributes>
</entity>
<!-- Overriding the package on purpose; this is to check that we don't prefix the package name unnecessarily to a FQCN -->
<entity class="io.quarkus.hibernate.orm.xml.orm.OtherNonAnnotatedEntity">
<attributes>
<id name="id">
<generated-value strategy="IDENTITY" />
</id>
<basic name="name">
<column name="thename" />
</basic>
</attributes>
</entity>
</entity-mappings>