Skip to content

Commit f04af13

Browse files
committed
HSEARCH-5300 Experiment with the annotation processor to generate the metamodel
1 parent 07592a3 commit f04af13

File tree

52 files changed

+2560
-29
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+2560
-29
lines changed

bom/public/pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@
9292
<artifactId>hibernate-search-mapper-orm-outbox-polling</artifactId>
9393
<version>${project.version}</version>
9494
</dependency>
95+
<dependency>
96+
<groupId>org.hibernate.search</groupId>
97+
<artifactId>hibernate-search-metamodel-processor</artifactId>
98+
<version>${project.version}</version>
99+
</dependency>
95100
<!-- Relocation artifacts: -->
96101
<dependency>
97102
<groupId>org.hibernate.search</groupId>

build/parents/build/pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,11 @@
370370
<type>pom</type>
371371
<version>${project.version}</version>
372372
</dependency>
373+
<dependency>
374+
<groupId>org.hibernate.search</groupId>
375+
<artifactId>hibernate-search-metamodel-processor</artifactId>
376+
<version>${project.version}</version>
377+
</dependency>
373378

374379
<!-- Remaining Hibernate Search dependencies -->
375380
<dependency>

build/reports/pom.xml

+4
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@
7474
<groupId>org.hibernate.search</groupId>
7575
<artifactId>hibernate-search-mapper-orm-jakarta-batch-jberet</artifactId>
7676
</dependency>
77+
<dependency>
78+
<groupId>org.hibernate.search</groupId>
79+
<artifactId>hibernate-search-metamodel-processor</artifactId>
80+
</dependency>
7781
<dependency>
7882
<groupId>org.hibernate.search</groupId>
7983
<artifactId>hibernate-search-mapper-orm-batch-jsr352-core</artifactId>

distribution/pom.xml

+2
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@
256256
${basedir}/../mapper/orm-outbox-polling/src/main/java;
257257
${basedir}/../mapper/orm-jakarta-batch/core/src/main/java;
258258
${basedir}/../mapper/orm-jakarta-batch/jberet/src/main/java;
259+
${basedir}/../metamodel/processor/src/main/java;
259260
${basedir}/../engine/target/generated-sources/annotations;
260261
${basedir}/../util/common/target/generated-sources/annotations;
261262
${basedir}/../mapper/pojo-base/target/generated-sources/annotations;
@@ -268,6 +269,7 @@
268269
${basedir}/../mapper/orm-outbox-polling/target/generated-sources/annotations;
269270
${basedir}/../mapper/orm-jakarta-batch/core/target/generated-sources/annotations;
270271
${basedir}/../mapper/orm-jakarta-batch/jberet/target/generated-sources/annotations;
272+
${basedir}/../metamodel/processor/target/generated-sources/annotations;
271273
</sourcepath>
272274
<docfilessubdirs>true</docfilessubdirs>
273275
<packagesheader>Hibernate Search Packages</packagesheader>

documentation/pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@
6262
<artifactId>hibernate-search-backend-elasticsearch</artifactId>
6363
<scope>test</scope>
6464
</dependency>
65+
<dependency>
66+
<groupId>${project.groupId}</groupId>
67+
<artifactId>hibernate-search-metamodel-processor</artifactId>
68+
<scope>test</scope>
69+
</dependency>
6570
<dependency>
6671
<groupId>${project.groupId}</groupId>
6772
<artifactId>hibernate-search-util-internal-integrationtest-mapper-orm</artifactId>

mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/model/models/spi/AbstractPojoModelsBootstrapIntrospector.java

+2-25
Original file line numberDiff line numberDiff line change
@@ -139,30 +139,7 @@ public Class<?> toClass(ClassDetails xClass) {
139139
}
140140

141141
private static String noPrefix(MemberDetails details) {
142-
String fullName = details.getName();
143-
if ( fullName.startsWith( "get" ) ) {
144-
return decapitalize( fullName.substring( "get".length() ) );
145-
}
146-
if ( fullName.startsWith( "is" ) ) {
147-
return decapitalize( fullName.substring( "is".length() ) );
148-
}
149-
return fullName;
150-
}
151-
152-
// See conventions expressed by https://docs.oracle.com/javase/7/docs/api/java/beans/Introspector.html#decapitalize(java.lang.String)
153-
private static String decapitalize(String name) {
154-
if ( name != null && !name.isEmpty() ) {
155-
if ( name.length() > 1 && Character.isUpperCase( name.charAt( 1 ) ) ) {
156-
return name;
157-
}
158-
else {
159-
char[] chars = name.toCharArray();
160-
chars[0] = Character.toLowerCase( chars[0] );
161-
return new String( chars );
162-
}
163-
}
164-
else {
165-
return name;
166-
}
142+
return PojoBootstrapIntrospector.noPrefix( details.getName() );
167143
}
144+
168145
}

mapper/pojo-base/src/main/java/org/hibernate/search/mapper/pojo/model/spi/PojoBootstrapIntrospector.java

+30
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55
package org.hibernate.search.mapper.pojo.model.spi;
66

7+
import org.hibernate.search.util.common.annotation.Incubating;
78
import org.hibernate.search.util.common.reflect.spi.ValueHandleFactory;
89

910
/**
@@ -38,4 +39,33 @@ default org.hibernate.search.util.common.reflect.spi.ValueReadHandleFactory anno
3839
return (org.hibernate.search.util.common.reflect.spi.ValueReadHandleFactory) annotationValueHandleFactory();
3940
}
4041

42+
@Incubating
43+
static String noPrefix(String methodName) {
44+
if ( methodName.startsWith( "get" ) ) {
45+
return decapitalize( methodName.substring( "get".length() ) );
46+
}
47+
if ( methodName.startsWith( "is" ) ) {
48+
return decapitalize( methodName.substring( "is".length() ) );
49+
}
50+
// TODO: handle hasXXX ?
51+
return methodName;
52+
}
53+
54+
// See conventions expressed by https://docs.oracle.com/javase/7/docs/api/java/beans/Introspector.html#decapitalize(java.lang.String)
55+
@Incubating
56+
static String decapitalize(String name) {
57+
if ( name != null && !name.isEmpty() ) {
58+
if ( name.length() > 1 && Character.isUpperCase( name.charAt( 1 ) ) ) {
59+
return name;
60+
}
61+
else {
62+
char[] chars = name.toCharArray();
63+
chars[0] = Character.toLowerCase( chars[0] );
64+
return new String( chars );
65+
}
66+
}
67+
else {
68+
return name;
69+
}
70+
}
4171
}

mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/bootstrap/impl/StandalonePojoIntegrationBooterImpl.java

+14-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.Map;
1212
import java.util.Optional;
1313
import java.util.function.BiConsumer;
14+
import java.util.function.Function;
1415

1516
import org.hibernate.search.engine.cfg.ConfigurationPropertySource;
1617
import org.hibernate.search.engine.cfg.spi.AllAwareConfigurationPropertySource;
@@ -22,6 +23,7 @@
2223
import org.hibernate.search.engine.common.spi.SearchIntegrationPartialBuildState;
2324
import org.hibernate.search.engine.environment.bean.spi.BeanProvider;
2425
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.AnnotatedTypeSource;
26+
import org.hibernate.search.mapper.pojo.model.spi.PojoBootstrapIntrospector;
2527
import org.hibernate.search.mapper.pojo.standalone.bootstrap.spi.StandalonePojoIntegrationBooter;
2628
import org.hibernate.search.mapper.pojo.standalone.bootstrap.spi.StandalonePojoIntegrationBooterBehavior;
2729
import org.hibernate.search.mapper.pojo.standalone.cfg.spi.StandalonePojoMapperSpiSettings;
@@ -46,12 +48,14 @@ public class StandalonePojoIntegrationBooterImpl implements StandalonePojoIntegr
4648
private final List<AnnotatedTypeSource> annotatedTypeSources;
4749
private final ConfigurationPropertyChecker propertyChecker;
4850
private final ValueHandleFactory valueHandleFactory;
51+
private final Function<PojoBootstrapIntrospector, PojoBootstrapIntrospector> introspectorCustomizer;
4952
private final ConfigurationPropertySource propertySource;
5053

5154
private StandalonePojoIntegrationBooterImpl(BuilderImpl builder) {
5255
annotatedTypeSources = builder.annotatedTypeSources;
5356
propertyChecker = ConfigurationPropertyChecker.create();
5457
valueHandleFactory = builder.valueHandleFactory;
58+
introspectorCustomizer = builder.introspectorCustomizer;
5559

5660
propertySource = propertyChecker.wrap(
5761
AllAwareConfigurationPropertySource.fromMap( builder.properties )
@@ -82,10 +86,11 @@ private StandalonePojoIntegrationPartialBuildState getPartialBuildStateOrDoBootF
8286
}
8387

8488
private StandalonePojoIntegrationPartialBuildState doBootFirstPhase() {
85-
StandalonePojoBootstrapIntrospector introspector =
89+
PojoBootstrapIntrospector introspector =
8690
StandalonePojoBootstrapIntrospector.create( null, valueHandleFactory != null
8791
? valueHandleFactory
8892
: ValueHandleFactory.usingMethodHandle( MethodHandles.publicLookup() ) );
93+
introspector = introspectorCustomizer.apply( introspector );
8994
StandalonePojoMappingKey mappingKey = new StandalonePojoMappingKey();
9095
StandalonePojoMappingInitiator mappingInitiator = new StandalonePojoMappingInitiator( introspector );
9196
for ( AnnotatedTypeSource source : annotatedTypeSources ) {
@@ -135,8 +140,9 @@ public StandalonePojoMapping boot() {
135140

136141
public static class BuilderImpl implements Builder {
137142
private final List<AnnotatedTypeSource> annotatedTypeSources = new ArrayList<>();
138-
private ValueHandleFactory valueHandleFactory;
139143
private final Map<String, Object> properties = new HashMap<>();
144+
private ValueHandleFactory valueHandleFactory;
145+
private Function<PojoBootstrapIntrospector, PojoBootstrapIntrospector> introspectorCustomizer = Function.identity();
140146

141147
public BuilderImpl() {
142148
}
@@ -153,6 +159,12 @@ public BuilderImpl valueReadHandleFactory(ValueHandleFactory valueHandleFactory)
153159
return this;
154160
}
155161

162+
@Override
163+
public Builder introspectorCustomizer(Function<PojoBootstrapIntrospector, PojoBootstrapIntrospector> customize) {
164+
this.introspectorCustomizer = customize;
165+
return this;
166+
}
167+
156168
@Override
157169
public BuilderImpl property(String name, Object value) {
158170
properties.put( name, value );

mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/bootstrap/spi/StandalonePojoIntegrationBooter.java

+5
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66

77
import java.util.Map;
88
import java.util.function.BiConsumer;
9+
import java.util.function.Function;
910

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

2628
Builder valueReadHandleFactory(ValueHandleFactory valueHandleFactory);
2729

30+
@Incubating
31+
Builder introspectorCustomizer(Function<PojoBootstrapIntrospector, PojoBootstrapIntrospector> customize);
32+
2833
Builder property(String name, Object value);
2934

3035
Builder properties(Map<String, ?> map);

mapper/pojo-standalone/src/main/java/org/hibernate/search/mapper/pojo/standalone/mapping/impl/StandalonePojoMappingInitiator.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717
import org.hibernate.search.mapper.pojo.mapping.building.spi.PojoMapperDelegate;
1818
import org.hibernate.search.mapper.pojo.mapping.building.spi.PojoTypeMetadataContributor;
1919
import org.hibernate.search.mapper.pojo.mapping.spi.AbstractPojoMappingInitiator;
20+
import org.hibernate.search.mapper.pojo.model.spi.PojoBootstrapIntrospector;
2021
import org.hibernate.search.mapper.pojo.standalone.cfg.StandalonePojoMapperSettings;
2122
import org.hibernate.search.mapper.pojo.standalone.mapping.StandalonePojoMappingConfigurationContext;
2223
import org.hibernate.search.mapper.pojo.standalone.mapping.StandalonePojoMappingConfigurer;
23-
import org.hibernate.search.mapper.pojo.standalone.model.impl.StandalonePojoBootstrapIntrospector;
2424
import org.hibernate.search.mapper.pojo.standalone.reporting.impl.StandalonePojoMapperHints;
2525

2626
public class StandalonePojoMappingInitiator extends AbstractPojoMappingInitiator<StandalonePojoMappingPartialBuildState>
@@ -54,7 +54,7 @@ public class StandalonePojoMappingInitiator extends AbstractPojoMappingInitiator
5454
.withDefault( StandalonePojoMapperSettings.Defaults.MULTI_TENANCY_ENABLED )
5555
.build();
5656

57-
public StandalonePojoMappingInitiator(StandalonePojoBootstrapIntrospector introspector) {
57+
public StandalonePojoMappingInitiator(PojoBootstrapIntrospector introspector) {
5858
super( introspector, StandalonePojoMapperHints.INSTANCE );
5959
}
6060

metamodel/processor/pom.xml

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
<?xml version="1.0"?>
2+
<project
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
4+
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
5+
<modelVersion>4.0.0</modelVersion>
6+
<parent>
7+
<groupId>org.hibernate.search</groupId>
8+
<artifactId>hibernate-search-parent-public</artifactId>
9+
<version>8.0.0-SNAPSHOT</version>
10+
<relativePath>../../build/parents/public</relativePath>
11+
</parent>
12+
<artifactId>hibernate-search-metamodel-processor</artifactId>
13+
14+
<name>Hibernate Search Metamodel annotation processor</name>
15+
<description>Hibernate Search Metamodel annotation processor</description>
16+
17+
<properties>
18+
<!-- This is a publicly distributed module that should be published: -->
19+
<deploy.skip>false</deploy.skip>
20+
<java.module.name>org.hibernate.search.metamodel.processor</java.module.name>
21+
22+
<logging.processor.skip.generated.annotation.compiler.argument></logging.processor.skip.generated.annotation.compiler.argument>
23+
<logging.processor.categories.report.module-name.compiler.argument></logging.processor.categories.report.module-name.compiler.argument>
24+
</properties>
25+
26+
<dependencies>
27+
<dependency>
28+
<groupId>org.hibernate.search</groupId>
29+
<artifactId>hibernate-search-engine</artifactId>
30+
</dependency>
31+
<dependency>
32+
<groupId>org.hibernate.search</groupId>
33+
<artifactId>hibernate-search-mapper-pojo-base</artifactId>
34+
</dependency>
35+
<dependency>
36+
<groupId>org.hibernate.search</groupId>
37+
<artifactId>hibernate-search-mapper-pojo-standalone</artifactId>
38+
</dependency>
39+
40+
<dependency>
41+
<groupId>org.hibernate.search</groupId>
42+
<artifactId>hibernate-search-backend-lucene</artifactId>
43+
</dependency>
44+
45+
<dependency>
46+
<groupId>org.hibernate.search</groupId>
47+
<artifactId>hibernate-search-util-common</artifactId>
48+
</dependency>
49+
<dependency>
50+
<groupId>org.jboss.logging</groupId>
51+
<artifactId>jboss-logging</artifactId>
52+
</dependency>
53+
<dependency>
54+
<groupId>org.jboss.logging</groupId>
55+
<artifactId>jboss-logging-annotations</artifactId>
56+
</dependency>
57+
58+
<dependency>
59+
<groupId>org.junit.jupiter</groupId>
60+
<artifactId>junit-jupiter</artifactId>
61+
<scope>test</scope>
62+
</dependency>
63+
<dependency>
64+
<groupId>org.assertj</groupId>
65+
<artifactId>assertj-core</artifactId>
66+
<scope>test</scope>
67+
</dependency>
68+
</dependencies>
69+
70+
<build>
71+
<plugins>
72+
<plugin>
73+
<groupId>org.apache.maven.plugins</groupId>
74+
<artifactId>maven-compiler-plugin</artifactId>
75+
<executions>
76+
<execution>
77+
<id>default-compile</id>
78+
<configuration>
79+
<proc>none</proc>
80+
<annotationProcessorPaths combine.self="override"></annotationProcessorPaths>
81+
</configuration>
82+
</execution>
83+
</executions>
84+
</plugin>
85+
<plugin>
86+
<groupId>org.apache.maven.plugins</groupId>
87+
<artifactId>maven-dependency-plugin</artifactId>
88+
<executions>
89+
<execution>
90+
<id>copy</id>
91+
<phase>generate-test-resources</phase>
92+
<goals>
93+
<goal>copy-dependencies</goal>
94+
</goals>
95+
<configuration>
96+
<outputDirectory>${project.build.directory}/test-dependencies</outputDirectory>
97+
<stripVersion>true</stripVersion>
98+
</configuration>
99+
</execution>
100+
</executions>
101+
</plugin>
102+
</plugins>
103+
</build>
104+
</project>

0 commit comments

Comments
 (0)