HHH-7450 simplify xsd

This commit is contained in:
Strong Liu 2012-07-16 21:30:30 +08:00
parent d6ab4a203a
commit 95a06fc49f
3 changed files with 132 additions and 68 deletions

View File

@ -32,10 +32,11 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.jboss.logging.Logger;
import org.hibernate.CacheMode; import org.hibernate.CacheMode;
import org.hibernate.FlushMode; import org.hibernate.FlushMode;
import org.hibernate.LockMode; import org.hibernate.LockMode;
import org.hibernate.bytecode.buildtime.spi.Logger;
import org.hibernate.cfg.HbmBinder; import org.hibernate.cfg.HbmBinder;
import org.hibernate.engine.ResultSetMappingDefinition; import org.hibernate.engine.ResultSetMappingDefinition;
import org.hibernate.engine.query.spi.sql.NativeSQLQueryJoinReturn; import org.hibernate.engine.query.spi.sql.NativeSQLQueryJoinReturn;
@ -47,12 +48,14 @@ import org.hibernate.engine.spi.NamedSQLQueryDefinition;
import org.hibernate.internal.CoreMessageLogger; import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.jaxb.Origin; import org.hibernate.internal.jaxb.Origin;
import org.hibernate.internal.jaxb.mapping.hbm.EntityElement; import org.hibernate.internal.jaxb.mapping.hbm.EntityElement;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbClassElement;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbDatabaseObjectElement; import org.hibernate.internal.jaxb.mapping.hbm.JaxbDatabaseObjectElement;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbFetchProfileElement; import org.hibernate.internal.jaxb.mapping.hbm.JaxbFetchProfileElement;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbFilterDefElement; import org.hibernate.internal.jaxb.mapping.hbm.JaxbFilterDefElement;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbHibernateMapping; import org.hibernate.internal.jaxb.mapping.hbm.JaxbHibernateMapping;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbIdentifierGeneratorElement; import org.hibernate.internal.jaxb.mapping.hbm.JaxbIdentifierGeneratorElement;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbImportElement; import org.hibernate.internal.jaxb.mapping.hbm.JaxbImportElement;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbJoinedSubclassElement;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbLoadCollectionElement; import org.hibernate.internal.jaxb.mapping.hbm.JaxbLoadCollectionElement;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbQueryElement; import org.hibernate.internal.jaxb.mapping.hbm.JaxbQueryElement;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbQueryParamElement; import org.hibernate.internal.jaxb.mapping.hbm.JaxbQueryParamElement;
@ -61,12 +64,13 @@ import org.hibernate.internal.jaxb.mapping.hbm.JaxbReturnElement;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbReturnJoinElement; import org.hibernate.internal.jaxb.mapping.hbm.JaxbReturnJoinElement;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbReturnScalarElement; import org.hibernate.internal.jaxb.mapping.hbm.JaxbReturnScalarElement;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbSqlQueryElement; import org.hibernate.internal.jaxb.mapping.hbm.JaxbSqlQueryElement;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbSubclassElement;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbSynchronizeElement; import org.hibernate.internal.jaxb.mapping.hbm.JaxbSynchronizeElement;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbTypedefElement; import org.hibernate.internal.jaxb.mapping.hbm.JaxbTypedefElement;
import org.hibernate.internal.jaxb.mapping.hbm.JaxbUnionSubclassElement;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.Value; import org.hibernate.internal.util.Value;
import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.metamodel.spi.binding.EntityBinding; import org.hibernate.metamodel.spi.binding.EntityBinding;
import org.hibernate.metamodel.spi.binding.FetchProfile; import org.hibernate.metamodel.spi.binding.FetchProfile;
import org.hibernate.metamodel.spi.relational.AuxiliaryDatabaseObject; import org.hibernate.metamodel.spi.relational.AuxiliaryDatabaseObject;
@ -88,9 +92,7 @@ import org.hibernate.type.Type;
* @author Strong Liu * @author Strong Liu
*/ */
public class HibernateMappingProcessor { public class HibernateMappingProcessor {
private static final CoreMessageLogger LOG = org.jboss private static final CoreMessageLogger LOG = Logger
.logging
.Logger
.getMessageLogger( CoreMessageLogger.class, HibernateMappingProcessor.class.getName() ); .getMessageLogger( CoreMessageLogger.class, HibernateMappingProcessor.class.getName() );
private final MetadataImplementor metadata; private final MetadataImplementor metadata;
private final MappingDocument mappingDocument; private final MappingDocument mappingDocument;
@ -244,23 +246,50 @@ public class HibernateMappingProcessor {
metadata.addImport( className, rename ); metadata.addImport( className, rename );
} }
if ( root.isAutoImport() ) { if ( root.isAutoImport() ) {
for ( Object obj : root.getClazzOrSubclassOrJoinedSubclass() ) { for(final JaxbClassElement element : root.getClazz()){
EntityElement entityElement = ( EntityElement ) obj; processEntityElement( element );
}
for(final JaxbJoinedSubclassElement element : root.getJoinedSubclass()){
processEntityElement( element );
}
for(final JaxbUnionSubclassElement element : root.getUnionSubclass()){
processEntityElement( element );
}
for(final JaxbSubclassElement element : root.getSubclass()){
processEntityElement( element );
}
}
}
private void processEntityElement(EntityElement element) {
EntityElement entityElement = element;
String qualifiedName = bindingContext().determineEntityName( entityElement ); String qualifiedName = bindingContext().determineEntityName( entityElement );
metadata.addImport( entityElement.getEntityName() == null metadata.addImport( entityElement.getEntityName() == null
? entityElement.getName() ? entityElement.getName()
: entityElement.getEntityName(), qualifiedName ); : entityElement.getEntityName(), qualifiedName );
} }
}
}
private void processResultSetMappings() { private void processResultSetMappings() {
List<JaxbResultsetElement> resultsetElements = new ArrayList<JaxbResultsetElement>(); List<JaxbResultsetElement> resultsetElements = new ArrayList<JaxbResultsetElement>();
if ( CollectionHelper.isNotEmpty( mappingRoot().getResultset() ) ) { if ( CollectionHelper.isNotEmpty( mappingRoot().getResultset() ) ) {
resultsetElements.addAll( mappingRoot().getResultset() ); resultsetElements.addAll( mappingRoot().getResultset() );
} }
for ( Object obj : mappingRoot().getClazzOrSubclassOrJoinedSubclass() ) { for(final JaxbClassElement element : mappingRoot().getClazz()){
EntityElement element = EntityElement.class.cast( obj ); if ( CollectionHelper.isNotEmpty( element.getResultset() ) ) {
resultsetElements.addAll( element.getResultset() );
}
}
for(final JaxbJoinedSubclassElement element : mappingRoot().getJoinedSubclass()){
if ( CollectionHelper.isNotEmpty( element.getResultset() ) ) {
resultsetElements.addAll( element.getResultset() );
}
}
for(final JaxbUnionSubclassElement element : mappingRoot().getUnionSubclass()){
if ( CollectionHelper.isNotEmpty( element.getResultset() ) ) {
resultsetElements.addAll( element.getResultset() );
}
}
for(final JaxbSubclassElement element : mappingRoot().getSubclass()){
if ( CollectionHelper.isNotEmpty( element.getResultset() ) ) { if ( CollectionHelper.isNotEmpty( element.getResultset() ) ) {
resultsetElements.addAll( element.getResultset() ); resultsetElements.addAll( element.getResultset() );
} }
@ -276,33 +305,34 @@ public class HibernateMappingProcessor {
private void bindResultSetMappingDefinitions(JaxbResultsetElement element) { private void bindResultSetMappingDefinitions(JaxbResultsetElement element) {
final ResultSetMappingDefinition definition = new ResultSetMappingDefinition( element.getName() ); final ResultSetMappingDefinition definition = new ResultSetMappingDefinition( element.getName() );
final List returns = element.getReturnScalarOrReturnOrReturnJoin();
int cnt=0; int cnt=0;
for ( final Object obj : returns ) { NativeSQLQueryReturn nativeSQLQueryReturn;
for(final JaxbReturnScalarElement r : element.getReturnScalar()){
cnt++; cnt++;
final NativeSQLQueryReturn nativeSQLQueryReturn; String column = r.getColumn();
if ( JaxbReturnScalarElement.class.isInstance( obj ) ) { String typeFromXML = r.getType();
JaxbReturnScalarElement scalarElement = JaxbReturnScalarElement.class.cast( obj );
String column = scalarElement.getColumn();
String typeFromXML = scalarElement.getType();
Type type = metadata.getTypeResolver().heuristicType( typeFromXML ); Type type = metadata.getTypeResolver().heuristicType( typeFromXML );
nativeSQLQueryReturn = new NativeSQLQueryScalarReturn( column, type ); nativeSQLQueryReturn = new NativeSQLQueryScalarReturn( column, type );
}
else if ( JaxbReturnJoinElement.class.isInstance( obj ) ) {
nativeSQLQueryReturn = bindReturnJoin(JaxbReturnJoinElement.class.cast( obj ), cnt);
}
else if ( JaxbLoadCollectionElement.class.isInstance( obj ) ) {
nativeSQLQueryReturn = bindLoadCollection(JaxbLoadCollectionElement.class.cast( obj ), cnt);
}
else if ( JaxbReturnElement.class.isInstance( obj ) ) {
nativeSQLQueryReturn= bindReturn(JaxbReturnElement.class.cast( obj ), cnt);
}else {
throw new MappingException( "unknown type of Result set mapping return: "+obj.getClass().getName() , origin());
}
definition.addQueryReturn( nativeSQLQueryReturn ); definition.addQueryReturn( nativeSQLQueryReturn );
} }
for(final JaxbReturnJoinElement r : element.getReturnJoin()){
cnt++;
nativeSQLQueryReturn = bindReturnJoin(r, cnt);
definition.addQueryReturn( nativeSQLQueryReturn );
}
for(final JaxbLoadCollectionElement r : element.getLoadCollection()){
cnt++;
nativeSQLQueryReturn = bindLoadCollection( r, cnt );
definition.addQueryReturn( nativeSQLQueryReturn );
}
for(final JaxbReturnElement r : element.getReturn()){
cnt++;
nativeSQLQueryReturn = bindReturn( r, cnt );
definition.addQueryReturn( nativeSQLQueryReturn );
}
metadata.addResultSetMapping( definition ); metadata.addResultSetMapping( definition );
} }

View File

@ -65,11 +65,8 @@ public class HierarchyBuilder {
} }
private void processCurrentMappingDocument() { private void processCurrentMappingDocument() {
for ( Object entityElementO : currentMappingDocument.getMappingRoot().getClazzOrSubclassOrJoinedSubclass() ) { for(final JaxbClassElement jaxbClass : currentMappingDocument.getMappingRoot().getClazz()){
final EntityElement entityElement = (EntityElement) entityElementO;
if ( JaxbClassElement.class.isInstance( entityElement ) ) {
// we can immediately handle <class/> elements in terms of creating the hierarchy entry // we can immediately handle <class/> elements in terms of creating the hierarchy entry
final JaxbClassElement jaxbClass = (JaxbClassElement) entityElement;
final RootEntitySourceImpl rootEntitySource = new RootEntitySourceImpl( currentMappingDocument, final RootEntitySourceImpl rootEntitySource = new RootEntitySourceImpl( currentMappingDocument,
jaxbClass jaxbClass
); );
@ -78,18 +75,31 @@ public class HierarchyBuilder {
entityHierarchies.add( hierarchy ); entityHierarchies.add( hierarchy );
subEntityContainerMap.put( rootEntitySource.getEntityName(), rootEntitySource ); subEntityContainerMap.put( rootEntitySource.getEntityName(), rootEntitySource );
processSubElements( entityElement, rootEntitySource ); processSubElements( jaxbClass, rootEntitySource );
} }
else { for(final JaxbJoinedSubclassElement element : currentMappingDocument.getMappingRoot().getJoinedSubclass()){
processSubclassElement( element );
}
for(final JaxbUnionSubclassElement element : currentMappingDocument.getMappingRoot().getUnionSubclass()){
processSubclassElement( element );
}
for(final JaxbSubclassElement element : currentMappingDocument.getMappingRoot().getSubclass()){
processSubclassElement( element );
}
}
private void processSubclassElement(SubEntityElement element) {
// we have to see if this things super-type has been found yet, and if not add it to the // we have to see if this things super-type has been found yet, and if not add it to the
// extends queue // extends queue
final String entityItExtends = currentMappingDocument.getMappingLocalBindingContext() final String entityItExtends = currentMappingDocument.getMappingLocalBindingContext()
.qualifyClassName( ( (SubEntityElement) entityElement ).getExtends() ); .qualifyClassName( element.getExtends() );
final SubclassEntityContainer container = subEntityContainerMap.get( entityItExtends ); final SubclassEntityContainer container = subEntityContainerMap.get( entityItExtends );
final SubclassEntitySourceImpl subClassEntitySource = new SubclassEntitySourceImpl( currentMappingDocument, entityElement, ( EntitySource ) container ); final SubclassEntitySourceImpl subClassEntitySource = new SubclassEntitySourceImpl( currentMappingDocument, element, (EntitySource) container );
final String entityName = subClassEntitySource.getEntityName(); final String entityName = subClassEntitySource.getEntityName();
subEntityContainerMap.put( entityName, subClassEntitySource ); subEntityContainerMap.put( entityName, subClassEntitySource );
processSubElements( entityElement, subClassEntitySource ); processSubElements( element, subClassEntitySource );
if ( container != null ) { if ( container != null ) {
// we already have this entity's super, attach it and continue // we already have this entity's super, attach it and continue
container.add( subClassEntitySource ); container.add( subClassEntitySource );
@ -99,8 +109,6 @@ public class HierarchyBuilder {
extendsQueue.add( new ExtendsQueueEntry( subClassEntitySource, entityItExtends ) ); extendsQueue.add( new ExtendsQueueEntry( subClassEntitySource, entityItExtends ) );
} }
} }
}
}
public List<EntityHierarchyImpl> groupEntityHierarchies() { public List<EntityHierarchyImpl> groupEntityHierarchies() {
while ( ! extendsQueue.isEmpty() ) { while ( ! extendsQueue.isEmpty() ) {

View File

@ -43,6 +43,11 @@ arbitrary number of queries, and import declarations of arbitrary classes.
--> -->
<xs:element name="import" minOccurs="0" maxOccurs="unbounded" type="import-element"/> <xs:element name="import" minOccurs="0" maxOccurs="unbounded" type="import-element"/>
<xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:appinfo>
<simplify:as-element-property/>
</xs:appinfo>
</xs:annotation>
<!-- <!--
Root entity mapping. Poorly named as entities do not have to be represented by Root entity mapping. Poorly named as entities do not have to be represented by
classes at all. Mapped entities may be represented via different methodologies classes at all. Mapped entities may be represented via different methodologies
@ -991,6 +996,11 @@ arbitrary number of queries, and import declarations of arbitrary classes.
<xs:complexType name="composite-map-key-element"> <xs:complexType name="composite-map-key-element">
<xs:sequence> <xs:sequence>
<xs:choice maxOccurs="unbounded"> <xs:choice maxOccurs="unbounded">
<xs:annotation>
<xs:appinfo>
<simplify:as-element-property/>
</xs:appinfo>
</xs:annotation>
<xs:element name="key-property" type="key-property-element"/> <xs:element name="key-property" type="key-property-element"/>
<xs:element name="key-many-to-one" type="key-many-to-one-element"/> <xs:element name="key-many-to-one" type="key-many-to-one-element"/>
</xs:choice> </xs:choice>
@ -1010,6 +1020,11 @@ arbitrary number of queries, and import declarations of arbitrary classes.
<xs:complexType name="composite-index-element"> <xs:complexType name="composite-index-element">
<xs:sequence> <xs:sequence>
<xs:choice maxOccurs="unbounded"> <xs:choice maxOccurs="unbounded">
<xs:annotation>
<xs:appinfo>
<simplify:as-element-property/>
</xs:appinfo>
</xs:annotation>
<xs:element name="key-property" type="key-property-element"/> <xs:element name="key-property" type="key-property-element"/>
<xs:element name="key-many-to-one" type="key-many-to-one-element"/> <xs:element name="key-many-to-one" type="key-many-to-one-element"/>
</xs:choice> </xs:choice>
@ -1211,6 +1226,11 @@ arbitrary number of queries, and import declarations of arbitrary classes.
<xs:complexType name="properties-element"> <xs:complexType name="properties-element">
<xs:sequence> <xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:appinfo>
<simplify:as-element-property/>
</xs:appinfo>
</xs:annotation>
<xs:element name="property" type="property-element"/> <xs:element name="property" type="property-element"/>
<xs:element name="many-to-one" type="many-to-one-element"/> <xs:element name="many-to-one" type="many-to-one-element"/>
<xs:element name="component" type="component-element"/> <xs:element name="component" type="component-element"/>
@ -1279,6 +1299,11 @@ arbitrary number of queries, and import declarations of arbitrary classes.
<!-- The resultset element declares a named resultset mapping definition for SQL queries --> <!-- The resultset element declares a named resultset mapping definition for SQL queries -->
<xs:complexType name="resultset-element"> <xs:complexType name="resultset-element">
<xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:appinfo>
<simplify:as-element-property/>
</xs:appinfo>
</xs:annotation>
<xs:element name="return-scalar" type="return-scalar-element"/> <xs:element name="return-scalar" type="return-scalar-element"/>
<xs:element name="return" type="return-element"/> <xs:element name="return" type="return-element"/>
<xs:element name="return-join" type="return-join-element"/> <xs:element name="return-join" type="return-join-element"/>
@ -1397,6 +1422,7 @@ arbitrary number of queries, and import declarations of arbitrary classes.
<!-- The sql-query element declares a named SQL query string --> <!-- The sql-query element declares a named SQL query string -->
<xs:complexType name="sql-query-element" mixed="true"> <xs:complexType name="sql-query-element" mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="return-scalar" type="return-scalar-element"/> <xs:element name="return-scalar" type="return-scalar-element"/>
<xs:element name="return" type="return-element"/> <xs:element name="return" type="return-element"/>
<xs:element name="return-join" type="return-join-element"/> <xs:element name="return-join" type="return-join-element"/>