From d53498910a9b0fc069c442049bc3a94121d456a3 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Sat, 21 Sep 2024 11:10:10 +0200 Subject: [PATCH] cleanup processor StringUtil --- .../hibernate/processor/util/StringUtil.java | 95 +++++++++---------- .../processor/xml/JpaDescriptorParser.java | 24 ++--- .../processor/xml/XmlMetaEntity.java | 9 +- 3 files changed, 63 insertions(+), 65 deletions(-) diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/StringUtil.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/StringUtil.java index 8520e1302b..83bc5a54fa 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/StringUtil.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/StringUtil.java @@ -14,90 +14,83 @@ * @author Hardy Ferentschik */ public final class StringUtil { - private static final String NAME_SEPARATOR = "."; - private static final String PROPERTY_PREFIX_GET = "get"; - private static final String PROPERTY_PREFIX_IS = "is"; - private static final String PROPERTY_PREFIX_HAS = "has"; + private static final String GET = "get"; + private static final String IS = "is"; + private static final String HAS = "has"; private StringUtil() { } public static String determineFullyQualifiedClassName(String defaultPackage, String name) { - if ( isFullyQualified( name ) ) { - return name; - } - else { - return defaultPackage + NAME_SEPARATOR + name; - } + return isFullyQualified( name ) ? name : defaultPackage + "." + name; } public static boolean isFullyQualified(String name) { - return name.contains( NAME_SEPARATOR ); + return name.contains("."); } - public static String packageNameFromFqcn(String fqcn) { - return fqcn.substring( 0, fqcn.lastIndexOf( NAME_SEPARATOR ) ); + public static String packageNameFromFullyQualifiedName(String fullyQualifiedName) { + return fullyQualifiedName.substring( 0, fullyQualifiedName.lastIndexOf(".") ); } - public static String classNameFromFqcn(String fqcn) { - return fqcn.substring( fqcn.lastIndexOf( NAME_SEPARATOR ) + 1 ); + public static String classNameFromFullyQualifiedName(String fullyQualifiedName) { + return fullyQualifiedName.substring( fullyQualifiedName.lastIndexOf(".") + 1 ); } - public static boolean isProperty(String methodName, String returnTypeAsString) { - if ( methodName == null || "void".equals( returnTypeAsString ) ) { + public static boolean isProperty(String methodName, String returnType) { + if ( methodName == null ) { return false; } - - if ( isValidPropertyName( methodName, PROPERTY_PREFIX_GET ) ) { - return true; + else { + return !isVoid( returnType ) + && isValidPropertyName( methodName, GET ) + || isBoolean( returnType ) + && ( isValidPropertyName( methodName, IS ) + || isValidPropertyName( methodName, HAS ) ); } - if ( isValidPropertyName( methodName, PROPERTY_PREFIX_IS ) - || isValidPropertyName( methodName, PROPERTY_PREFIX_HAS ) ) { - return isBooleanGetter( returnTypeAsString ); - } - - return false; } - private static boolean isBooleanGetter(String type) { - return "Boolean".equals( type ) || "java.lang.Boolean".equals( type ); + private static boolean isVoid(String returnType) { + return "void".equals( returnType ); + } + + private static boolean isBoolean(String type) { + return "Boolean".equals( type ) || "java.lang.Boolean".equals( type ) || "boolean".equals( type ); } private static boolean isValidPropertyName(String name, String prefix) { - if ( !name.startsWith( prefix ) ) { - return false; - } - // the name has to start with the prefix and have at least one more character - return name.length() >= prefix.length() + 1; + return name.startsWith( prefix ) && name.length() > prefix.length(); } public static String getPropertyName(String name) { - String tmp = name; - if ( name.startsWith( PROPERTY_PREFIX_GET ) ) { - tmp = name.replaceFirst( PROPERTY_PREFIX_GET, "" ); + return decapitalize( trimPropertyPrefix( name ) ); + } + + private static String trimPropertyPrefix(String name) { + if ( name.startsWith( GET ) ) { + return name.replaceFirst( GET, "" ); } - else if ( name.startsWith( PROPERTY_PREFIX_IS ) ) { - tmp = name.replaceFirst( PROPERTY_PREFIX_IS, "" ); + else if ( name.startsWith( IS ) ) { + return name.replaceFirst( IS, "" ); } - else if ( name.startsWith( PROPERTY_PREFIX_HAS ) ) { - tmp = name.replaceFirst( PROPERTY_PREFIX_HAS, "" ); + else if ( name.startsWith( HAS ) ) { + return name.replaceFirst( HAS, "" ); + } + else { + return name; } - return decapitalize( tmp ); } public static String decapitalize(String string) { - if ( string == null || string.isEmpty() || startsWithSeveralUpperCaseLetters( string ) ) { - return string; - } - else { - return string.substring( 0, 1 ).toLowerCase(Locale.ROOT) + string.substring( 1 ); - } + return string == null || string.isEmpty() || startsWithSeveralUpperCaseLetters( string ) + ? string + : string.substring( 0, 1 ).toLowerCase(Locale.ROOT) + string.substring( 1 ); } public static String nameToFieldName(String name){ - return getUpperUnderscoreCaseFromLowerCamelCase(nameToMethodName(name)); + return getUpperUnderscoreCaseFromLowerCamelCase( nameToMethodName( name ) ); } public static String nameToMethodName(String name) { @@ -119,8 +112,8 @@ public static String getUpperUnderscoreCaseFromLowerCamelCase(String lowerCamelC } private static boolean startsWithSeveralUpperCaseLetters(String string) { - return string.length() > 1 && - Character.isUpperCase( string.charAt( 0 ) ) && - Character.isUpperCase( string.charAt( 1 ) ); + return string.length() > 1 + && isUpperCase( string.charAt( 0 ) ) + && isUpperCase( string.charAt( 1 ) ); } } diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/JpaDescriptorParser.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/JpaDescriptorParser.java index 3e19e8a563..c99b6d5ab0 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/JpaDescriptorParser.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/JpaDescriptorParser.java @@ -39,13 +39,15 @@ import org.hibernate.processor.Context; import org.hibernate.processor.util.AccessTypeInformation; import org.hibernate.processor.util.FileTimeStampChecker; -import org.hibernate.processor.util.StringUtil; import org.hibernate.processor.util.TypeUtils; import org.hibernate.processor.util.xml.XmlParserHelper; import jakarta.persistence.AccessType; import org.checkerframework.checker.nullness.qual.Nullable; +import static org.hibernate.processor.util.StringUtil.determineFullyQualifiedClassName; +import static org.hibernate.processor.util.StringUtil.packageNameFromFullyQualifiedName; + /** * Parser for JPA XML descriptors (persistence.xml and referenced mapping files). * @@ -259,7 +261,7 @@ private FileTimeStampChecker loadTimeStampCache() { private void parseEntities(List entities, String defaultPackageName) { for ( JaxbEntityImpl entity : entities ) { - String fqcn = StringUtil.determineFullyQualifiedClassName( defaultPackageName, entity.getClazz() ); + String fqcn = determineFullyQualifiedClassName( defaultPackageName, entity.getClazz() ); if ( !xmlMappedTypeExists( fqcn ) ) { context.logMessage( @@ -286,9 +288,9 @@ private void parseEmbeddable( List embeddables, String defaultPackageName) { for ( JaxbEmbeddableImpl embeddable : embeddables ) { - String fqcn = StringUtil.determineFullyQualifiedClassName( defaultPackageName, embeddable.getClazz() ); + String fqcn = determineFullyQualifiedClassName( defaultPackageName, embeddable.getClazz() ); // we have to extract the package name from the fqcn. Maybe the entity was setting a fqcn directly - String pkg = StringUtil.packageNameFromFqcn( fqcn ); + String pkg = packageNameFromFullyQualifiedName( fqcn ); if ( !xmlMappedTypeExists( fqcn ) ) { context.logMessage( @@ -313,11 +315,11 @@ private void parseMappedSuperClass( List mappedSuperClasses, String defaultPackageName) { for ( JaxbMappedSuperclassImpl mappedSuperClass : mappedSuperClasses ) { - String fqcn = StringUtil.determineFullyQualifiedClassName( + String fqcn = determineFullyQualifiedClassName( defaultPackageName, mappedSuperClass.getClazz() ); // we have to extract the package name from the fqcn. Maybe the entity was setting a fqcn directly - String pkg = StringUtil.packageNameFromFqcn( fqcn ); + String pkg = packageNameFromFullyQualifiedName( fqcn ); if ( !xmlMappedTypeExists( fqcn ) ) { context.logMessage( @@ -367,7 +369,7 @@ private void determineXmlAccessTypes() { for ( JaxbEntityImpl entity : mappings.getEntities() ) { final String name = entity.getClazz(); - fqcn = StringUtil.determineFullyQualifiedClassName( packageName, name ); + fqcn = determineFullyQualifiedClassName( packageName, name ); final AccessType explicitAccessType = entity.getAccess(); final AccessTypeInformation accessInfo = new AccessTypeInformation( fqcn, explicitAccessType, defaultAccessType ); context.addAccessTypeInformation( fqcn, accessInfo ); @@ -375,7 +377,7 @@ private void determineXmlAccessTypes() { for ( JaxbMappedSuperclassImpl mappedSuperClass : mappings.getMappedSuperclasses() ) { final String name = mappedSuperClass.getClazz(); - fqcn = StringUtil.determineFullyQualifiedClassName( packageName, name ); + fqcn = determineFullyQualifiedClassName( packageName, name ); final AccessType explicitAccessType = mappedSuperClass.getAccess(); final AccessTypeInformation accessInfo = new AccessTypeInformation( fqcn, explicitAccessType, defaultAccessType ); context.addAccessTypeInformation( fqcn, accessInfo ); @@ -383,7 +385,7 @@ private void determineXmlAccessTypes() { for ( JaxbEmbeddableImpl embeddable : mappings.getEmbeddables() ) { final String name = embeddable.getClazz(); - fqcn = StringUtil.determineFullyQualifiedClassName( packageName, name ); + fqcn = determineFullyQualifiedClassName( packageName, name ); final AccessType explicitAccessType = embeddable.getAccess(); final AccessTypeInformation accessInfo = new AccessTypeInformation( fqcn, explicitAccessType, defaultAccessType ); context.addAccessTypeInformation( fqcn, accessInfo ); @@ -398,7 +400,7 @@ private void determineAnnotationAccessTypes() { for ( JaxbEntityImpl entity : mappings.getEntities() ) { String name = entity.getClazz(); - fqcn = StringUtil.determineFullyQualifiedClassName( packageName, name ); + fqcn = determineFullyQualifiedClassName( packageName, name ); TypeElement element = context.getTypeElementForFullyQualifiedName( fqcn ); if ( element != null ) { TypeUtils.determineAccessTypeForHierarchy( element, context ); @@ -407,7 +409,7 @@ private void determineAnnotationAccessTypes() { for ( JaxbMappedSuperclassImpl mappedSuperClass : mappings.getMappedSuperclasses() ) { String name = mappedSuperClass.getClazz(); - fqcn = StringUtil.determineFullyQualifiedClassName( packageName, name ); + fqcn = determineFullyQualifiedClassName( packageName, name ); TypeElement element = context.getTypeElementForFullyQualifiedName( fqcn ); if ( element != null ) { TypeUtils.determineAccessTypeForHierarchy( element, context ); diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/XmlMetaEntity.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/XmlMetaEntity.java index c1e5808562..8dab3cdeea 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/XmlMetaEntity.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/xml/XmlMetaEntity.java @@ -48,7 +48,10 @@ import static jakarta.persistence.AccessType.FIELD; import static java.util.Collections.emptyList; +import static org.hibernate.processor.util.StringUtil.classNameFromFullyQualifiedName; import static org.hibernate.processor.util.StringUtil.determineFullyQualifiedClassName; +import static org.hibernate.processor.util.StringUtil.isFullyQualified; +import static org.hibernate.processor.util.StringUtil.packageNameFromFullyQualifiedName; import static org.hibernate.processor.util.TypeUtils.extractClosestRealTypeAsString; import static org.hibernate.processor.util.TypeUtils.findMappedSuperClass; import static org.hibernate.processor.util.TypeUtils.getElementKindForAccessType; @@ -121,11 +124,11 @@ private XmlMetaEntity(String clazz, String defaultPackageName, TypeElement eleme this.defaultPackageName = defaultPackageName; String className = clazz; String pkg = defaultPackageName; - if ( StringUtil.isFullyQualified( className ) ) { + if ( isFullyQualified( className ) ) { // if the class name is fully qualified we have to extract the package name from the fqcn. // default package name gets ignored - pkg = StringUtil.packageNameFromFqcn( className ); - className = StringUtil.classNameFromFqcn( clazz ); + pkg = packageNameFromFullyQualifiedName( className ); + className = classNameFromFullyQualifiedName( clazz ); } this.clazzName = className; this.packageName = pkg;