package org.jboss.tools.hibernate.runtime.v_5_0.internal; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.StringWriter; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.hibernate.boot.Metadata; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Environment; import org.hibernate.engine.jdbc.dialect.spi.DialectFactory; import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.Table; import org.hibernate.service.ServiceRegistry; import org.hibernate.tool.util.MetadataHelper; import org.jboss.tools.hibernate.runtime.common.AbstractConfigurationFacade; import org.jboss.tools.hibernate.runtime.common.IFacadeFactory; import org.jboss.tools.hibernate.runtime.spi.IConfiguration; import org.jboss.tools.hibernate.runtime.spi.IMappings; import org.jboss.tools.hibernate.runtime.spi.INamingStrategy; import org.jboss.tools.hibernate.runtime.spi.IPersistentClass; import org.jboss.tools.hibernate.runtime.spi.ITable; import org.w3c.dom.Document; import org.xml.sax.EntityResolver; public class ConfigurationFacadeImpl extends AbstractConfigurationFacade { EntityResolver entityResolver = null; Metadata metadata = null; INamingStrategy namingStrategy = null; IMappings mappings = null; public ConfigurationFacadeImpl(IFacadeFactory facadeFactory, Object target) { super(facadeFactory, target); } @Override public void setEntityResolver(EntityResolver entityResolver) { // This method is not supported anymore from Hibernate 5+ // Only caching the EntityResolver for bookkeeping purposes this.entityResolver = entityResolver; } @Override public EntityResolver getEntityResolver() { // This method is not supported anymore from Hibernate 5+ // Returning the cached EntityResolver for bookkeeping purposes return this.entityResolver; } @Override public void setNamingStrategy(INamingStrategy namingStrategy) { // The method Configuration.setNamingStrategy() is not supported // anymore from Hibernate 5+. // Naming strategies can be configured using the // AvailableSettings.IMPLICIT_NAMING_STRATEGY property. // Only caching the EntityResolver for bookkeeping purposes this.namingStrategy = namingStrategy; } @Override public IConfiguration configure(Document document) { File tempFile = null; IConfiguration result = null; try { tempFile = File.createTempFile(document.toString(), "cfg.xml"); DOMSource domSource = new DOMSource(document); StringWriter stringWriter = new StringWriter(); StreamResult stream = new StreamResult(stringWriter); TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.transform(domSource, stream); FileWriter fileWriter = new FileWriter(tempFile); fileWriter.write(stringWriter.toString()); fileWriter.close(); result = configure(tempFile); } catch(IOException | TransformerException e) { throw new RuntimeException("Problem while configuring", e); } finally { tempFile.delete(); } return result; } @Override public IMappings createMappings() { buildMappings(); return mappings; } @Override public void buildMappings() { getMetadata(); mappings = new MappingsFacadeImpl(this); } @Override public INamingStrategy getNamingStrategy() { return namingStrategy; } @Override public String getDefaultCatalogName() { return Environment.getProperties().getProperty( AvailableSettings.DEFAULT_CATALOG); } @Override public String getDefaultSchemaName() { return Environment.getProperties().getProperty( AvailableSettings.DEFAULT_SCHEMA); } @Override protected Object createTargetMapping() { return getMetadata(); } @Override protected void initializeClassMappings() { HashMap<String, IPersistentClass> classMappings = new HashMap<String, IPersistentClass>(); Iterator<PersistentClass> origin = getMetadata().getEntityBindings().iterator(); while (origin.hasNext()) { IPersistentClass pc = getFacadeFactory().createPersistentClass(origin.next()); classMappings.put(pc.getEntityName(), pc); } setClassMappings(classMappings); } @Override protected void initializeTableMappings() { HashSet<ITable> tableMappings = new HashSet<ITable>(); Iterator<Table> origin = getMetadata().collectTableMappings().iterator(); while (origin.hasNext()) { ITable table = getFacadeFactory().createTable(origin.next()); tableMappings.add(table); } setTableMappings(tableMappings); } protected Object buildTargetDialect() { return buildServiceRegistry() .getService(DialectFactory.class) .buildDialect(getProperties(), null); } private ServiceRegistry buildServiceRegistry() { StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); builder.applySettings(((Configuration)getTarget()).getProperties()); return builder.build(); } private Metadata getMetadata() { if (metadata == null) { metadata = MetadataHelper.getMetadata((Configuration)getTarget()); } return metadata; } }