Skip to content

Commit

Permalink
HSEARCH-5300 Experiment with the annotation processor to generate the…
Browse files Browse the repository at this point in the history
… metamodel
  • Loading branch information
marko-bekhta committed Feb 20, 2025
1 parent 07592a3 commit e3a9d5a
Show file tree
Hide file tree
Showing 53 changed files with 2,561 additions and 29 deletions.
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

0 comments on commit e3a9d5a

Please sign in to comment.