Skip to content

Commit 8f11b24

Browse files
committed
HHH-18705 Removing copy & paste ugliness
- entityType moved into org.hibernate.processor.Context - created interface org.hibernate.processor.annotation.ResultTypeSupplier with default implementation for resultType(SqmSelectStatement<?>)
1 parent c9c542c commit 8f11b24

File tree

5 files changed

+87
-121
lines changed

5 files changed

+87
-121
lines changed
Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
/*
2-
* Hibernate, Relational Persistence for Idiomatic Java
3-
*
4-
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
5-
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
64
*/
75
package org.hibernate.orm.test.id.idClass;
86

@@ -16,23 +14,23 @@
1614
import static org.assertj.core.api.Assertions.assertThat;
1715

1816
@DomainModel(
19-
annotatedClasses = MyEntity.class
17+
annotatedClasses = MyEntity.class
2018
)
2119
@SessionFactory
2220
public class IdClassSyntheticAttributesTest {
2321

24-
@Jira("https://hibernate.atlassian.net/browse/HHH-18841")
25-
@Test
26-
public void test(DomainModelScope scope) {
27-
final PersistentClass entityBinding = scope.getDomainModel().getEntityBinding(MyEntity.class.getName());
28-
assertThat(entityBinding.getProperties()).hasSize(2)
29-
.anySatisfy(p -> {
30-
assertThat(p.isSynthetic()).isTrue();
31-
assertThat(p.getName()).isEqualTo("_identifierMapper");
32-
})
33-
.anySatisfy(p -> {
34-
assertThat(p.isSynthetic()).isFalse();
35-
assertThat(p.getName()).isEqualTo("notes");
36-
});
37-
}
22+
@Jira("https://hibernate.atlassian.net/browse/HHH-18841")
23+
@Test
24+
public void test(DomainModelScope scope) {
25+
final PersistentClass entityBinding = scope.getDomainModel().getEntityBinding(MyEntity.class.getName());
26+
assertThat(entityBinding.getProperties()).hasSize(2)
27+
.anySatisfy(p -> {
28+
assertThat(p.isSynthetic()).isTrue();
29+
assertThat(p.getName()).isEqualTo("_identifierMapper");
30+
})
31+
.anySatisfy(p -> {
32+
assertThat(p.isSynthetic()).isFalse();
33+
assertThat(p.getName()).isEqualTo("notes");
34+
});
35+
}
3836
}

tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import javax.lang.model.element.AnnotationValue;
1818
import javax.lang.model.element.Element;
1919
import javax.lang.model.element.ExecutableElement;
20+
import javax.lang.model.element.ModuleElement;
2021
import javax.lang.model.element.TypeElement;
2122
import javax.lang.model.type.DeclaredType;
2223
import javax.lang.model.type.TypeKind;
@@ -34,6 +35,7 @@
3435
import static java.lang.Boolean.parseBoolean;
3536
import static java.util.Collections.emptyList;
3637
import static org.hibernate.internal.util.collections.ArrayHelper.EMPTY_STRING_ARRAY;
38+
import static org.hibernate.processor.validation.ProcessorSessionFactory.findEntityByUnqualifiedName;
3739

3840
/**
3941
* @author Max Andersen
@@ -505,4 +507,26 @@ public Map<String,Set<String>> getEnumTypesByValue() {
505507
public void addEnumValue(String type, String value) {
506508
enumTypesByValue.computeIfAbsent( value, s -> new TreeSet<>() ).add( type );
507509
}
510+
511+
@Nullable
512+
public TypeElement entityType(String entityName) {
513+
final Elements elementUtils = getElementUtils();
514+
final String qualifiedName = qualifiedNameForEntityName(entityName);
515+
if ( qualifiedName != null ) {
516+
return elementUtils.getTypeElement(qualifiedName);
517+
}
518+
TypeElement symbol =
519+
findEntityByUnqualifiedName( entityName,
520+
elementUtils.getModuleElement("") );
521+
if ( symbol != null ) {
522+
return symbol;
523+
}
524+
for ( ModuleElement module : elementUtils.getAllModuleElements() ) {
525+
symbol = findEntityByUnqualifiedName( entityName, module );
526+
if ( symbol != null ) {
527+
return symbol;
528+
}
529+
}
530+
return null;
531+
}
508532
}

tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMeta.java

Lines changed: 1 addition & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,12 @@
1313
import org.hibernate.processor.util.Constants;
1414
import org.hibernate.processor.validation.ProcessorSessionFactory;
1515
import org.hibernate.processor.validation.Validation;
16-
import org.hibernate.query.sqm.SqmExpressible;
1716
import org.hibernate.query.sqm.tree.SqmStatement;
1817
import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
19-
import org.hibernate.query.sqm.tree.select.SqmSelectableNode;
20-
import org.hibernate.type.descriptor.java.JavaType;
2118

2219
import javax.lang.model.element.AnnotationMirror;
2320
import javax.lang.model.element.AnnotationValue;
2421
import javax.lang.model.element.Element;
25-
import javax.lang.model.element.ModuleElement;
26-
import javax.lang.model.element.TypeElement;
27-
import javax.lang.model.util.Elements;
2822
import java.util.List;
2923

3024
import static java.lang.Character.isJavaIdentifierStart;
@@ -35,9 +29,8 @@
3529
import static org.hibernate.processor.util.TypeUtils.containsAnnotation;
3630
import static org.hibernate.processor.util.TypeUtils.getAnnotationMirror;
3731
import static org.hibernate.processor.util.TypeUtils.getAnnotationValue;
38-
import static org.hibernate.processor.validation.ProcessorSessionFactory.findEntityByUnqualifiedName;
3932

40-
public abstract class AnnotationMeta implements Metamodel {
33+
public abstract class AnnotationMeta implements Metamodel, ResultTypeSupplier {
4134

4235
void addAuxiliaryMembers() {
4336
addAuxiliaryMembersForAnnotation( NAMED_QUERY, "QUERY_" );
@@ -142,26 +135,6 @@ private void handleNamedQuery(AnnotationMirror mirror, boolean checkHql) {
142135
}
143136
}
144137

145-
private @Nullable String resultType(SqmSelectStatement<?> selectStatement) {
146-
final JavaType<?> javaType = selectStatement.getSelection().getJavaTypeDescriptor();
147-
if ( javaType != null ) {
148-
return javaType.getTypeName();
149-
}
150-
else {
151-
final List<SqmSelectableNode<?>> items =
152-
selectStatement.getQuerySpec().getSelectClause().getSelectionItems();
153-
final SqmExpressible<?> expressible;
154-
if ( items.size() == 1 && ( expressible = items.get( 0 ).getExpressible() ) != null ) {
155-
final String typeName = expressible.getTypeName();
156-
final TypeElement entityType = entityType( typeName );
157-
return entityType == null ? typeName : entityType.getQualifiedName().toString();
158-
}
159-
else {
160-
return "Object[]";
161-
}
162-
}
163-
}
164-
165138
private static boolean isQueryMethodName(String name) {
166139
return name.length() >= 2
167140
&& name.charAt(0) == '#'
@@ -288,26 +261,4 @@ public void syntaxError(
288261
}
289262
}
290263
}
291-
292-
private @Nullable TypeElement entityType(String entityName) {
293-
final Context context = getContext();
294-
final Elements elementUtils = context.getElementUtils();
295-
final String qualifiedName = context.qualifiedNameForEntityName(entityName);
296-
if ( qualifiedName != null ) {
297-
return elementUtils.getTypeElement(qualifiedName);
298-
}
299-
TypeElement symbol =
300-
findEntityByUnqualifiedName( entityName,
301-
elementUtils.getModuleElement("") );
302-
if ( symbol != null ) {
303-
return symbol;
304-
}
305-
for ( ModuleElement module : elementUtils.getAllModuleElements() ) {
306-
symbol = findEntityByUnqualifiedName( entityName, module );
307-
if ( symbol != null ) {
308-
return symbol;
309-
}
310-
}
311-
return null;
312-
}
313264
}

tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NamedQueryMethod.java

Lines changed: 7 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,15 @@
1212
import org.hibernate.query.sqm.SqmExpressible;
1313
import org.hibernate.query.sqm.tree.expression.SqmParameter;
1414
import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
15-
import org.hibernate.query.sqm.tree.select.SqmSelectableNode;
16-
import org.hibernate.type.descriptor.java.JavaType;
1715

18-
import javax.lang.model.element.ModuleElement;
19-
import javax.lang.model.element.TypeElement;
20-
import javax.lang.model.util.Elements;
21-
import java.util.List;
2216
import java.util.TreeSet;
2317

2418
import static org.hibernate.processor.util.StringUtil.nameToFieldName;
25-
import static org.hibernate.processor.validation.ProcessorSessionFactory.findEntityByUnqualifiedName;
2619

2720
/**
2821
* @author Gavin King
2922
*/
30-
class NamedQueryMethod implements MetaAttribute {
23+
class NamedQueryMethod implements MetaAttribute, ResultTypeSupplier {
3124
private final AnnotationMeta annotationMeta;
3225
private final SqmSelectStatement<?> select;
3326
private final String name;
@@ -53,6 +46,11 @@ public NamedQueryMethod(
5346
this.addNonnullAnnotation = addNonnullAnnotation;
5447
}
5548

49+
@Override
50+
public Context getContext() {
51+
return annotationMeta.getContext();
52+
}
53+
5654
@Override
5755
public boolean hasTypedAttribute() {
5856
return true;
@@ -96,27 +94,6 @@ private String fieldName() {
9694
return "QUERY_" + nameToFieldName(name);
9795
}
9896

99-
private String returnType() {
100-
final JavaType<?> javaType = select.getSelection().getJavaTypeDescriptor();
101-
if ( javaType != null ) {
102-
return javaType.getTypeName();
103-
}
104-
else {
105-
final List<SqmSelectableNode<?>> items =
106-
select.getQuerySpec().getSelectClause().getSelectionItems();
107-
final SqmExpressible<?> expressible;
108-
if ( items.size() == 1 && ( expressible = items.get( 0 ).getExpressible() ) != null ) {
109-
final String typeName = expressible.getTypeName();
110-
final TypeElement entityType = entityType( typeName );
111-
return entityType == null ? typeName : entityType.getQualifiedName().toString();
112-
113-
}
114-
else {
115-
return "Object[]";
116-
}
117-
}
118-
}
119-
12097
void notNull(StringBuilder declaration) {
12198
if ( addNonnullAnnotation ) {
12299
declaration
@@ -149,7 +126,7 @@ private void returnType(StringBuilder declaration) {
149126
declaration
150127
.append(annotationMeta.importType(Constants.LIST))
151128
.append('<')
152-
.append(annotationMeta.importType(returnType()))
129+
.append(annotationMeta.importType(resultType( select )))
153130
.append("> ")
154131
.append(name);
155132
if ( reactive ) {
@@ -193,28 +170,6 @@ private String parameterType(SqmParameter<?> param) {
193170
return "unknown".equals(paramType) ? "Object" : annotationMeta.importType(paramType);
194171
}
195172

196-
private @Nullable TypeElement entityType(String entityName) {
197-
final Context context = annotationMeta.getContext();
198-
final Elements elementUtils = context.getElementUtils();
199-
final String qualifiedName = context.qualifiedNameForEntityName(entityName);
200-
if ( qualifiedName != null ) {
201-
return elementUtils.getTypeElement(qualifiedName);
202-
}
203-
TypeElement symbol =
204-
findEntityByUnqualifiedName( entityName,
205-
elementUtils.getModuleElement("") );
206-
if ( symbol != null ) {
207-
return symbol;
208-
}
209-
for ( ModuleElement module : elementUtils.getAllModuleElements() ) {
210-
symbol = findEntityByUnqualifiedName( entityName, module );
211-
if ( symbol != null ) {
212-
return symbol;
213-
}
214-
}
215-
return null;
216-
}
217-
218173
@Override
219174
public String getAttributeNameDeclarationString() {
220175
throw new UnsupportedOperationException("operation not supported");
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.processor.annotation;
6+
7+
import org.hibernate.processor.Context;
8+
import org.hibernate.query.sqm.SqmExpressible;
9+
import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
10+
import org.hibernate.query.sqm.tree.select.SqmSelectableNode;
11+
12+
import javax.lang.model.element.TypeElement;
13+
import java.util.List;
14+
15+
public interface ResultTypeSupplier {
16+
17+
Context getContext();
18+
19+
default String resultType(SqmSelectStatement<?> selectStatement) {
20+
final String javaTypeName = selectStatement.getSelection().getJavaTypeName();
21+
if ( javaTypeName != null ) {
22+
return javaTypeName;
23+
}
24+
else {
25+
final List<SqmSelectableNode<?>> items =
26+
selectStatement.getQuerySpec().getSelectClause().getSelectionItems();
27+
final SqmExpressible<?> expressible;
28+
if ( items.size() == 1 && (expressible = items.get( 0 ).getExpressible()) != null ) {
29+
final String typeName = expressible.getTypeName();
30+
final TypeElement entityType = getContext().entityType( typeName );
31+
return entityType == null ? typeName : entityType.getQualifiedName().toString();
32+
}
33+
else {
34+
return "Object[]";
35+
}
36+
}
37+
}
38+
}

0 commit comments

Comments
 (0)