/** * {@inheritDoc} */ @Override public Class[] resolveTables() { List<Class> classes = new ArrayList<>(tableNames.length); String lastTableName = null; resultColumns.clear(); for (int i = 0; i < tableNames.length; i++) { String tableName = tableNames[i]; String columnName = columnNames[i]; if (tableName == null) { // maybe JDBC driver does not support it throw new DbOomException(dbOomQuery, "Table name missing in meta-data"); } if ((!tableName.equals(lastTableName)) || (resultColumns.contains(columnName))) { resultColumns.clear(); lastTableName = tableName; DbEntityDescriptor ded = dbEntityManager.lookupTableName(tableName); if (ded == null) { throw new DbOomException(dbOomQuery, "Table name not registered: " + tableName); } classes.add(ded.getType()); } resultColumns.add(columnName); } return classes.toArray(new Class[0]); }
/** * Resolves {@link jodd.db.oom.DbEntityDescriptor} for all given types, * so not to repeat every time. */ protected DbEntityDescriptor[] resolveDbEntityDescriptors(final Class[] types) { if (cachedDbEntityDescriptors == null) { DbEntityDescriptor[] descs = new DbEntityDescriptor[types.length]; for (int i = 0; i < types.length; i++) { Class type = types[i]; if (type != null) { descs[i] = dbEntityManager.lookupType(type); } } cachedDbEntityDescriptors = descs; } return cachedDbEntityDescriptors; }
@Override @BeforeEach protected void setUp() throws Exception { super.setUp(); DbEntityManager dbEntityManager = DbOom.get().entityManager(); dbEntityManager.registerEntity(Boy4.class); dbEntityManager.registerEntity(Girl4.class); dbEntityManager.registerEntity(Room.class); }
/** * Registers entity. Existing entity will be removed if exist, so no exception will be thrown. */ public <E> DbEntityDescriptor<E> registerEntity(final Class<E> type, final boolean force) { if (force) { removeEntity(type); } return registerEntity(type); }
/** * Registers a class consumer that registers only those annotated with {@link DbTable}. * Because of performance purposes, classes are not dynamically loaded; instead, their * file content is examined. */ public void registerAsConsumer(final ClassScanner classScanner) { classScanner.registerEntryConsumer(classPathEntry -> { if (!classPathEntry.isTypeSignatureInUse(DB_TABLE_ANNOTATION_BYTES)) { return; } final Class<?> beanClass; try { beanClass = classPathEntry.loadClass(); } catch (ClassNotFoundException cnfex) { throw new DbOomException("Entry class not found: " + classPathEntry.name(), cnfex); } if (beanClass == null) { return; } final DbTable dbTable = beanClass.getAnnotation(DbTable.class); if (dbTable == null) { return; } if (registerAsEntities) { dbEntityManager.registerEntity(beanClass); } else { dbEntityManager.registerType(beanClass); } }); }
dbEntityManager.registerEntity(Tester.class); DbEntityDescriptor ded = dbEntityManager.lookupType(Tester.class); assertEquals("TESTER", ded.getTableName()); assertNotNull(dbEntityManager.lookupTableName("TESTER")); assertNotNull(dbEntityManager.lookupTableName("tester")); assertNotNull(dbEntityManager.lookupTableName("Tester")); assertNotNull(dbEntityManager.lookupTableName("TesTer")); dbEntityManager.reset(); DbOom.get().config().getTableNames().setLowercase(true); dbEntityManager.registerEntity(Tester.class); ded = dbEntityManager.lookupType(Tester.class); assertEquals("tester", ded.getTableName()); assertNotNull(dbEntityManager.lookupTableName("TESTER")); assertNotNull(dbEntityManager.lookupTableName("tester")); assertNotNull(dbEntityManager.lookupTableName("Tester")); assertNotNull(dbEntityManager.lookupTableName("TesTer")); dbEntityManager.reset(); DbOom.get().config().getTableNames().setChangeCase(false); DbOom.get().config().getTableNames().setSplitCamelCase(false); dbEntityManager.registerEntity(Tester.class); ded = dbEntityManager.lookupType(Tester.class); assertEquals("Tester", ded.getTableName());
assertEquals(2, dbEntityManager.getTotalTypes()); assertEquals(0, dbEntityManager.getTotalTableNames()); assertEquals(2, dbEntityManager.getTotalNames()); dbEntityManager.registerEntity(Girl.class, true); girl = q.find(); checkGirl1(girl); assertEquals(2, dbEntityManager.getTotalTypes()); assertEquals(1, dbEntityManager.getTotalTableNames()); assertEquals(2, dbEntityManager.getTotalNames()); dbEntityManager.registerEntity(Girl2.class, true); Girl2 g2 = new Girl2("Gwen"); q = dbOom.entities().insert(g2).query();
/** * Lookups {@link DbEntityDescriptor} for some type and registers the type if is new. * <p> * Returns <code>null</code> for core classes from <code>java</code> run-time packages! * Some types are <b>not</b> entities, i.e. domain objects. Instead, primitive entities * are simply mapped to one column. */ public <E> DbEntityDescriptor<E> lookupType(final Class<E> type) { String typeName = type.getName(); if (StringUtil.startsWithOne(typeName, primitiveEntitiesPrefixes) != -1) { return null; } DbEntityDescriptor<E> ded = descriptorsMap.get(type); if (ded == null) { ded = registerType(type); } return ded; }
/** * Configures {@link DbEntityManager} with specified class path. */ public void configure() { long elapsed = System.currentTimeMillis(); final ClassScanner classScanner = new ClassScanner(); classScanner.detectEntriesMode(true); classScanner.scanDefaultClasspath(); classScannerConsumers.accept(classScanner); registerAsConsumer(classScanner); try { classScanner.start(); } catch (Exception ex) { throw new DbOomException("Scan classpath error", ex); } elapsed = System.currentTimeMillis() - elapsed; if (log.isInfoEnabled()) { log.info("DbEntityManager configured in " + elapsed + "ms. Total entities: " + dbEntityManager.getTotalNames()); } }
dbEntityManager.reset();
/** * Removes entity and returns removed descriptor. */ public <E> DbEntityDescriptor<E> removeEntity(final Class<E> type) { DbEntityDescriptor<E> ded = descriptorsMap.remove(type); if (ded == null) { ded = createDbEntityDescriptor(type); } entityNamesMap.remove(ded.getEntityName()); tableNamesMap.remove(ded.getTableName()); return ded; }
public void printEntities(final int width) { if (!databaseEnabled) { return; } final List<DbEntityDescriptor> list = new ArrayList<>(); dbOom.entityManager().forEachEntity(list::add); if (list.isEmpty()) { return; } final Print print = new Print(); print.line("Entities", width); list.stream() .sorted(Comparator.comparing(DbEntityDescriptor::getEntityName)) .forEach(ded -> print.outLeftRightNewLine( Chalk256.chalk().yellow(), ded.getTableName(), Chalk256.chalk().blue(), ClassUtil.getShortClassName(ded.getType(), 2), width)); print.line(width); } }
/** * Creates new DbOom. */ public DbOom( final ConnectionProvider connectionProvider, final DbSessionProvider dbSessionProvider, final QueryMap queryMap) { this.connectionProvider = connectionProvider; this.dbSessionProvider = dbSessionProvider; this.queryMap = queryMap; this.dbOomConfig = new DbOomConfig(); this.dbQueryConfig = new DbQueryConfig(); this.dbEntityManager = new DbEntityManager(dbOomConfig); this.dbEntitySql = new DbEntitySql(this); // static init if (defaultDbOom == null) { log.info("Default DbOom is created."); defaultDbOom = this; } else { log.warn("Multiple DbOom detected."); defaultDbOom = null; } }
result[currentResult] = dbEntityManager.createEntityInstance(currentType);
@BeforeEach void setUp() { dbOom = DbOom.create().get(); DbEntityManager dbEntityManager = DbOom.get().entityManager(); dbEntityManager.registerType(Boy.class); dbEntityManager.registerType(BadBoy.class); dbEntityManager.registerType(BadGirl.class); dbEntityManager.registerType(Girl.class); }
/** * Registers a class consumer that registers only those annotated with {@link DbTable}. * Because of performance purposes, classes are not dynamically loaded; instead, their * file content is examined. */ public void registerAsConsumer(final ClassScanner classScanner) { classScanner.registerEntryConsumer(classPathEntry -> { if (!classPathEntry.isTypeSignatureInUse(DB_TABLE_ANNOTATION_BYTES)) { return; } final Class<?> beanClass; try { beanClass = classPathEntry.loadClass(); } catch (ClassNotFoundException cnfex) { throw new DbOomException("Entry class not found: " + classPathEntry.name(), cnfex); } if (beanClass == null) { return; } final DbTable dbTable = beanClass.getAnnotation(DbTable.class); if (dbTable == null) { return; } if (registerAsEntities) { dbEntityManager.registerEntity(beanClass); } else { dbEntityManager.registerType(beanClass); } }); }
/** * Registers entity. Existing entity will be removed if exist, so no exception will be thrown. */ public <E> DbEntityDescriptor<E> registerEntity(final Class<E> type, final boolean force) { if (force) { removeEntity(type); } return registerEntity(type); }
/** * Configures {@link DbEntityManager} with specified class path. */ public void configure() { long elapsed = System.currentTimeMillis(); final ClassScanner classScanner = new ClassScanner(); classScanner.detectEntriesMode(true); classScanner.scanDefaultClasspath(); classScannerConsumers.accept(classScanner); registerAsConsumer(classScanner); try { classScanner.start(); } catch (Exception ex) { throw new DbOomException("Scan classpath error", ex); } elapsed = System.currentTimeMillis() - elapsed; if (log.isInfoEnabled()) { log.info("DbEntityManager configured in " + elapsed + "ms. Total entities: " + dbEntityManager.getTotalNames()); } }
dbEntityManager.reset();
/** * Registers just type and entity names. Enough for most usages. */ public <E> DbEntityDescriptor<E> registerType(final Class<E> type) { DbEntityDescriptor<E> ded = createDbEntityDescriptor(type); DbEntityDescriptor<E> existing = descriptorsMap.put(type, ded); if (log.isDebugEnabled()) { log.debug("Register " + type.getName() + " as " + ded.getTableName()); } if (existing != null) { if (ded.getType() == type) { return ded; } throw new DbOomException("Type already registered: " + existing.getType()); } existing = entityNamesMap.put(ded.getEntityName(), ded); if (existing != null) { throw new DbOomException("Name '" + ded.getEntityName() + "' already mapped to an entity: " + existing.getType()); } return ded; }