• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

yuu-nkjm / sorm4j / #528

13 Mar 2025 11:59PM UTC coverage: 94.85% (+0.7%) from 94.2%
#528

push

yuu-nkjm
Add tests

813 of 933 branches covered (87.14%)

Branch coverage included in aggregate %.

15 of 15 new or added lines in 5 files covered. (100.0%)

19 existing lines in 6 files now uncovered.

4804 of 4989 relevant lines covered (96.29%)

0.96 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.0
/sorm4j/src/main/java/org/nkjmlab/sorm4j/internal/context/impl/DefaultTableNameMapper.java
1
package org.nkjmlab.sorm4j.internal.context.impl;
2

3
import java.sql.DatabaseMetaData;
4
import java.sql.ResultSet;
5
import java.sql.SQLException;
6
import java.util.ArrayList;
7
import java.util.List;
8
import java.util.Optional;
9

10
import org.nkjmlab.sorm4j.common.exception.SormException;
11
import org.nkjmlab.sorm4j.context.SormContext;
12
import org.nkjmlab.sorm4j.context.TableNameMapper;
13
import org.nkjmlab.sorm4j.internal.util.ParameterizedStringFormatter;
14
import org.nkjmlab.sorm4j.mapping.annotation.OrmTableName;
15

16
/**
17
 * Default implementation of {@link TableNameMapper}
18
 *
19
 * @author nkjm
20
 */
21
public final class DefaultTableNameMapper implements TableNameMapper {
1✔
22

23
  private static final String ERROR_MESSAGE =
24
      "[{}] does not match any existing table in the database. Use @{} annotation or rename the class. Table name candidates were {}";
25

26
  @Override
27
  public String getTableName(String tableName, DatabaseMetaData metaData) {
28
    List<String> candidates = List.of(tableName);
1✔
29
    Object[] params = {tableName, OrmTableName.class.getSimpleName(), candidates};
1✔
30
    return convertToExactTableName(metaData, candidates)
1✔
31
        .orElseThrow(
1✔
32
            () ->
1✔
33
                new SormException(
1✔
34
                    ParameterizedStringFormatter.LENGTH_256.format(ERROR_MESSAGE, params)));
1✔
35
  }
36

37
  @Override
38
  public String getTableName(Class<?> objectClass, DatabaseMetaData metaData) {
39
    List<String> candidates = guessTableNameCandidates(objectClass);
1✔
40
    Object[] params = {objectClass.getName(), OrmTableName.class.getSimpleName(), candidates};
1✔
41
    return convertToExactTableName(metaData, candidates)
1✔
42
        .orElseThrow(
1✔
43
            () ->
1✔
44
                new SormException(
1✔
45
                    ParameterizedStringFormatter.LENGTH_256.format(ERROR_MESSAGE, params)));
1✔
46
  }
47

48
  /**
49
   * Guesses table name from the given object class.
50
   *
51
   * @param objectClass
52
   * @return
53
   */
54
  private List<String> guessTableNameCandidates(Class<?> objectClass) {
55

56
    Optional<String> annotatedTableName =
1✔
57
        Optional.ofNullable(objectClass.getAnnotation(OrmTableName.class)).map(a -> a.value());
1✔
58

59
    if (annotatedTableName.isPresent()) {
1✔
60
      return List.of(annotatedTableName.get());
1✔
61
    }
62

63
    String className = objectClass.getSimpleName();
1✔
64
    String cannonicalClassName = SormContext.getDefaultCanonicalStringCache().toCanonicalName(className);
1✔
65

66
    List<String> candidates =
1✔
67
        new ArrayList<>(
1✔
68
            List.of(
1✔
69
                cannonicalClassName,
1✔
70
                SormContext.getDefaultCanonicalStringCache().toCanonicalName(cannonicalClassName + "S"),
1✔
71
                SormContext.getDefaultCanonicalStringCache().toCanonicalName(cannonicalClassName + "ES")));
1✔
72
    if (cannonicalClassName.endsWith("Y")) {
1✔
73
      candidates.add(
1✔
74
          SormContext.getDefaultCanonicalStringCache()
1✔
75
              .toCanonicalName(
1✔
76
                  cannonicalClassName.substring(0, cannonicalClassName.length() - 1) + "IES"));
1✔
77
    }
78
    return candidates;
1✔
79
  }
80

81
  /**
82
   * Convert from the given table name candidates to the exact table name on the database.
83
   *
84
   * @param metaData
85
   * @param tableNameCandidates
86
   * @return
87
   * @throws SQLException
88
   * @see {@link java.sql.DatabaseMetaData#getTables}
89
   */
90
  private Optional<String> convertToExactTableName(
91
      DatabaseMetaData metaData, List<String> tableNameCandidates) {
92
    try (ResultSet resultSet =
1✔
93
        metaData.getTables(null, null, "%", new String[] {"TABLE", "VIEW"})) {
1✔
94
      while (resultSet.next()) {
1✔
95
        // 3. TABLE_NAME String => table name
96
        String tableNameOnDb = resultSet.getString(3);
1✔
97
        if (SormContext.getDefaultCanonicalStringCache().containsCanonicalName(tableNameCandidates, tableNameOnDb)) {
1✔
98
          return Optional.of(tableNameOnDb);
1✔
99
        }
100
      }
101
      return Optional.empty();
1✔
UNCOV
102
    } catch (Exception e) {
×
103
      return Optional.empty();
×
104
    }
105
  }
106
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc