/* * Hibernate OGM, Domain model persistence for NoSQL datastores * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.ogm.service.impl; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.hibernate.boot.model.relational.Database; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.ogm.datastore.spi.SchemaDefiner; import org.hibernate.ogm.id.spi.PersistentNoSqlIdentifierGenerator; import org.hibernate.ogm.model.key.spi.AssociationKeyMetadata; import org.hibernate.ogm.model.key.spi.EntityKeyMetadata; import org.hibernate.ogm.model.key.spi.IdSourceKeyMetadata; import org.hibernate.ogm.persister.impl.OgmCollectionPersister; import org.hibernate.ogm.persister.impl.OgmEntityPersister; import org.hibernate.persister.collection.CollectionPersister; import org.hibernate.persister.entity.EntityPersister; /** * The one and only implementation of {@link SchemaDefiner.SchemaDefinitionContext}. * * @author Gunnar Morling */ public class DefaultSchemaInitializationContext implements SchemaDefiner.SchemaDefinitionContext { private final Database database; private final SessionFactoryImplementor factory; public DefaultSchemaInitializationContext(Database database, SessionFactoryImplementor factory) { this.database = database; this.factory = factory; } @Override public Database getDatabase() { return database; } @Override public Set<EntityKeyMetadata> getAllEntityKeyMetadata() { Set<EntityKeyMetadata> allEntityKeyMetadata = new HashSet<>(); for ( EntityPersister entityPersister : factory.getEntityPersisters().values() ) { allEntityKeyMetadata.add( ( (OgmEntityPersister) entityPersister ).getEntityKeyMetadata() ); } return allEntityKeyMetadata; } @Override public Set<AssociationKeyMetadata> getAllAssociationKeyMetadata() { Set<AssociationKeyMetadata> allAssociationKeyMetadata = new HashSet<>(); for ( CollectionPersister associationPersister : factory.getCollectionPersisters().values() ) { allAssociationKeyMetadata.add( ( (OgmCollectionPersister) associationPersister ).getAssociationKeyMetadata() ); } for ( EntityPersister entityPersister : factory.getEntityPersisters().values() ) { for ( String property : entityPersister.getPropertyNames() ) { AssociationKeyMetadata inverseOneToOneAssociationKeyMetadata = ( (OgmEntityPersister) entityPersister ).getInverseOneToOneAssociationKeyMetadata( property ); if ( inverseOneToOneAssociationKeyMetadata != null ) { allAssociationKeyMetadata.add( inverseOneToOneAssociationKeyMetadata ); } } } return allAssociationKeyMetadata; } @Override public Set<IdSourceKeyMetadata> getAllIdSourceKeyMetadata() { Set<IdSourceKeyMetadata> allIdSourceKeyMetadata = new HashSet<IdSourceKeyMetadata>(); for ( PersistentNoSqlIdentifierGenerator generator : getPersistentGenerators() ) { allIdSourceKeyMetadata.add( generator.getGeneratorKeyMetadata() ); } return allIdSourceKeyMetadata; } @Override public Map<String, Class<?>> getTableEntityTypeMapping() { Map<String, Class<?>> mapping = new HashMap<>(); Map<String, EntityPersister> entityPersisters = factory.getEntityPersisters(); for ( Entry<String, EntityPersister> entityPersisterEntry : entityPersisters.entrySet() ) { OgmEntityPersister entityPersister = (OgmEntityPersister) entityPersisterEntry.getValue(); mapping.put( entityPersister.getEntityKeyMetadata().getTable(), entityPersister.getMappedClass() ); } return mapping; } /** * Returns all the persistent id generators which potentially require the creation of an object in the schema. */ private Iterable<PersistentNoSqlIdentifierGenerator> getPersistentGenerators() { Map<String, EntityPersister> entityPersisters = factory.getEntityPersisters(); Set<PersistentNoSqlIdentifierGenerator> persistentGenerators = new HashSet<PersistentNoSqlIdentifierGenerator>( entityPersisters.size() ); for ( EntityPersister persister : entityPersisters.values() ) { if ( persister.getIdentifierGenerator() instanceof PersistentNoSqlIdentifierGenerator ) { persistentGenerators.add( (PersistentNoSqlIdentifierGenerator) persister.getIdentifierGenerator() ); } } return persistentGenerators; } @Override public SessionFactoryImplementor getSessionFactory() { return factory; } }