/*
* Created on 2004-12-01
*/
package org.hibernate.tool.hbm2x;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.cfg.Configuration;
import org.hibernate.mapping.Collection;
import org.hibernate.mapping.Component;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
import org.hibernate.tool.hbm2x.pojo.ComponentPOJOClass;
import org.hibernate.tool.hbm2x.pojo.POJOClass;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author max and david
*/
public class ConfigurationNavigator {
private static final Logger log = LoggerFactory.getLogger(POJOExporter.class);
/**
* @param cfg
* @param exporter
* @param file
*/
public void export(Configuration cfg, ConfigurationVisitor exporter) {
Map<String, Component> components = new HashMap<String, Component>();
Metadata md = getMetadata(cfg);
for (Iterator<PersistentClass> classes = md.getEntityBindings().iterator(); classes.hasNext(); ) {
if(exporter.startMapping(cfg) ) {
PersistentClass clazz = classes.next();
collectComponents(components,clazz);
if(exporter.startPersistentClass(clazz) ) {
if(clazz.hasIdentifierProperty() ) {
exporter.startIdentifierProperty(clazz.getIdentifierProperty() );
exporter.endIdentifierProperty(clazz.getIdentifierProperty() );
}
else if (clazz.hasEmbeddedIdentifier() ) {
exporter.startEmbeddedIdentifier( (Component)clazz.getKey() );
exporter.endEmbeddedIdentifier( (Component)clazz.getKey() );
}
Iterator<?> unjoinedPropertyIterator = clazz.getUnjoinedPropertyIterator();
while(unjoinedPropertyIterator.hasNext() ) {
Property prop = (Property)unjoinedPropertyIterator.next();
exporter.startProperty(prop);
exporter.endProperty(prop);
}
}
exporter.endPersistentClass(clazz);
}
else {
exporter.endMapping(cfg);
}
}
for(Iterator<?> comps = components.values().iterator(); comps.hasNext(); ) {
Component component = (Component)comps.next();
exporter.startComponent(component);
}
if (exporter.startGeneralConfiguration(cfg) )
exporter.endGeneralConfiguration(cfg);
}
/**
* @param clazz
*/
public static void collectComponents(Map<String, Component> components, PersistentClass clazz) {
Iterator<Property> iter = new Cfg2JavaTool().getPOJOClass(clazz).getAllPropertiesIterator();
collectComponents( components, iter );
}
public static void collectComponents(Map<String, Component> components, POJOClass clazz) {
Iterator<Property> iter = clazz.getAllPropertiesIterator();
collectComponents( components, iter );
}
private static void collectComponents(Map<String, Component> components, Iterator<Property> iter) {
while(iter.hasNext()) {
Property property = iter.next();
if (!"embedded".equals(property.getPropertyAccessorName()) && // HBX-267, embedded property for <properties> should not be generated as component.
property.getValue() instanceof Component) {
Component comp = (Component) property.getValue();
addComponent( components, comp );
}
else if (property.getValue() instanceof Collection) {
// compisite-element in collection
Collection collection = (Collection) property.getValue();
if ( collection.getElement() instanceof Component) {
Component comp = (Component) collection.getElement();
addComponent(components, comp);
}
}
}
}
private static void addComponent(Map<String, Component> components, Component comp) {
if(!comp.isDynamic()) {
Component existing = (Component) components.put(
comp.getComponentClassName(),
comp);
if(existing!=null) {
log.warn("Component " + existing.getComponentClassName() + " found more than once! Will only generate the last found.");
}
} else {
log.debug("dynamic-component found. Ignoring it as a component, but will collect any embedded components.");
}
collectComponents(
components,
new ComponentPOJOClass(comp, new Cfg2JavaTool()).getAllPropertiesIterator());
}
private Metadata getMetadata(Configuration configuration) {
Metadata result = null;
try {
Field metadataSourcesField =
Configuration.class.getDeclaredField("metadataSources");
metadataSourcesField.setAccessible(true);
MetadataSources metadataSources =
(MetadataSources) metadataSourcesField.get(configuration);
result = metadataSources.buildMetadata();
} catch (NoSuchFieldException |
SecurityException |
IllegalArgumentException |
IllegalAccessException e) {
// This should in principle never happen,
// maybe only some day when the metadataSources field
// is removed from the Configuration class.
throw new RuntimeException(e);
}
return result;
}
}