Author: steve.ebersole(a)jboss.com
Date: 2009-10-26 13:04:59 -0400 (Mon, 26 Oct 2009)
New Revision: 17843
Modified:
core/trunk/core/src/main/java/org/hibernate/property/BackrefPropertyAccessor.java
core/trunk/core/src/main/java/org/hibernate/property/BasicPropertyAccessor.java
core/trunk/core/src/main/java/org/hibernate/property/ChainedPropertyAccessor.java
core/trunk/core/src/main/java/org/hibernate/property/DirectPropertyAccessor.java
core/trunk/core/src/main/java/org/hibernate/property/Dom4jAccessor.java
core/trunk/core/src/main/java/org/hibernate/property/EmbeddedPropertyAccessor.java
core/trunk/core/src/main/java/org/hibernate/property/Getter.java
core/trunk/core/src/main/java/org/hibernate/property/IndexPropertyAccessor.java
core/trunk/core/src/main/java/org/hibernate/property/MapAccessor.java
core/trunk/core/src/main/java/org/hibernate/property/NoopAccessor.java
core/trunk/core/src/main/java/org/hibernate/property/PropertyAccessor.java
core/trunk/core/src/main/java/org/hibernate/property/PropertyAccessorFactory.java
core/trunk/core/src/main/java/org/hibernate/property/Setter.java
core/trunk/core/src/main/java/org/hibernate/property/package.html
core/trunk/core/src/main/java/org/hibernate/tuple/Tuplizer.java
core/trunk/core/src/main/java/org/hibernate/tuple/component/AbstractComponentTuplizer.java
core/trunk/core/src/main/java/org/hibernate/tuple/component/PojoComponentTuplizer.java
core/trunk/core/src/main/java/org/hibernate/tuple/entity/AbstractEntityTuplizer.java
core/trunk/core/src/main/java/org/hibernate/tuple/entity/EntityTuplizer.java
core/trunk/core/src/main/java/org/hibernate/tuple/entity/PojoEntityTuplizer.java
core/trunk/core/src/main/java/org/hibernate/type/ComponentType.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/EntityManagerFactoryImpl.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AbstractIdentifiableType.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AttributeFactory.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/EmbeddableTypeImpl.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetadataContext.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetamodelImpl.java
core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/MetadataTest.java
Log:
HHH-4202 - Implement JPA 2.0 metamodel APIs
Modified:
core/trunk/core/src/main/java/org/hibernate/property/BackrefPropertyAccessor.java
===================================================================
---
core/trunk/core/src/main/java/org/hibernate/property/BackrefPropertyAccessor.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/core/src/main/java/org/hibernate/property/BackrefPropertyAccessor.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @author tags or express
+ * copyright attribution statements applied by the authors. All
+ * third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@@ -20,12 +20,12 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
- *
*/
package org.hibernate.property;
import java.io.Serializable;
import java.lang.reflect.Method;
+import java.lang.reflect.Member;
import java.util.Map;
import org.hibernate.engine.SessionFactoryImplementor;
@@ -143,6 +143,13 @@
/**
* {@inheritDoc}
*/
+ public Member getMember() {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public Object get(Object target) {
return UNKNOWN;
}
Modified: core/trunk/core/src/main/java/org/hibernate/property/BasicPropertyAccessor.java
===================================================================
---
core/trunk/core/src/main/java/org/hibernate/property/BasicPropertyAccessor.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/core/src/main/java/org/hibernate/property/BasicPropertyAccessor.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @author tags or express
+ * copyright attribution statements applied by the authors. All
+ * third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@@ -20,13 +20,13 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
- *
*/
package org.hibernate.property;
import java.beans.Introspector;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.lang.reflect.Member;
import java.util.Map;
import org.slf4j.Logger;
@@ -164,6 +164,9 @@
this.propertyName=propertyName;
}
+ /**
+ * {@inheritDoc}
+ */
public Object get(Object target) throws HibernateException {
try {
return method.invoke(target, null);
@@ -202,18 +205,37 @@
}
}
+ /**
+ * {@inheritDoc}
+ */
public Object getForInsert(Object target, Map mergeMap, SessionImplementor session) {
return get( target );
}
+ /**
+ * {@inheritDoc}
+ */
public Class getReturnType() {
return method.getReturnType();
}
+ /**
+ * {@inheritDoc}
+ */
+ public Member getMember() {
+ return method;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public Method getMethod() {
return method;
}
+ /**
+ * {@inheritDoc}
+ */
public String getMethodName() {
return method.getName();
}
Modified:
core/trunk/core/src/main/java/org/hibernate/property/ChainedPropertyAccessor.java
===================================================================
---
core/trunk/core/src/main/java/org/hibernate/property/ChainedPropertyAccessor.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/core/src/main/java/org/hibernate/property/ChainedPropertyAccessor.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @author tags or express
+ * copyright attribution statements applied by the authors. All
+ * third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@@ -20,7 +20,6 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
- *
*/
package org.hibernate.property;
Modified:
core/trunk/core/src/main/java/org/hibernate/property/DirectPropertyAccessor.java
===================================================================
---
core/trunk/core/src/main/java/org/hibernate/property/DirectPropertyAccessor.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/core/src/main/java/org/hibernate/property/DirectPropertyAccessor.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @author tags or express
+ * copyright attribution statements applied by the authors. All
+ * third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@@ -20,12 +20,12 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
- *
*/
package org.hibernate.property;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
+import java.lang.reflect.Member;
import java.util.Map;
import org.hibernate.HibernateException;
@@ -50,6 +50,10 @@
this.clazz = clazz;
this.name = name;
}
+
+ /**
+ * {@inheritDoc}
+ */
public Object get(Object target) throws HibernateException {
try {
return field.get(target);
@@ -59,16 +63,37 @@
}
}
+ /**
+ * {@inheritDoc}
+ */
public Object getForInsert(Object target, Map mergeMap, SessionImplementor session) {
return get( target );
}
+ /**
+ * {@inheritDoc}
+ */
+ public Member getMember() {
+ return field;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public Method getMethod() {
return null;
}
+
+ /**
+ * {@inheritDoc}
+ */
public String getMethodName() {
return null;
}
+
+ /**
+ * {@inheritDoc}
+ */
public Class getReturnType() {
return field.getType();
}
@@ -91,12 +116,24 @@
this.clazz = clazz;
this.name = name;
}
+
+ /**
+ * {@inheritDoc}
+ */
public Method getMethod() {
return null;
}
+
+ /**
+ * {@inheritDoc}
+ */
public String getMethodName() {
return null;
}
+
+ /**
+ * {@inheritDoc}
+ */
public void set(Object target, Object value, SessionFactoryImplementor factory) throws
HibernateException {
try {
field.set(target, value);
Modified: core/trunk/core/src/main/java/org/hibernate/property/Dom4jAccessor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/Dom4jAccessor.java 2009-10-26
16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/Dom4jAccessor.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @author tags or express
+ * copyright attribution statements applied by the authors. All
+ * third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@@ -20,11 +20,11 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
- *
*/
package org.hibernate.property;
import java.lang.reflect.Method;
+import java.lang.reflect.Member;
import java.util.Map;
import org.dom4j.Attribute;
@@ -53,7 +53,6 @@
this.factory = factory;
this.nodeName = nodeName;
this.propertyType = propertyType;
-
}
/**
@@ -118,21 +117,28 @@
}
/**
- * Get the declared Java type
+ * {@inheritDoc}
*/
public Class getReturnType() {
return Object.class;
}
/**
- * Optional operation (return null)
+ * {@inheritDoc}
*/
+ public Member getMember() {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public String getMethodName() {
return null;
}
/**
- * Optional operation (return null)
+ * {@inheritDoc}
*/
public Method getMethod() {
return null;
@@ -147,14 +153,14 @@
}
/**
- * Optional operation (return null)
+ * {@inheritDoc}
*/
public String getMethodName() {
return null;
}
/**
- * Optional operation (return null)
+ * {@inheritDoc}
*/
public Method getMethod() {
return null;
@@ -166,16 +172,17 @@
* @author Gavin King
*/
public static class TextGetter extends Dom4jGetter {
-
TextGetter(Type propertyType, SessionFactoryImplementor factory) {
super(propertyType, factory);
}
+ /**
+ * {@inheritDoc}
+ */
public Object get(Object owner) throws HibernateException {
Element ownerElement = (Element) owner;
return super.propertyType.fromXMLNode(ownerElement, super.factory);
}
-
}
/**
@@ -184,19 +191,21 @@
*/
public static class AttributeGetter extends Dom4jGetter {
private final String attributeName;
-
+
AttributeGetter(String name, Type propertyType, SessionFactoryImplementor factory) {
super(propertyType, factory);
attributeName = name.substring(1);
}
+ /**
+ * {@inheritDoc}
+ */
public Object get(Object owner) throws HibernateException {
Element ownerElement = (Element) owner;
Node attribute = ownerElement.attribute(attributeName);
return attribute==null ? null :
super.propertyType.fromXMLNode(attribute, super.factory);
}
-
}
/**
@@ -211,13 +220,15 @@
elementName = name;
}
+ /**
+ * {@inheritDoc}
+ */
public Object get(Object owner) throws HibernateException {
Element ownerElement = (Element) owner;
Node element = ownerElement.element(elementName);
return element==null ?
null : super.propertyType.fromXMLNode(element, super.factory);
}
-
}
/**
@@ -227,13 +238,16 @@
public static class ElementAttributeGetter extends Dom4jGetter {
private final String elementName;
private final String attributeName;
-
+
ElementAttributeGetter(String name, Type propertyType, SessionFactoryImplementor
factory) {
super(propertyType, factory);
elementName = name.substring( 0, name.indexOf('/') );
attributeName = name.substring( name.indexOf('/')+2 );
}
+ /**
+ * {@inheritDoc}
+ */
public Object get(Object owner) throws HibernateException {
Element ownerElement = (Element) owner;
@@ -260,12 +274,14 @@
* @author Gavin King
*/
public static class TextSetter extends Dom4jSetter {
-
TextSetter(Type propertyType) {
super(propertyType);
}
- public void set(Object target, Object value, SessionFactoryImplementor factory)
+ /**
+ * {@inheritDoc}
+ */
+ public void set(Object target, Object value, SessionFactoryImplementor factory)
throws HibernateException {
Element owner = ( Element ) target;
if ( !super.propertyType.isXMLElement() ) { //kinda ugly, but needed for collections
with a "." node mapping
@@ -277,7 +293,6 @@
}
}
}
-
}
/**
@@ -286,13 +301,16 @@
*/
public static class AttributeSetter extends Dom4jSetter {
private final String attributeName;
-
+
AttributeSetter(String name, Type propertyType) {
super(propertyType);
attributeName = name.substring(1);
}
- public void set(Object target, Object value, SessionFactoryImplementor factory)
+ /**
+ * {@inheritDoc}
+ */
+ public void set(Object target, Object value, SessionFactoryImplementor factory)
throws HibernateException {
Element owner = ( Element ) target;
Attribute attribute = owner.attribute(attributeName);
@@ -307,7 +325,6 @@
super.propertyType.setToXMLNode(attribute, value, factory);
}
}
-
}
/**
@@ -322,7 +339,10 @@
elementName = name;
}
- public void set(Object target, Object value, SessionFactoryImplementor factory)
+ /**
+ * {@inheritDoc}
+ */
+ public void set(Object target, Object value, SessionFactoryImplementor factory)
throws HibernateException {
if (value!=CollectionType.UNFETCHED_COLLECTION) {
Element owner = ( Element ) target;
@@ -334,7 +354,6 @@
}
}
}
-
}
/**
@@ -351,7 +370,10 @@
attributeName = name.substring( name.indexOf('/')+2 );
}
- public void set(Object target, Object value, SessionFactoryImplementor factory)
+ /**
+ * {@inheritDoc}
+ */
+ public void set(Object target, Object value, SessionFactoryImplementor factory)
throws HibernateException {
Element owner = ( Element ) target;
Element element = owner.element(elementName);
@@ -375,7 +397,6 @@
super.propertyType.setToXMLNode(attribute, value, factory);
}
}
-
}
Modified:
core/trunk/core/src/main/java/org/hibernate/property/EmbeddedPropertyAccessor.java
===================================================================
---
core/trunk/core/src/main/java/org/hibernate/property/EmbeddedPropertyAccessor.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/core/src/main/java/org/hibernate/property/EmbeddedPropertyAccessor.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @author tags or express
+ * copyright attribution statements applied by the authors. All
+ * third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@@ -20,11 +20,11 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
- *
*/
package org.hibernate.property;
import java.lang.reflect.Method;
+import java.lang.reflect.Member;
import java.util.Map;
import org.hibernate.HibernateException;
@@ -38,29 +38,50 @@
public class EmbeddedPropertyAccessor implements PropertyAccessor {
public static final class EmbeddedGetter implements Getter {
-
private final Class clazz;
EmbeddedGetter(Class clazz) {
this.clazz = clazz;
}
+ /**
+ * {@inheritDoc}
+ */
public Object get(Object target) throws HibernateException {
return target;
}
+ /**
+ * {@inheritDoc}
+ */
public Object getForInsert(Object target, Map mergeMap, SessionImplementor session) {
return get( target );
}
+ /**
+ * {@inheritDoc}
+ */
+ public Member getMember() {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public Method getMethod() {
return null;
}
+ /**
+ * {@inheritDoc}
+ */
public String getMethodName() {
return null;
}
+ /**
+ * {@inheritDoc}
+ */
public Class getReturnType() {
return clazz;
}
@@ -71,23 +92,35 @@
}
public static final class EmbeddedSetter implements Setter {
-
private final Class clazz;
EmbeddedSetter(Class clazz) {
this.clazz = clazz;
}
+ /**
+ * {@inheritDoc}
+ */
public Method getMethod() {
return null;
}
+ /**
+ * {@inheritDoc}
+ */
public String getMethodName() {
return null;
}
- public void set(Object target, Object value, SessionFactoryImplementor factory) throws
HibernateException {}
-
+ /**
+ * {@inheritDoc}
+ */
+ public void set(Object target, Object value, SessionFactoryImplementor factory) {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public String toString() {
return "EmbeddedSetter(" + clazz.getName() + ')';
}
Modified: core/trunk/core/src/main/java/org/hibernate/property/Getter.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/Getter.java 2009-10-26 16:45:45
UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/Getter.java 2009-10-26 17:04:59
UTC (rev 17843)
@@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @author tags or express
+ * copyright attribution statements applied by the authors. All
+ * third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@@ -20,12 +20,12 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
- *
*/
package org.hibernate.property;
import java.io.Serializable;
import java.lang.reflect.Method;
+import java.lang.reflect.Member;
import java.util.Map;
import org.hibernate.HibernateException;
@@ -58,17 +58,35 @@
throws HibernateException;
/**
- * Get the declared Java type
+ * Retrieve the member to which this property maps. This might be the
+ * field or it might be the getter method.
+ *
+ * @return The mapped member.
*/
+ public Member getMember();
+
+ /**
+ * Retrieve the declared Java type
+ *
+ * @return The declared java type.
+ */
public Class getReturnType();
/**
+ * Retrieve the getter-method name.
+ * <p/>
* Optional operation (return null)
+ *
+ * @return The name of the getter method, or null.
*/
public String getMethodName();
/**
+ * Retrieve the getter-method.
+ * <p/>
* Optional operation (return null)
+ *
+ * @return The getter method, or null.
*/
public Method getMethod();
}
Modified: core/trunk/core/src/main/java/org/hibernate/property/IndexPropertyAccessor.java
===================================================================
---
core/trunk/core/src/main/java/org/hibernate/property/IndexPropertyAccessor.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/core/src/main/java/org/hibernate/property/IndexPropertyAccessor.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @author tags or express
+ * copyright attribution statements applied by the authors. All
+ * third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@@ -20,11 +20,11 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
- *
*/
package org.hibernate.property;
import java.lang.reflect.Method;
+import java.lang.reflect.Member;
import java.util.Map;
import org.hibernate.HibernateException;
@@ -37,7 +37,6 @@
* @author Gavin King
*/
public class IndexPropertyAccessor implements PropertyAccessor {
-
private final String propertyName;
private final String entityName;
@@ -45,6 +44,7 @@
* Constructs a new instance of IndexPropertyAccessor.
*
* @param collectionRole The collection role which this back ref references.
+ * @param entityName The name of the entity owning the collection.
*/
public IndexPropertyAccessor(String collectionRole, String entityName) {
this.propertyName = collectionRole.substring( entityName.length()+1 );
@@ -64,23 +64,27 @@
* The Setter implementation for index backrefs.
*/
public static final class IndexSetter implements Setter {
-
+ /**
+ * {@inheritDoc}
+ */
public Method getMethod() {
return null;
}
+ /**
+ * {@inheritDoc}
+ */
public String getMethodName() {
return null;
}
- public void set(Object target, Object value) {
+ /**
+ * {@inheritDoc}
+ */
+ public void set(Object target, Object value, SessionFactoryImplementor factory) {
// do nothing...
}
- public void set(Object target, Object value, SessionFactoryImplementor factory) throws
HibernateException {
- // do nothing...
- }
-
}
@@ -88,7 +92,6 @@
* The Getter implementation for index backrefs.
*/
public class IndexGetter implements Getter {
-
public Object getForInsert(Object target, Map mergeMap, SessionImplementor session)
throws HibernateException {
if (session==null) {
return BackrefPropertyAccessor.UNKNOWN;
@@ -99,18 +102,37 @@
}
}
+ /**
+ * {@inheritDoc}
+ */
public Object get(Object target) {
return BackrefPropertyAccessor.UNKNOWN;
}
+ /**
+ * {@inheritDoc}
+ */
+ public Member getMember() {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public Method getMethod() {
return null;
}
+ /**
+ * {@inheritDoc}
+ */
public String getMethodName() {
return null;
}
+ /**
+ * {@inheritDoc}
+ */
public Class getReturnType() {
return Object.class;
}
Modified: core/trunk/core/src/main/java/org/hibernate/property/MapAccessor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/MapAccessor.java 2009-10-26
16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/MapAccessor.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @author tags or express
+ * copyright attribution statements applied by the authors. All
+ * third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@@ -20,11 +20,11 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
- *
*/
package org.hibernate.property;
import java.lang.reflect.Method;
+import java.lang.reflect.Member;
import java.util.Map;
import org.hibernate.HibernateException;
@@ -36,33 +36,46 @@
* @author Gavin King
*/
public class MapAccessor implements PropertyAccessor {
-
+ /**
+ * {@inheritDoc}
+ */
public Getter getGetter(Class theClass, String propertyName)
throws PropertyNotFoundException {
return new MapGetter(propertyName);
}
+ /**
+ * {@inheritDoc}
+ */
public Setter getSetter(Class theClass, String propertyName)
throws PropertyNotFoundException {
return new MapSetter(propertyName);
}
public static final class MapSetter implements Setter {
-
private String name;
MapSetter(String name) {
this.name = name;
}
+ /**
+ * {@inheritDoc}
+ */
public Method getMethod() {
return null;
}
+ /**
+ * {@inheritDoc}
+ */
public String getMethodName() {
return null;
}
+ /**
+ * {@inheritDoc}
+ */
public void set(Object target, Object value, SessionFactoryImplementor factory)
throws HibernateException {
( (Map) target ).put(name, value);
@@ -71,33 +84,53 @@
}
public static final class MapGetter implements Getter {
-
private String name;
MapGetter(String name) {
this.name = name;
}
+ /**
+ * {@inheritDoc}
+ */
+ public Member getMember() {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public Method getMethod() {
return null;
}
+ /**
+ * {@inheritDoc}
+ */
public String getMethodName() {
return null;
}
+ /**
+ * {@inheritDoc}
+ */
public Object get(Object target) throws HibernateException {
return ( (Map) target ).get(name);
}
+ /**
+ * {@inheritDoc}
+ */
public Object getForInsert(Object target, Map mergeMap, SessionImplementor session) {
return get( target );
}
+ /**
+ * {@inheritDoc}
+ */
public Class getReturnType() {
return Object.class;
}
-
}
}
Modified: core/trunk/core/src/main/java/org/hibernate/property/NoopAccessor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/NoopAccessor.java 2009-10-26
16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/NoopAccessor.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @author tags or express
+ * copyright attribution statements applied by the authors. All
+ * third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@@ -20,11 +20,11 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
- *
*/
package org.hibernate.property;
import java.lang.reflect.Method;
+import java.lang.reflect.Member;
import java.util.Map;
import org.hibernate.HibernateException;
@@ -38,11 +38,16 @@
* @author Michael Bartmann
*/
public class NoopAccessor implements PropertyAccessor {
-
+ /**
+ * {@inheritDoc}
+ */
public Getter getGetter(Class arg0, String arg1) throws PropertyNotFoundException {
return new NoopGetter();
}
+ /**
+ * {@inheritDoc}
+ */
public Setter getSetter(Class arg0, String arg1) throws PropertyNotFoundException {
return new NoopSetter();
}
@@ -51,47 +56,73 @@
* A Getter which will always return null. It should not be called anyway.
*/
private static class NoopGetter implements Getter {
-
/**
- * @return always null
+ * {@inheritDoc}
+ * <p/>
+ * Here we always return <tt>null</tt>
*/
public Object get(Object target) throws HibernateException {
return null;
}
+ /**
+ * {@inheritDoc}
+ */
public Object getForInsert(Object target, Map map, SessionImplementor arg1)
throws HibernateException {
return null;
}
+ /**
+ * {@inheritDoc}
+ */
public Class getReturnType() {
return Object.class;
}
+ /**
+ * {@inheritDoc}
+ */
+ public Member getMember() {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public String getMethodName() {
return null;
}
+ /**
+ * {@inheritDoc}
+ */
public Method getMethod() {
return null;
}
-
}
/**
* A Setter which will just do nothing.
*/
private static class NoopSetter implements Setter {
-
- public void set(Object target, Object value, SessionFactoryImplementor arg2)
- throws HibernateException {
- // do not do anything
+ /**
+ * {@inheritDoc}
+ */
+ public void set(Object target, Object value, SessionFactoryImplementor arg2) {
+ // nothing to do
}
+ /**
+ * {@inheritDoc}
+ */
public String getMethodName() {
return null;
}
+ /**
+ * {@inheritDoc}
+ */
public Method getMethod() {
return null;
}
Modified: core/trunk/core/src/main/java/org/hibernate/property/PropertyAccessor.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/PropertyAccessor.java 2009-10-26
16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/PropertyAccessor.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @author tags or express
+ * copyright attribution statements applied by the authors. All
+ * third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@@ -20,7 +20,6 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
- *
*/
package org.hibernate.property;
@@ -29,15 +28,31 @@
/**
* Abstracts the notion of a "property". Defines a strategy for accessing the
* value of an attribute.
+ *
* @author Gavin King
*/
public interface PropertyAccessor {
/**
* Create a "getter" for the named attribute
+ *
+ * @param theClass The class on which the property is defined.
+ * @param propertyName The name of the property.
+ *
+ * @return An appropriate getter.
+ *
+ * @throws PropertyNotFoundException Indicates a problem interpretting the propertyName
*/
public Getter getGetter(Class theClass, String propertyName) throws
PropertyNotFoundException;
+
/**
* Create a "setter" for the named attribute
+ *
+ * @param theClass The class on which the property is defined.
+ * @param propertyName The name of the property.
+ *
+ * @return An appropriate setter
+ *
+ * @throws PropertyNotFoundException Indicates a problem interpretting the propertyName
*/
public Setter getSetter(Class theClass, String propertyName) throws
PropertyNotFoundException;
}
Modified:
core/trunk/core/src/main/java/org/hibernate/property/PropertyAccessorFactory.java
===================================================================
---
core/trunk/core/src/main/java/org/hibernate/property/PropertyAccessorFactory.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/core/src/main/java/org/hibernate/property/PropertyAccessorFactory.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @author tags or express
+ * copyright attribution statements applied by the authors. All
+ * third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@@ -20,7 +20,6 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
- *
*/
package org.hibernate.property;
Modified: core/trunk/core/src/main/java/org/hibernate/property/Setter.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/Setter.java 2009-10-26 16:45:45
UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/Setter.java 2009-10-26 17:04:59
UTC (rev 17843)
@@ -1,10 +1,10 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors. All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
+ * Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ * third-party contributors as indicated by either @author tags or express
+ * copyright attribution statements applied by the authors. All
+ * third-party contributions are distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
@@ -20,7 +20,6 @@
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
- *
*/
package org.hibernate.property;
Modified: core/trunk/core/src/main/java/org/hibernate/property/package.html
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/property/package.html 2009-10-26 16:45:45
UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/property/package.html 2009-10-26 17:04:59
UTC (rev 17843)
@@ -1,10 +1,10 @@
<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
- ~ Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- ~ indicated by the @author tags or express copyright attribution
- ~ statements applied by the authors. All third-party contributions are
- ~ distributed under license by Red Hat Middleware LLC.
+ ~ Copyright (c) 2009 by Red Hat Inc and/or its affiliates or by
+ ~ third-party contributors as indicated by either @author tags or express
+ ~ copyright attribution statements applied by the authors. All
+ ~ third-party contributions are distributed under license by Red Hat Inc.
~
~ This copyrighted material is made available to anyone wishing to use, modify,
~ copy, or redistribute it subject to the terms and conditions of the GNU
@@ -20,7 +20,6 @@
~ Free Software Foundation, Inc.
~ 51 Franklin Street, Fifth Floor
~ Boston, MA 02110-1301 USA
- ~
-->
<html>
Modified: core/trunk/core/src/main/java/org/hibernate/tuple/Tuplizer.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/tuple/Tuplizer.java 2009-10-26 16:45:45
UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/tuple/Tuplizer.java 2009-10-26 17:04:59
UTC (rev 17843)
@@ -25,6 +25,7 @@
package org.hibernate.tuple;
import org.hibernate.HibernateException;
+import org.hibernate.property.Getter;
/**
* A tuplizer defines the contract for things which know how to manage
@@ -56,24 +57,21 @@
* @author Steve Ebersole
*/
public interface Tuplizer {
-
/**
* Extract the current values contained on the given entity.
*
* @param entity The entity from which to extract values.
* @return The current property values.
- * @throws HibernateException
*/
- public Object[] getPropertyValues(Object entity) throws HibernateException;
+ public Object[] getPropertyValues(Object entity);
/**
* Inject the given values into the given entity.
*
* @param entity The entity.
* @param values The values to be injected.
- * @throws HibernateException
*/
- public void setPropertyValues(Object entity, Object[] values) throws
HibernateException;
+ public void setPropertyValues(Object entity, Object[] values);
/**
* Extract the value of a particular property from the given entity.
@@ -81,17 +79,15 @@
* @param entity The entity from which to extract the property value.
* @param i The index of the property for which to extract the value.
* @return The current value of the given property on the given entity.
- * @throws HibernateException
*/
- public Object getPropertyValue(Object entity, int i) throws HibernateException;
+ public Object getPropertyValue(Object entity, int i);
/**
* Generate a new, empty entity.
*
* @return The new, empty entity instance.
- * @throws HibernateException
*/
- public Object instantiate() throws HibernateException;
+ public Object instantiate();
/**
* Is the given object considered an instance of the the entity (acconting
@@ -115,4 +111,11 @@
*/
public Class getMappedClass();
+ /**
+ * Retrieve the getter for the specified property.
+ *
+ * @param i The property index.
+ * @return The property getter.
+ */
+ public Getter getGetter(int i);
}
Modified:
core/trunk/core/src/main/java/org/hibernate/tuple/component/AbstractComponentTuplizer.java
===================================================================
---
core/trunk/core/src/main/java/org/hibernate/tuple/component/AbstractComponentTuplizer.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/core/src/main/java/org/hibernate/tuple/component/AbstractComponentTuplizer.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -42,7 +42,6 @@
* @author Steve Ebersole
*/
public abstract class AbstractComponentTuplizer implements ComponentTuplizer {
-
protected final Getter[] getters;
protected final Setter[] setters;
protected final int propertySpan;
@@ -71,15 +70,6 @@
i++;
}
hasCustomAccessors = foundCustomAccessor;
-
- String[] getterNames = new String[propertySpan];
- String[] setterNames = new String[propertySpan];
- Class[] propTypes = new Class[propertySpan];
- for ( int j = 0; j < propertySpan; j++ ) {
- getterNames[j] = getters[j].getMethodName();
- setterNames[j] = setters[j].getMethodName();
- propTypes[j] = getters[j].getReturnType();
- }
instantiator = buildInstantiator( component );
}
@@ -128,4 +118,7 @@
throw new UnsupportedOperationException();
}
+ public Getter getGetter(int i) {
+ return getters[i];
+ }
}
Modified:
core/trunk/core/src/main/java/org/hibernate/tuple/component/PojoComponentTuplizer.java
===================================================================
---
core/trunk/core/src/main/java/org/hibernate/tuple/component/PojoComponentTuplizer.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/core/src/main/java/org/hibernate/tuple/component/PojoComponentTuplizer.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -51,7 +51,6 @@
* @author Steve Ebersole
*/
public class PojoComponentTuplizer extends AbstractComponentTuplizer {
-
private final Class componentClass;
private ReflectionOptimizer optimizer;
private final Getter parentGetter;
Modified:
core/trunk/core/src/main/java/org/hibernate/tuple/entity/AbstractEntityTuplizer.java
===================================================================
---
core/trunk/core/src/main/java/org/hibernate/tuple/entity/AbstractEntityTuplizer.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/core/src/main/java/org/hibernate/tuple/entity/AbstractEntityTuplizer.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -140,7 +140,9 @@
Property property = (Property) iter.next();
getters[i] = buildPropertyGetter(property, mappingInfo);
setters[i] = buildPropertySetter(property, mappingInfo);
- if ( !property.isBasicPropertyAccessor() ) foundCustomAccessor = true;
+ if ( !property.isBasicPropertyAccessor() ) {
+ foundCustomAccessor = true;
+ }
i++;
}
hasCustomAccessors = foundCustomAccessor;
@@ -423,4 +425,18 @@
return getClass().getName() + '(' + getEntityMetamodel().getName() +
')';
}
+ public Getter getIdentifierGetter() {
+ return idGetter;
+ }
+
+ public Getter getVersionGetter() {
+ if ( getEntityMetamodel().isVersioned() ) {
+ return getGetter( getEntityMetamodel().getVersionPropertyIndex() );
+ }
+ return null;
+ }
+
+ public Getter getGetter(int i) {
+ return getters[i];
+ }
}
Modified: core/trunk/core/src/main/java/org/hibernate/tuple/entity/EntityTuplizer.java
===================================================================
---
core/trunk/core/src/main/java/org/hibernate/tuple/entity/EntityTuplizer.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/core/src/main/java/org/hibernate/tuple/entity/EntityTuplizer.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -30,6 +30,7 @@
import org.hibernate.HibernateException;
import org.hibernate.EntityNameResolver;
import org.hibernate.EntityMode;
+import org.hibernate.property.Getter;
import org.hibernate.tuple.Tuplizer;
import org.hibernate.engine.SessionImplementor;
import org.hibernate.engine.SessionFactoryImplementor;
@@ -238,4 +239,18 @@
* @throws HibernateException If we are unable to determine an entity-name within the
inheritence hierarchy.
*/
public String determineConcreteSubclassEntityName(Object entityInstance,
SessionFactoryImplementor factory);
+
+ /**
+ * Retrieve the getter for the identifier property. May return null.
+ *
+ * @return The getter for the identifier property.
+ */
+ public Getter getIdentifierGetter();
+
+ /**
+ * Retrieve the getter for the version property. May return null.
+ *
+ * @return The getter for the version property.
+ */
+ public Getter getVersionGetter();
}
\ No newline at end of file
Modified:
core/trunk/core/src/main/java/org/hibernate/tuple/entity/PojoEntityTuplizer.java
===================================================================
---
core/trunk/core/src/main/java/org/hibernate/tuple/entity/PojoEntityTuplizer.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/core/src/main/java/org/hibernate/tuple/entity/PojoEntityTuplizer.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -64,7 +64,6 @@
* @author Gavin King
*/
public class PojoEntityTuplizer extends AbstractEntityTuplizer {
-
static final Logger log = LoggerFactory.getLogger( PojoEntityTuplizer.class );
private final Class mappedClass;
Modified: core/trunk/core/src/main/java/org/hibernate/type/ComponentType.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/type/ComponentType.java 2009-10-26
16:45:45 UTC (rev 17842)
+++ core/trunk/core/src/main/java/org/hibernate/type/ComponentType.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -38,6 +38,7 @@
import org.hibernate.FetchMode;
import org.hibernate.HibernateException;
import org.hibernate.MappingException;
+import org.hibernate.PropertyNotFoundException;
import org.hibernate.engine.CascadeStyle;
import org.hibernate.engine.Mapping;
import org.hibernate.engine.SessionFactoryImplementor;
@@ -88,6 +89,10 @@
this.tuplizerMapping = metamodel.getTuplizerMapping();
}
+ public EntityModeToTuplizerMapping getTuplizerMapping() {
+ return tuplizerMapping;
+ }
+
public int[] sqlTypes(Mapping mapping) throws MappingException {
//Not called at runtime so doesn't matter if its slow :)
int[] sqlTypes = new int[getColumnSpan( mapping )];
@@ -656,4 +661,15 @@
return false;
}
+ public int getPropertyIndex(String name) {
+ String[] names = getPropertyNames();
+ for ( int i = 0, max = names.length; i < max; i++ ) {
+ if ( names[i].equals( name ) ) {
+ return i;
+ }
+ }
+ throw new PropertyNotFoundException(
+ "Unable to locate property named " + name + " on " +
getReturnedClass().getName()
+ );
+ }
}
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/EntityManagerFactoryImpl.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/EntityManagerFactoryImpl.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/EntityManagerFactoryImpl.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -35,6 +35,7 @@
import javax.persistence.spi.LoadState;
import org.hibernate.SessionFactory;
+import org.hibernate.engine.SessionFactoryImplementor;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.cfg.Configuration;
import org.hibernate.ejb.criteria.CriteriaBuilderImpl;
@@ -71,7 +72,7 @@
final Iterator<PersistentClass> classes = cfg.getClassMappings();
//a safe guard till we are confident that metamodel is wll tested
if ( !"disabled".equalsIgnoreCase( cfg.getProperty(
"hibernate.ejb.metamodel.generation" ) ) ) {
- this.metamodel = new MetamodelImpl( classes );
+ this.metamodel = MetamodelImpl.buildMetamodel( classes, ( SessionFactoryImplementor )
sessionFactory );
}
else {
this.metamodel = null;
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AbstractIdentifiableType.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AbstractIdentifiableType.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AbstractIdentifiableType.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -87,16 +87,18 @@
* {@inheritDoc}
*/
@SuppressWarnings({ "unchecked" })
- public <Y> SingularAttribute<? super X, Y> getId(Class<Y> type) {
+ public <Y> SingularAttribute<? super X, Y> getId(Class<Y> javaType) {
final SingularAttribute<? super X, Y> id_;
if ( id != null ) {
checkSimpleId();
id_ = ( SingularAttribute<? super X, Y> ) id;
+ if ( javaType != id.getJavaType() ) {
+ throw new IllegalArgumentException( "Id attribute was not of specified type :
" + javaType.getName() );
+ }
}
else {
- id_ = requireSupertype().getId( type );
+ id_ = requireSupertype().getId( javaType );
}
- // TODO : check that type and id_.getJavaType() are related
return id_;
}
@@ -117,10 +119,12 @@
* {@inheritDoc}
*/
@SuppressWarnings({ "unchecked" })
- public <Y> SingularAttribute<X, Y> getDeclaredId(Class<Y> yClass) {
+ public <Y> SingularAttribute<X, Y> getDeclaredId(Class<Y> javaType) {
checkDeclaredId();
checkSimpleId();
- // TODO : check that type and id.getJavaType() are related
+ if ( javaType != id.getJavaType() ) {
+ throw new IllegalArgumentException( "Id attribute was not of specified type :
" + javaType.getName() );
+ }
return (SingularAttribute<X, Y>) id;
}
@@ -177,18 +181,20 @@
* {@inheritDoc}
*/
@SuppressWarnings({ "unchecked" })
- public <Y> SingularAttribute<? super X, Y> getVersion(Class<Y> type)
{
+ public <Y> SingularAttribute<? super X, Y> getVersion(Class<Y>
javaType) {
if ( ! hasVersionAttribute() ) {
return null;
}
final SingularAttribute<? super X, Y> version_;
if ( version != null ) {
version_ = ( SingularAttribute<? super X, Y> ) version;
+ if ( javaType != version.getJavaType() ) {
+ throw new IllegalArgumentException( "Version attribute was not of specified type
: " + javaType.getName() );
+ }
}
else {
- version_ = requireSupertype().getVersion( type );
+ version_ = requireSupertype().getVersion( javaType );
}
- // TODO : check that type and version_.getJavaType() are related
return version_;
}
@@ -196,9 +202,11 @@
* {@inheritDoc}
*/
@SuppressWarnings({ "unchecked" })
- public <Y> SingularAttribute<X, Y> getDeclaredVersion(Class<Y> yClass)
{
+ public <Y> SingularAttribute<X, Y> getDeclaredVersion(Class<Y>
javaType) {
checkDeclaredVersion();
- // TODO : check that type and version_.getJavaType() are related
+ if ( javaType != version.getJavaType() ) {
+ throw new IllegalArgumentException( "Version attribute was not of specified type
: " + javaType.getName() );
+ }
return ( SingularAttribute<X, Y> ) version;
}
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AttributeFactory.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AttributeFactory.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/AttributeFactory.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -23,18 +23,22 @@
*/
package org.hibernate.ejb.metamodel;
+import java.lang.reflect.Member;
import java.util.Iterator;
-import java.lang.reflect.Member;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.Type;
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.Value;
+import org.hibernate.EntityMode;
+import org.hibernate.type.EmbeddedComponentType;
+import org.hibernate.type.ComponentType;
+import org.hibernate.annotations.common.AssertionFailure;
import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.Component;
import org.hibernate.mapping.Map;
-import org.hibernate.mapping.Component;
import org.hibernate.mapping.OneToMany;
-import org.hibernate.annotations.common.AssertionFailure;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.Value;
+import org.hibernate.tuple.entity.EntityMetamodel;
/**
* TODO : javadoc
@@ -57,12 +61,12 @@
attribute = buildPluralAttribute( ownerType, property, attrContext );
}
else {
- final Type<Y> attrType = getType( attrContext.getElementTypeStatus(),
attrContext.getElementValue() );
+ final Type<Y> attrType = getType( ownerType, attrContext.getElementTypeStatus(),
attrContext.getElementValue() );
attribute = new SingularAttributeImpl<X,Y>(
property.getName(),
property.getType().getReturnedClass(),
ownerType,
- determineJavaMember( property ),
+ determineStandardJavaMember( ownerType, property ),
false,
false,
property.isOptional(),
@@ -76,19 +80,19 @@
@SuppressWarnings( "unchecked" )
private <X, Y, V, K> AttributeImplementor<X, Y>
buildPluralAttribute(AbstractManagedType<X> ownerType, Property property,
AttributeContext attrContext) {
AttributeImplementor<X, Y> attribute;
- final Type<V> attrType = getType( attrContext.getElementTypeStatus(),
attrContext.getElementValue() );
+ final Type<V> attrType = getType( ownerType, attrContext.getElementTypeStatus(),
attrContext.getElementValue() );
final Class<Y> collectionClass = (Class<Y>)
attrContext.getCollectionClass();
if ( java.util.Map.class.isAssignableFrom( collectionClass ) ) {
- final Type<K> keyType = getType( attrContext.getKeyTypeStatus(),
attrContext.getKeyValue() );
+ final Type<K> keyType = getType( ownerType, attrContext.getKeyTypeStatus(),
attrContext.getKeyValue() );
attribute = PluralAttributeImpl.create( ownerType, attrType, collectionClass, keyType
)
- .member( determineJavaMember( property ) )
+ .member( determineStandardJavaMember( ownerType, property ) )
.property( property )
.persistentAttributeType( attrContext.getElementAttributeType() )
.build();
}
else {
attribute = PluralAttributeImpl.create( ownerType, attrType, collectionClass, null )
- .member( determineJavaMember( property ) )
+ .member( determineStandardJavaMember( ownerType, property ) )
.property( property )
.persistentAttributeType( attrContext.getElementAttributeType() )
.build();
@@ -96,13 +100,13 @@
return attribute;
}
- private <X> Type<X> getType(AttributeContext.TypeStatus elementTypeStatus,
Value value) {
+ private <X> Type<X> getType(AbstractManagedType owner,
AttributeContext.TypeStatus elementTypeStatus, Value value) {
final org.hibernate.type.Type type = value.getType();
switch ( elementTypeStatus ) {
case BASIC:
return buildBasicType( type );
case EMBEDDABLE:
- return buildEmbeddableType( value, type );
+ return buildEmbeddableType( owner, value, type );
case ENTITY:
return buildEntityType( type );
default:
@@ -124,10 +128,10 @@
}
@SuppressWarnings( "unchecked" )
- private <X> Type<X> buildEmbeddableType(Value value, org.hibernate.type.Type
type) {
+ private <X> Type<X> buildEmbeddableType(AbstractManagedType owner, Value
value, org.hibernate.type.Type type) {
//build embedable type
final Class<X> clazz = type.getReturnedClass();
- final EmbeddableTypeImpl<X> embeddableType = new EmbeddableTypeImpl<X>(
clazz );
+ final EmbeddableTypeImpl<X> embeddableType = new EmbeddableTypeImpl<X>(
clazz, owner, (ComponentType) type );
context.registerEmbeddedableType( embeddableType );
final Component component = (Component) value;
final Iterator<Property> subProperties = component.getPropertyIterator();
@@ -142,38 +146,115 @@
@SuppressWarnings({ "unchecked" })
public <X, Y> SingularAttributeImpl<X, Y>
buildIdAttribute(AbstractManagedType<X> ownerType, Property property) {
final AttributeContext attrContext = getAttributeContext( property );
- final Type<Y> attrType = getType( attrContext.getElementTypeStatus(),
attrContext.getElementValue() );
+ final Type<Y> attrType = getType( ownerType, attrContext.getElementTypeStatus(),
attrContext.getElementValue() );
final Class<Y> idJavaType = property.getType().getReturnedClass();
return new SingularAttributeImpl.Identifier(
property.getName(),
idJavaType,
ownerType,
- determineJavaMember( property ),
+ determineIdentifierJavaMember( ownerType, property ),
attrType,
attrContext.getElementAttributeType()
);
}
- @SuppressWarnings({ "UnusedDeclaration" })
- private Member determineJavaMember(Property property) {
- return null;
+ private Member determineIdentifierJavaMember(AbstractManagedType ownerType, Property
property) {
+// see below
+// final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( property );
+ final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( ownerType );
+ if ( ! property.getName().equals( entityMetamodel.getIdentifierProperty().getName() ) )
{
+ // this *should* indicate processing part of an IdClass...
+ return determineVirtualIdentifierJavaMember( entityMetamodel, property );
+ }
+ return entityMetamodel.getTuplizer( EntityMode.POJO
).getIdentifierGetter().getMember();
}
+ private Member determineVirtualIdentifierJavaMember(EntityMetamodel entityMetamodel,
Property property) {
+ if ( ! entityMetamodel.getIdentifierProperty().isVirtual() ) {
+ throw new IllegalArgumentException( "expecting IdClass mapping" );
+ }
+ org.hibernate.type.Type type = entityMetamodel.getIdentifierProperty().getType();
+ if ( ! EmbeddedComponentType.class.isInstance( type ) ) {
+ throw new IllegalArgumentException( "expecting IdClass mapping" );
+ }
+ final EmbeddedComponentType componentType = (EmbeddedComponentType) type;
+ return componentType.getTuplizerMapping()
+ .getTuplizer( EntityMode.POJO )
+ .getGetter( componentType.getPropertyIndex( property.getName() ) )
+ .getMember();
+ }
+
+// getting the owning PersistentClass from the Property is broken in certain cases with
annotations...
+// private EntityMetamodel getDeclarerEntityMetamodel(Property property) {
+// return context.getSessionFactory()
+// .getEntityPersister( property.getPersistentClass().getEntityName() )
+// .getEntityMetamodel();
+// }
+// so we use the owner's java class to lookup the persister/entitymetamodel
+ private EntityMetamodel getDeclarerEntityMetamodel(AbstractManagedType ownerType) {
+ return context.getSessionFactory()
+ .getEntityPersister( ownerType.getJavaType().getName() )
+ .getEntityMetamodel();
+ }
+
+// getting the owning PersistentClass from the Property is broken in certain cases with
annotations...
+// private Member determineStandardJavaMember(Property property) {
+// final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( property );
+//
+// final String propertyName = property.getName();
+// final int index = entityMetamodel.getPropertyIndex( propertyName );
+// return entityMetamodel.getTuplizer( EntityMode.POJO ).getGetter( index
).getMember();
+// }
+// so we use the owner's java class to lookup the persister/entitymetamodel
+ private Member determineStandardJavaMember(AbstractManagedType ownerType, Property
property) {
+ if ( Type.PersistenceType.EMBEDDABLE == ownerType.getPersistenceType() ) {
+ EmbeddableTypeImpl embeddableType = ( EmbeddableTypeImpl ) ownerType;
+ return embeddableType.getHibernateType().getTuplizerMapping()
+ .getTuplizer( EntityMode.POJO )
+ .getGetter( embeddableType.getHibernateType().getPropertyIndex( property.getName() )
)
+ .getMember();
+ }
+ else if ( Type.PersistenceType.ENTITY == ownerType.getPersistenceType() ) {
+ final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( ownerType );
+ final String propertyName = property.getName();
+ final Integer index = entityMetamodel.getPropertyIndexOrNull( propertyName );
+ if ( index == null ) {
+ // just like in #determineIdentifierJavaMember , this *should* indicate we have an
IdClass mapping
+ return determineVirtualIdentifierJavaMember( entityMetamodel, property );
+ }
+ else {
+ return entityMetamodel.getTuplizer( EntityMode.POJO ).getGetter( index
).getMember();
+ }
+ }
+ else {
+ throw new IllegalArgumentException( "Unexpected owner type : " +
ownerType.getPersistenceType() );
+ }
+ }
+
@SuppressWarnings({ "unchecked" })
public <X, Y> SingularAttributeImpl<X, Y>
buildVerisonAttribute(AbstractManagedType<X> ownerType, Property property) {
final AttributeContext attrContext = getAttributeContext( property );
final Class<Y> javaType = property.getType().getReturnedClass();
- final Type<Y> attrType = getType( attrContext.getElementTypeStatus(),
attrContext.getElementValue() );
+ final Type<Y> attrType = getType( ownerType, attrContext.getElementTypeStatus(),
attrContext.getElementValue() );
return new SingularAttributeImpl.Version(
property.getName(),
javaType,
ownerType,
- determineJavaMember( property ),
+ determineVersionJavaMember( ownerType, property ),
attrType,
attrContext.getElementAttributeType()
);
}
+ private Member determineVersionJavaMember(AbstractManagedType ownerType, Property
property) {
+ final EntityMetamodel entityMetamodel = getDeclarerEntityMetamodel( ownerType );
+ if ( ! property.getName().equals( entityMetamodel.getVersionProperty().getName() ) ) {
+ // this should never happen, but to be safe...
+ throw new IllegalArgumentException( "Given property did not match declared
version property" );
+ }
+ return entityMetamodel.getTuplizer( EntityMode.POJO
).getIdentifierGetter().getMember();
+ }
+
private static class AttributeContext {
private final Value elementValue;
private final TypeStatus typeStatus;
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/EmbeddableTypeImpl.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/EmbeddableTypeImpl.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/EmbeddableTypeImpl.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -21,11 +21,10 @@
*/
package org.hibernate.ejb.metamodel;
-import java.util.Iterator;
import java.io.Serializable;
import javax.persistence.metamodel.EmbeddableType;
-import org.hibernate.mapping.Property;
+import org.hibernate.type.ComponentType;
/**
* @author Emmanuel Bernard
@@ -34,11 +33,24 @@
extends AbstractManagedType<X>
implements EmbeddableType<X>, Serializable {
- public EmbeddableTypeImpl(Class<X> javaType) {
+ private final AbstractManagedType parent;
+ private final ComponentType hibernateType;
+
+ public EmbeddableTypeImpl(Class<X> javaType, AbstractManagedType parent,
ComponentType hibernateType) {
super( javaType, null );
+ this.parent = parent;
+ this.hibernateType = hibernateType;
}
public PersistenceType getPersistenceType() {
return PersistenceType.EMBEDDABLE;
}
+
+ public AbstractManagedType getParent() {
+ return parent;
+ }
+
+ public ComponentType getHibernateType() {
+ return hibernateType;
+ }
}
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetadataContext.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetadataContext.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetadataContext.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -33,6 +33,7 @@
import org.hibernate.mapping.PersistentClass;
import org.hibernate.mapping.Property;
+import org.hibernate.engine.SessionFactoryImplementor;
/**
* Defines a context for storing information during the building of the {@link
MetamodelImpl}.
@@ -44,6 +45,7 @@
* @author Emmanuel Bernard
*/
class MetadataContext {
+ private final SessionFactoryImplementor sessionFactory;
private final AttributeFactory attributeFactory = new AttributeFactory( this );
private HashMap<Class<?>,EntityTypeImpl<?>> entityTypes
@@ -55,6 +57,14 @@
private HashMap<Class<?>, EmbeddableTypeImpl<?>> embeddables
= new HashMap<Class<?>, EmbeddableTypeImpl<?>>();
+ public MetadataContext(SessionFactoryImplementor sessionFactory) {
+ this.sessionFactory = sessionFactory;
+ }
+
+ /*package*/ SessionFactoryImplementor getSessionFactory() {
+ return sessionFactory;
+ }
+
/**
* Given a Hibernate {@link PersistentClass}, locate the corresponding JPA {@link
org.hibernate.type.EntityType}
* implementation. May retur null if the given {@link PersistentClass} has not yet been
processed.
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetamodelImpl.java
===================================================================
---
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetamodelImpl.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/metamodel/MetamodelImpl.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -32,6 +32,7 @@
import javax.persistence.metamodel.EmbeddableType;
import org.hibernate.mapping.PersistentClass;
+import org.hibernate.engine.SessionFactoryImplementor;
/**
* Hibernate implementation of the JPA {@link Metamodel} contract.
@@ -44,21 +45,25 @@
private final Map<Class<?>, EmbeddableTypeImpl<?>> embeddables;
/**
- * Instantiate the metamodel from the collection of Hibernate {@link PersistentClass}
models.
+ * Build the metamodel using the information from the collection of Hibernate
+ * {@link PersistentClass} models as well as the Hibernate {@link SessionFactory}.
*
- * @param persistentClasses An iterator over the Hibernate {@link PersistentClass}
models.
+ * @param persistentClasses Iterator over the Hibernate (config-time) metamodel
+ * @param sessionFactory The Hibernate session factry.
+ * @return The built metamodel
*/
- public MetamodelImpl(Iterator<PersistentClass> persistentClasses) {
- MetadataContext context = new MetadataContext();
+ public static MetamodelImpl buildMetamodel(
+ Iterator<PersistentClass> persistentClasses,
+ SessionFactoryImplementor sessionFactory) {
+ MetadataContext context = new MetadataContext( sessionFactory );
while ( persistentClasses.hasNext() ) {
locateOrBuildEntityType( persistentClasses.next(), context );
}
- this.entities = context.getEntityTypeMap();
context.wrapUp();
- this.embeddables = context.getEmbeddableTypeMap();
+ return new MetamodelImpl( context.getEntityTypeMap(), context.getEmbeddableTypeMap()
);
}
- private EntityTypeImpl<?> locateOrBuildEntityType(PersistentClass persistentClass,
MetadataContext context) {
+ private static EntityTypeImpl<?> locateOrBuildEntityType(PersistentClass
persistentClass, MetadataContext context) {
EntityTypeImpl<?> entityType = context.locateEntityType( persistentClass );
if ( entityType == null ) {
entityType = buildEntityType( persistentClass, context );
@@ -67,7 +72,7 @@
}
@SuppressWarnings({ "unchecked" })
- private EntityTypeImpl<?> buildEntityType(PersistentClass persistentClass,
MetadataContext context) {
+ private static EntityTypeImpl<?> buildEntityType(PersistentClass persistentClass,
MetadataContext context) {
final PersistentClass superPersistentClass = persistentClass.getSuperclass();
final EntityTypeImpl superEntityType = superPersistentClass == null
? null
@@ -85,6 +90,19 @@
}
/**
+ * Instantiate the metamodel.
+ *
+ * @param entities The entity mappings.
+ * @param embeddables The embeddable (component) mappings.
+ */
+ private MetamodelImpl(
+ Map<Class<?>, EntityTypeImpl<?>> entities,
+ Map<Class<?>, EmbeddableTypeImpl<?>> embeddables) {
+ this.entities = entities;
+ this.embeddables = embeddables;
+ }
+
+ /**
* {@inheritDoc}
*/
@SuppressWarnings({ "unchecked" })
Modified:
core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/MetadataTest.java
===================================================================
---
core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/MetadataTest.java 2009-10-26
16:45:45 UTC (rev 17842)
+++
core/trunk/entitymanager/src/test/java/org/hibernate/ejb/test/metadata/MetadataTest.java 2009-10-26
17:04:59 UTC (rev 17843)
@@ -37,6 +37,16 @@
final SingularAttribute<Fridge, Long> id = fridgeType.getDeclaredId( Long.class
);
assertNotNull( id );
assertTrue( id.isId() );
+ try {
+ fridgeType.getDeclaredId( java.util.Date.class );
+ fail( "expecting failure" );
+ }
+ catch ( IllegalArgumentException ignore ) {
+ // expected result
+ }
+ final SingularAttribute<? super Fridge, Long> id2 = fridgeType.getId( Long.class
);
+ assertNotNull( id2 );
+
assertEquals( Fridge.class.getName(), fridgeType.getName() );
assertEquals( Long.class, fridgeType.getIdType().getJavaType() );
assertTrue( fridgeType.hasSingleIdAttribute() );