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

HSEARCH-3319 WIP: Type-safe field references v2 #4156

Open
wants to merge 13 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
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
5 changes: 5 additions & 0 deletions bom/public/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,11 @@
<artifactId>hibernate-search-mapper-orm-outbox-polling</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.search</groupId>
<artifactId>hibernate-search-metamodel-processor</artifactId>
<version>${project.version}</version>
</dependency>
<!-- Relocation artifacts: -->
<dependency>
<groupId>org.hibernate.search</groupId>
Expand Down
1 change: 1 addition & 0 deletions build/jqassistant/rules/rules.xml
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@
WHEN 'hibernate-search-mapper-orm' THEN 'HibernateOrm'
WHEN 'hibernate-search-mapper-orm-outbox-polling' THEN 'OutboxPolling'
WHEN 'hibernate-search-mapper-orm-jakarta-batch-jberet' THEN 'JBeret'
WHEN 'hibernate-search-metamodel-processor' THEN 'Processor'
ELSE 'UNKNOWN-MODULE-SPECIFIC-KEYWORD-PLEASE-UPDATE-JQASSISTANT-RULES'
END
RETURN
Expand Down
5 changes: 5 additions & 0 deletions build/parents/build/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,11 @@
<type>pom</type>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.search</groupId>
<artifactId>hibernate-search-metamodel-processor</artifactId>
<version>${project.version}</version>
</dependency>

<!-- Remaining Hibernate Search dependencies -->
<dependency>
Expand Down
4 changes: 4 additions & 0 deletions build/reports/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@
<groupId>org.hibernate.search</groupId>
<artifactId>hibernate-search-mapper-orm-jakarta-batch-jberet</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.search</groupId>
<artifactId>hibernate-search-metamodel-processor</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.search</groupId>
<artifactId>hibernate-search-mapper-orm-batch-jsr352-core</artifactId>
Expand Down
2 changes: 2 additions & 0 deletions distribution/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,7 @@
${basedir}/../mapper/orm-outbox-polling/src/main/java;
${basedir}/../mapper/orm-jakarta-batch/core/src/main/java;
${basedir}/../mapper/orm-jakarta-batch/jberet/src/main/java;
${basedir}/../metamodel/processor/src/main/java;
${basedir}/../engine/target/generated-sources/annotations;
${basedir}/../util/common/target/generated-sources/annotations;
${basedir}/../mapper/pojo-base/target/generated-sources/annotations;
Expand All @@ -268,6 +269,7 @@
${basedir}/../mapper/orm-outbox-polling/target/generated-sources/annotations;
${basedir}/../mapper/orm-jakarta-batch/core/target/generated-sources/annotations;
${basedir}/../mapper/orm-jakarta-batch/jberet/target/generated-sources/annotations;
${basedir}/../metamodel/processor/target/generated-sources/annotations;
</sourcepath>
<docfilessubdirs>true</docfilessubdirs>
<packagesheader>Hibernate Search Packages</packagesheader>
Expand Down
5 changes: 5 additions & 0 deletions documentation/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@
<artifactId>hibernate-search-backend-elasticsearch</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>hibernate-search-metamodel-processor</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>hibernate-search-util-internal-integrationtest-mapper-orm</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,30 +139,7 @@ public Class<?> toClass(ClassDetails xClass) {
}

private static String noPrefix(MemberDetails details) {
String fullName = details.getName();
if ( fullName.startsWith( "get" ) ) {
return decapitalize( fullName.substring( "get".length() ) );
}
if ( fullName.startsWith( "is" ) ) {
return decapitalize( fullName.substring( "is".length() ) );
}
return fullName;
}

// See conventions expressed by https://docs.oracle.com/javase/7/docs/api/java/beans/Introspector.html#decapitalize(java.lang.String)
private static String decapitalize(String name) {
if ( name != null && !name.isEmpty() ) {
if ( name.length() > 1 && Character.isUpperCase( name.charAt( 1 ) ) ) {
return name;
}
else {
char[] chars = name.toCharArray();
chars[0] = Character.toLowerCase( chars[0] );
return new String( chars );
}
}
else {
return name;
}
return PojoBootstrapIntrospector.noPrefix( details.getName() );
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
*/
package org.hibernate.search.mapper.pojo.model.spi;

import org.hibernate.search.util.common.annotation.Incubating;
import org.hibernate.search.util.common.reflect.spi.ValueHandleFactory;

/**
Expand Down Expand Up @@ -38,4 +39,33 @@ default org.hibernate.search.util.common.reflect.spi.ValueReadHandleFactory anno
return (org.hibernate.search.util.common.reflect.spi.ValueReadHandleFactory) annotationValueHandleFactory();
}

@Incubating
static String noPrefix(String methodName) {
if ( methodName.startsWith( "get" ) ) {
return decapitalize( methodName.substring( "get".length() ) );
}
if ( methodName.startsWith( "is" ) ) {
return decapitalize( methodName.substring( "is".length() ) );
}
// TODO: handle hasXXX ?
return methodName;
}

// See conventions expressed by https://docs.oracle.com/javase/7/docs/api/java/beans/Introspector.html#decapitalize(java.lang.String)
@Incubating
static String decapitalize(String name) {
if ( name != null && !name.isEmpty() ) {
if ( name.length() > 1 && Character.isUpperCase( name.charAt( 1 ) ) ) {
return name;
}
else {
char[] chars = name.toCharArray();
chars[0] = Character.toLowerCase( chars[0] );
return new String( chars );
}
}
else {
return name;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import java.util.Map;
import java.util.Optional;
import java.util.function.BiConsumer;
import java.util.function.Function;

import org.hibernate.search.engine.cfg.ConfigurationPropertySource;
import org.hibernate.search.engine.cfg.spi.AllAwareConfigurationPropertySource;
Expand All @@ -22,6 +23,7 @@
import org.hibernate.search.engine.common.spi.SearchIntegrationPartialBuildState;
import org.hibernate.search.engine.environment.bean.spi.BeanProvider;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.AnnotatedTypeSource;
import org.hibernate.search.mapper.pojo.model.spi.PojoBootstrapIntrospector;
import org.hibernate.search.mapper.pojo.standalone.bootstrap.spi.StandalonePojoIntegrationBooter;
import org.hibernate.search.mapper.pojo.standalone.bootstrap.spi.StandalonePojoIntegrationBooterBehavior;
import org.hibernate.search.mapper.pojo.standalone.cfg.spi.StandalonePojoMapperSpiSettings;
Expand All @@ -46,12 +48,14 @@ public class StandalonePojoIntegrationBooterImpl implements StandalonePojoIntegr
private final List<AnnotatedTypeSource> annotatedTypeSources;
private final ConfigurationPropertyChecker propertyChecker;
private final ValueHandleFactory valueHandleFactory;
private final Function<PojoBootstrapIntrospector, PojoBootstrapIntrospector> introspectorCustomizer;
private final ConfigurationPropertySource propertySource;

private StandalonePojoIntegrationBooterImpl(BuilderImpl builder) {
annotatedTypeSources = builder.annotatedTypeSources;
propertyChecker = ConfigurationPropertyChecker.create();
valueHandleFactory = builder.valueHandleFactory;
introspectorCustomizer = builder.introspectorCustomizer;

propertySource = propertyChecker.wrap(
AllAwareConfigurationPropertySource.fromMap( builder.properties )
Expand Down Expand Up @@ -82,10 +86,11 @@ private StandalonePojoIntegrationPartialBuildState getPartialBuildStateOrDoBootF
}

private StandalonePojoIntegrationPartialBuildState doBootFirstPhase() {
StandalonePojoBootstrapIntrospector introspector =
PojoBootstrapIntrospector introspector =
StandalonePojoBootstrapIntrospector.create( null, valueHandleFactory != null
? valueHandleFactory
: ValueHandleFactory.usingMethodHandle( MethodHandles.publicLookup() ) );
introspector = introspectorCustomizer.apply( introspector );
StandalonePojoMappingKey mappingKey = new StandalonePojoMappingKey();
StandalonePojoMappingInitiator mappingInitiator = new StandalonePojoMappingInitiator( introspector );
for ( AnnotatedTypeSource source : annotatedTypeSources ) {
Expand Down Expand Up @@ -135,8 +140,9 @@ public StandalonePojoMapping boot() {

public static class BuilderImpl implements Builder {
private final List<AnnotatedTypeSource> annotatedTypeSources = new ArrayList<>();
private ValueHandleFactory valueHandleFactory;
private final Map<String, Object> properties = new HashMap<>();
private ValueHandleFactory valueHandleFactory;
private Function<PojoBootstrapIntrospector, PojoBootstrapIntrospector> introspectorCustomizer = Function.identity();

public BuilderImpl() {
}
Expand All @@ -153,6 +159,12 @@ public BuilderImpl valueReadHandleFactory(ValueHandleFactory valueHandleFactory)
return this;
}

@Override
public Builder introspectorCustomizer(Function<PojoBootstrapIntrospector, PojoBootstrapIntrospector> customize) {
this.introspectorCustomizer = customize;
return this;
}

@Override
public BuilderImpl property(String name, Object value) {
properties.put( name, value );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@

import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Function;

import org.hibernate.search.mapper.pojo.mapping.definition.annotation.AnnotatedTypeSource;
import org.hibernate.search.mapper.pojo.model.spi.PojoBootstrapIntrospector;
import org.hibernate.search.mapper.pojo.standalone.bootstrap.impl.StandalonePojoIntegrationBooterImpl;
import org.hibernate.search.mapper.pojo.standalone.mapping.CloseableSearchMapping;
import org.hibernate.search.util.common.annotation.Incubating;
Expand All @@ -25,6 +27,9 @@ interface Builder {

Builder valueReadHandleFactory(ValueHandleFactory valueHandleFactory);

@Incubating
Builder introspectorCustomizer(Function<PojoBootstrapIntrospector, PojoBootstrapIntrospector> customize);

Builder property(String name, Object value);

Builder properties(Map<String, ?> map);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@
import org.hibernate.search.mapper.pojo.mapping.building.spi.PojoMapperDelegate;
import org.hibernate.search.mapper.pojo.mapping.building.spi.PojoTypeMetadataContributor;
import org.hibernate.search.mapper.pojo.mapping.spi.AbstractPojoMappingInitiator;
import org.hibernate.search.mapper.pojo.model.spi.PojoBootstrapIntrospector;
import org.hibernate.search.mapper.pojo.standalone.cfg.StandalonePojoMapperSettings;
import org.hibernate.search.mapper.pojo.standalone.mapping.StandalonePojoMappingConfigurationContext;
import org.hibernate.search.mapper.pojo.standalone.mapping.StandalonePojoMappingConfigurer;
import org.hibernate.search.mapper.pojo.standalone.model.impl.StandalonePojoBootstrapIntrospector;
import org.hibernate.search.mapper.pojo.standalone.reporting.impl.StandalonePojoMapperHints;

public class StandalonePojoMappingInitiator extends AbstractPojoMappingInitiator<StandalonePojoMappingPartialBuildState>
Expand Down Expand Up @@ -54,7 +54,7 @@ public class StandalonePojoMappingInitiator extends AbstractPojoMappingInitiator
.withDefault( StandalonePojoMapperSettings.Defaults.MULTI_TENANCY_ENABLED )
.build();

public StandalonePojoMappingInitiator(StandalonePojoBootstrapIntrospector introspector) {
public StandalonePojoMappingInitiator(PojoBootstrapIntrospector introspector) {
super( introspector, StandalonePojoMapperHints.INSTANCE );
}

Expand Down
104 changes: 104 additions & 0 deletions metamodel/processor/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.hibernate.search</groupId>
<artifactId>hibernate-search-parent-public</artifactId>
<version>8.0.0-SNAPSHOT</version>
<relativePath>../../build/parents/public</relativePath>
</parent>
<artifactId>hibernate-search-metamodel-processor</artifactId>

<name>Hibernate Search Metamodel annotation processor</name>
<description>Hibernate Search Metamodel annotation processor</description>

<properties>
<!-- This is a publicly distributed module that should be published: -->
<deploy.skip>false</deploy.skip>
<java.module.name>org.hibernate.search.metamodel.processor</java.module.name>

<logging.processor.skip.generated.annotation.compiler.argument></logging.processor.skip.generated.annotation.compiler.argument>
<logging.processor.categories.report.module-name.compiler.argument></logging.processor.categories.report.module-name.compiler.argument>
</properties>

<dependencies>
<dependency>
<groupId>org.hibernate.search</groupId>
<artifactId>hibernate-search-engine</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.search</groupId>
<artifactId>hibernate-search-mapper-pojo-base</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.search</groupId>
<artifactId>hibernate-search-mapper-pojo-standalone</artifactId>
</dependency>

<dependency>
<groupId>org.hibernate.search</groupId>
<artifactId>hibernate-search-backend-lucene</artifactId>
</dependency>

<dependency>
<groupId>org.hibernate.search</groupId>
<artifactId>hibernate-search-util-common</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging-annotations</artifactId>
</dependency>

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<id>default-compile</id>
<configuration>
<proc>none</proc>
<annotationProcessorPaths combine.self="override"></annotationProcessorPaths>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>generate-test-resources</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/test-dependencies</outputDirectory>
<stripVersion>true</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Loading
Loading