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

yuu-nkjm / sorm4j / #545

15 Mar 2025 02:16AM UTC coverage: 95.03% (+0.1%) from 94.934%
#545

push

Yuu NAKAJIMA
Add SelectCsvReadSql.java

828 of 928 branches covered (89.22%)

Branch coverage included in aggregate %.

4315 of 4484 relevant lines covered (96.23%)

0.96 hits per line

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

96.23
/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());
58

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

1✔
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
    }
1✔
78
    return candidates;
1✔
79
  }
80

1✔
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 =
93
        metaData.getTables(null, null, "%", new String[] {"TABLE", "VIEW"})) {
94
      while (resultSet.next()) {
1✔
95
        // 3. TABLE_NAME String => table name
1✔
96
        String tableNameOnDb = resultSet.getString(3);
1✔
97
        if (SormContext.getDefaultCanonicalStringCache().containsCanonicalName(tableNameCandidates, tableNameOnDb)) {
98
          return Optional.of(tableNameOnDb);
1✔
99
        }
1✔
100
      }
1✔
101
      return Optional.empty();
1✔
102
    } catch (Exception e) {
103
      return Optional.empty();
104
    }
1✔
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