package org.jboss.tools.hibernate.runtime.v_5_2.internal; import java.io.File; import java.lang.reflect.Constructor; import java.sql.Connection; import java.sql.SQLException; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Properties; import org.hibernate.Filter; import org.hibernate.Hibernate; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.JDBCMetaDataConfiguration; import org.hibernate.cfg.JDBCReaderFactory; import org.hibernate.cfg.reveng.DefaultDatabaseCollector; import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy; import org.hibernate.cfg.reveng.JDBCReader; import org.hibernate.cfg.reveng.OverrideRepository; import org.hibernate.cfg.reveng.ReverseEngineeringSettings; import org.hibernate.cfg.reveng.ReverseEngineeringStrategy; import org.hibernate.cfg.reveng.TableFilter; import org.hibernate.cfg.reveng.dialect.MetaDataDialect; import org.hibernate.console.HibernateConsoleRuntimeException; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl; import org.hibernate.engine.jdbc.dialect.spi.DatabaseMetaDataDialectResolutionInfoAdapter; import org.hibernate.engine.jdbc.dialect.spi.DialectFactory; import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo; import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfoSource; import org.hibernate.engine.query.spi.HQLQueryPlan; import org.hibernate.internal.SessionFactoryImpl; import org.hibernate.mapping.Array; import org.hibernate.mapping.Bag; import org.hibernate.mapping.Column; import org.hibernate.mapping.JoinedSubclass; import org.hibernate.mapping.ManyToOne; import org.hibernate.mapping.OneToMany; import org.hibernate.mapping.OneToOne; import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.PrimaryKey; import org.hibernate.mapping.PrimitiveArray; import org.hibernate.mapping.Property; import org.hibernate.mapping.RootClass; import org.hibernate.mapping.Set; import org.hibernate.mapping.SimpleValue; import org.hibernate.mapping.SingleTableSubclass; import org.hibernate.mapping.Table; import org.hibernate.proxy.HibernateProxyHelper; import org.hibernate.service.ServiceRegistry; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.tool.hbm2x.ArtifactCollector; import org.hibernate.tool.hbm2x.Cfg2HbmTool; import org.hibernate.tool.hbm2x.Exporter; import org.hibernate.tool.ide.completion.HQLCodeAssist; import org.hibernate.tool.util.ReflectHelper; import org.jboss.tools.hibernate.runtime.common.AbstractPersistentClassFacade; import org.jboss.tools.hibernate.runtime.common.AbstractService; import org.jboss.tools.hibernate.runtime.common.IFacade; import org.jboss.tools.hibernate.runtime.common.IFacadeFactory; import org.jboss.tools.hibernate.runtime.common.Util; import org.jboss.tools.hibernate.runtime.spi.IArtifactCollector; import org.jboss.tools.hibernate.runtime.spi.ICfg2HbmTool; import org.jboss.tools.hibernate.runtime.spi.IColumn; import org.jboss.tools.hibernate.runtime.spi.IConfiguration; import org.jboss.tools.hibernate.runtime.spi.IDatabaseCollector; import org.jboss.tools.hibernate.runtime.spi.IDialect; import org.jboss.tools.hibernate.runtime.spi.IEnvironment; import org.jboss.tools.hibernate.runtime.spi.IExporter; import org.jboss.tools.hibernate.runtime.spi.IHQLCodeAssist; import org.jboss.tools.hibernate.runtime.spi.IHQLQueryPlan; import org.jboss.tools.hibernate.runtime.spi.IHibernateMappingExporter; import org.jboss.tools.hibernate.runtime.spi.IJDBCReader; import org.jboss.tools.hibernate.runtime.spi.INamingStrategy; import org.jboss.tools.hibernate.runtime.spi.IOverrideRepository; import org.jboss.tools.hibernate.runtime.spi.IPersistentClass; import org.jboss.tools.hibernate.runtime.spi.IPrimaryKey; import org.jboss.tools.hibernate.runtime.spi.IProperty; import org.jboss.tools.hibernate.runtime.spi.IReverseEngineeringSettings; import org.jboss.tools.hibernate.runtime.spi.IReverseEngineeringStrategy; import org.jboss.tools.hibernate.runtime.spi.ISchemaExport; import org.jboss.tools.hibernate.runtime.spi.ISessionFactory; import org.jboss.tools.hibernate.runtime.spi.ITable; import org.jboss.tools.hibernate.runtime.spi.ITableFilter; import org.jboss.tools.hibernate.runtime.spi.ITypeFactory; import org.jboss.tools.hibernate.runtime.spi.IValue; import org.xml.sax.EntityResolver; public class ServiceImpl extends AbstractService { private static final String HIBERNATE_VERSION = "5.2"; private IFacadeFactory facadeFactory = new FacadeFactoryImpl(); @Override public IConfiguration newAnnotationConfiguration() { return newDefaultConfiguration(); } @Override public IConfiguration newJpaConfiguration( String entityResolver, String persistenceUnit, Map<Object, Object> overrides) { return facadeFactory.createConfiguration( new JPAConfiguration(persistenceUnit, overrides)); } @Override public IConfiguration newDefaultConfiguration() { getUsageTracker().trackNewConfigurationEvent(HIBERNATE_VERSION); return facadeFactory.createConfiguration(new Configuration()); } @Override public IHibernateMappingExporter newHibernateMappingExporter( IConfiguration hcfg, File file) { assert hcfg instanceof IFacade; HibernateMappingExporterExtension target = new HibernateMappingExporterExtension( facadeFactory, (Configuration)((IFacade)hcfg).getTarget(), file); return facadeFactory.createHibernateMappingExporter(target); } @Override public ISchemaExport newSchemaExport(IConfiguration hcfg) { ISchemaExport result = null; if (hcfg instanceof IFacade) { result = facadeFactory.createSchemaExport(new SchemaExport()); } return result; } @Override public IHQLCodeAssist newHQLCodeAssist(IConfiguration hcfg) { IHQLCodeAssist result = null; if (hcfg instanceof IFacade) { result = facadeFactory.createHQLCodeAssist( new HQLCodeAssist((Configuration)((IFacade)hcfg).getTarget())); } return result; } @Override public IConfiguration newJDBCMetaDataConfiguration() { return facadeFactory.createConfiguration(new JDBCMetaDataConfiguration()); } @Override public IExporter createExporter(String exporterClassName) { Exporter exporter = (Exporter)Util.getInstance( exporterClassName, facadeFactory.getClassLoader()); return facadeFactory.createExporter(exporter); } @Override public IArtifactCollector newArtifactCollector() { return facadeFactory.createArtifactCollector(new ArtifactCollector()); } @Override public IHQLQueryPlan newHQLQueryPlan(String query, boolean shallow, ISessionFactory sessionFactory) { SessionFactoryImpl factory = (SessionFactoryImpl) ((IFacade)sessionFactory).getTarget(); Map<String, Filter> enabledFilters = Collections.emptyMap(); HQLQueryPlan queryPlan = new HQLQueryPlan(query, shallow, enabledFilters, factory); return facadeFactory.createHQLQueryPlan(queryPlan); } @Override public ITypeFactory newTypeFactory() { // target for ITypeFactory is a dummy Object return facadeFactory.createTypeFactory(); } @Override public INamingStrategy newNamingStrategy(String strategyClassName) { try { return facadeFactory.createNamingStrategy( Class.forName(strategyClassName).newInstance()); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { return null; } } @Override public IOverrideRepository newOverrideRepository() { return facadeFactory.createOverrideRepository(new OverrideRepository()); } @Override public ITableFilter newTableFilter() { return facadeFactory.createTableFilter(new TableFilter()); } @Override public IReverseEngineeringSettings newReverseEngineeringSettings( IReverseEngineeringStrategy res) { assert res instanceof IFacade; return facadeFactory.createReverseEngineeringSettings( new ReverseEngineeringSettings( (ReverseEngineeringStrategy)((IFacade)res).getTarget())); } @Override public IReverseEngineeringStrategy newDefaultReverseEngineeringStrategy() { return facadeFactory.createReverseEngineeringStrategy( new DefaultReverseEngineeringStrategy()); } @Override public IJDBCReader newJDBCReader( IConfiguration configuration, IReverseEngineeringStrategy strategy) { assert strategy instanceof IFacade; JDBCReader target = JDBCReaderFactory.newJDBCReader( configuration.getProperties(), (ReverseEngineeringStrategy)((IFacade)strategy).getTarget(), buildServiceRegistry(configuration.getProperties())); return facadeFactory.createJDBCReader(target); } @Override public IReverseEngineeringStrategy newReverseEngineeringStrategy( String strategyName, IReverseEngineeringStrategy delegate) { assert delegate instanceof IFacade; ReverseEngineeringStrategy delegateTarget = (ReverseEngineeringStrategy)((IFacade)delegate).getTarget(); Object target = newReverseEngineeringStrategy(strategyName, delegateTarget); return facadeFactory.createReverseEngineeringStrategy(target); } @Override public String getReverseEngineeringStrategyClassName() { return ReverseEngineeringStrategy.class.getName(); } @Override public IDatabaseCollector newDatabaseCollector(IJDBCReader jdbcReader) { assert jdbcReader instanceof IFacade; JDBCReader jdbcReaderTarget = (JDBCReader)((IFacade)jdbcReader).getTarget(); MetaDataDialect metadataDialect = jdbcReaderTarget.getMetaDataDialect(); return facadeFactory.createDatabaseCollector( new DefaultDatabaseCollector(metadataDialect)); } @Override public ICfg2HbmTool newCfg2HbmTool() { return facadeFactory.createCfg2HbmTool(new Cfg2HbmTool()); } @Override public IProperty newProperty() { return facadeFactory.createProperty(new Property()); } @Override public ITable newTable(String name) { return facadeFactory.createTable(new Table(name)); } @Override public IColumn newColumn(String string) { return facadeFactory.createColumn(new Column(string)); } @Override public IDialect newDialect(Properties properties, final Connection connection) { ServiceRegistry serviceRegistry = buildServiceRegistry(properties); DialectFactory dialectFactory = serviceRegistry.getService(DialectFactory.class); Dialect dialect = dialectFactory.buildDialect( properties, new DialectResolutionInfoSource() { @Override public DialectResolutionInfo getDialectResolutionInfo() { try { return new DatabaseMetaDataDialectResolutionInfoAdapter( connection.getMetaData() ); } catch ( SQLException sqlException ) { throw new HibernateConsoleRuntimeException( "Unable to access java.sql.DatabaseMetaData to determine appropriate Dialect to use", sqlException ); } } } ); return dialect != null ? facadeFactory.createDialect(dialect) : null; } @Override public Class<?> getDriverManagerConnectionProviderClass() { return DriverManagerConnectionProviderImpl.class; } @Override public IEnvironment getEnvironment() { return facadeFactory.createEnvironment(); } @Override public IValue newSimpleValue() { return facadeFactory.createValue(new SimpleValue(null)); } @Override public IValue newPrimitiveArray(IPersistentClass persistentClass) { assert persistentClass instanceof IFacade; return facadeFactory.createValue( new PrimitiveArray( null, (PersistentClass)((IFacade)persistentClass).getTarget())); } @Override public IValue newArray(IPersistentClass persistentClass) { assert persistentClass instanceof IFacade; return facadeFactory.createValue( new Array( null, (PersistentClass)((IFacade)persistentClass).getTarget())); } @Override public IValue newBag(IPersistentClass persistentClass) { assert persistentClass instanceof IFacade; return facadeFactory.createValue( new Bag( null, (PersistentClass)((IFacade)persistentClass).getTarget())); } @Override public IValue newList(IPersistentClass persistentClass) { assert persistentClass instanceof IFacade; return facadeFactory.createValue( new org.hibernate.mapping.List( null, (PersistentClass)((IFacade)persistentClass).getTarget())); } @Override public IValue newMap(IPersistentClass persistentClass) { assert persistentClass instanceof IFacade; return facadeFactory.createValue( new org.hibernate.mapping.Map( null, (PersistentClass)((IFacade)persistentClass).getTarget())); } @Override public IValue newSet(IPersistentClass persistentClass) { assert persistentClass instanceof IFacade; return facadeFactory.createValue( new Set( null, (PersistentClass)((IFacade)persistentClass).getTarget())); } @Override public IValue newManyToOne(ITable table) { assert table instanceof IFacade; return facadeFactory.createValue( new ManyToOne( null, (Table)((IFacade)table).getTarget())); } @Override public IValue newOneToMany(IPersistentClass persistentClass) { assert persistentClass instanceof IFacade; return facadeFactory.createValue( new OneToMany( null, (PersistentClass)((IFacade)persistentClass).getTarget())); } @Override public IValue newOneToOne(IPersistentClass persistentClass) { assert persistentClass instanceof IFacade; return facadeFactory.createValue( new OneToOne( null, ((PersistentClass)((IFacade)persistentClass).getTarget()).getTable(), (PersistentClass)((IFacade)persistentClass).getTarget())); } @Override public IPersistentClass newSingleTableSubclass(IPersistentClass persistentClass) { assert persistentClass instanceof IFacade; IPersistentClass result = facadeFactory.createPersistentClass( new SingleTableSubclass( (PersistentClass)((IFacade)persistentClass).getTarget(), null)); ((AbstractPersistentClassFacade)result).setSuperClass(persistentClass); return result; } @Override public IPersistentClass newJoinedSubclass(IPersistentClass persistentClass) { assert persistentClass instanceof IFacade; IPersistentClass result = facadeFactory.createPersistentClass( new JoinedSubclass( (PersistentClass)((IFacade)persistentClass).getTarget(), null)); ((AbstractPersistentClassFacade)result).setSuperClass(persistentClass); return result; } @Override public IPersistentClass newSpecialRootClass(IProperty ormElement) { return facadeFactory.createSpecialRootClass(ormElement); } @Override public IPersistentClass newRootClass() { return facadeFactory.createPersistentClass(new RootClass(null)); } @Override public IPrimaryKey newPrimaryKey() { return facadeFactory.createPrimaryKey(new PrimaryKey(null)); } @Override public boolean isInitialized(Object object) { return Hibernate.isInitialized(object); } @Override public List<String> getJPAMappingFilePaths(String persistenceUnitName, EntityResolver entityResolver) { return OpenMappingUtilsEjb3.enumDocuments(persistenceUnitName, entityResolver); } @Override public Class<?> getClassWithoutInitializingProxy(Object reflectedObject) { return HibernateProxyHelper.getClassWithoutInitializingProxy(reflectedObject); } @Override public ClassLoader getClassLoader() { return ServiceImpl.class.getClassLoader(); } private ServiceRegistry buildServiceRegistry(Properties properties) { StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); builder.applySettings(properties); return builder.build(); } private Object newReverseEngineeringStrategy(final String className, Object delegate) { try { Class<?> clazz = ReflectHelper.classForName(className); Class<?> revEngClass = ReflectHelper.classForName( "org.hibernate.cfg.reveng.ReverseEngineeringStrategy"); Constructor<?> constructor = clazz.getConstructor( new Class[] { revEngClass }); return constructor.newInstance(new Object[] { delegate }); } catch (NoSuchMethodException e) { try { ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); Class<?> clazz = null; if ( contextClassLoader != null ) { clazz = contextClassLoader.loadClass(className); } else { clazz = Class.forName( className ); } if (clazz != null) { return clazz.newInstance(); } else { throw new HibernateConsoleRuntimeException("Class " + className + " could not be found."); } } catch (Exception eq) { throw new HibernateConsoleRuntimeException(eq); } } catch (Exception e) { throw new HibernateConsoleRuntimeException(e); } } }