Hibernate SVN: r18827 - in core/trunk/envers/src: test/java/org/hibernate/envers/test/entities/ids and 1 other directories.
by hibernate-commits@lists.jboss.org
Author: adamw
Date: 2010-02-18 04:17:24 -0500 (Thu, 18 Feb 2010)
New Revision: 18827
Added:
core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/ids/ManyToOneIdNotAuditedTestEntity.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/ids/ManyToOneNotAuditedEmbId.java
core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/ids/ManyToOneIdNotAudited.java
Modified:
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java
core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/IdMetadataGenerator.java
Log:
HHH-4928:
- using unsupported constructs in ids of non-audited entities doesn't cause an exception
Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java 2010-02-18 05:07:20 UTC (rev 18826)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java 2010-02-18 09:17:24 UTC (rev 18827)
@@ -345,7 +345,7 @@
if (!isAudited) {
String entityName = pc.getEntityName();
- IdMappingData idMapper = idMetadataGenerator.addId(pc);
+ IdMappingData idMapper = idMetadataGenerator.addId(pc, false);
if (idMapper == null) {
// Unsupported id mapping, e.g. key-many-to-one. If the entity is used in auditing, an exception
@@ -375,7 +375,7 @@
AuditTableData auditTableData = new AuditTableData(auditEntityName, auditTableName, schema, catalog);
// Generating a mapping for the id
- IdMappingData idMapper = idMetadataGenerator.addId(pc);
+ IdMappingData idMapper = idMetadataGenerator.addId(pc, true);
InheritanceType inheritanceType = InheritanceType.get(pc);
Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/IdMetadataGenerator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/IdMetadataGenerator.java 2010-02-18 05:07:20 UTC (rev 18826)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/IdMetadataGenerator.java 2010-02-18 09:17:24 UTC (rev 18827)
@@ -56,7 +56,8 @@
}
@SuppressWarnings({"unchecked"})
- private void addIdProperties(Element parent, Iterator<Property> properties, SimpleMapperBuilder mapper, boolean key) {
+ private boolean addIdProperties(Element parent, Iterator<Property> properties, SimpleMapperBuilder mapper, boolean key,
+ boolean audited) {
while (properties.hasNext()) {
Property property = properties.next();
Type propertyType = property.getType();
@@ -67,14 +68,23 @@
property.getValue(), mapper, true, key);
if (!added) {
- throw new MappingException("Type not supported: " + propertyType.getClass().getName());
+ // If the entity is audited, and a non-supported id component is used, throwing an exception.
+ // If the entity is not audited, then we simply don't support this entity, even in
+ // target relation mode not audited.
+ if (audited) {
+ throw new MappingException("Type not supported: " + propertyType.getClass().getName());
+ } else {
+ return false;
+ }
}
}
}
+
+ return true;
}
@SuppressWarnings({"unchecked"})
- IdMappingData addId(PersistentClass pc) {
+ IdMappingData addId(PersistentClass pc, boolean audited) {
// Xml mapping which will be used for relations
Element rel_id_mapping = new DefaultElement("properties");
// Xml mapping which will be used for the primary key of the versions table
@@ -93,20 +103,28 @@
// Multiple id
mapper = new MultipleIdMapper(((Component) pc.getIdentifier()).getComponentClassName());
- addIdProperties(rel_id_mapping, (Iterator<Property>) id_mapper.getPropertyIterator(), mapper, false);
+ if (!addIdProperties(rel_id_mapping, (Iterator<Property>) id_mapper.getPropertyIterator(), mapper, false, audited)) {
+ return null;
+ }
// null mapper - the mapping where already added the first time, now we only want to generate the xml
- addIdProperties(orig_id_mapping, (Iterator<Property>) id_mapper.getPropertyIterator(), null, true);
+ if (!addIdProperties(orig_id_mapping, (Iterator<Property>) id_mapper.getPropertyIterator(), null, true, audited)) {
+ return null;
+ }
} else if (id_prop.isComposite()) {
// Embedded id
Component id_component = (Component) id_prop.getValue();
mapper = new EmbeddedIdMapper(getIdPropertyData(id_prop), id_component.getComponentClassName());
- addIdProperties(rel_id_mapping, (Iterator<Property>) id_component.getPropertyIterator(), mapper, false);
+ if (!addIdProperties(rel_id_mapping, (Iterator<Property>) id_component.getPropertyIterator(), mapper, false, audited)) {
+ return null;
+ }
// null mapper - the mapping where already added the first time, now we only want to generate the xml
- addIdProperties(orig_id_mapping, (Iterator<Property>) id_component.getPropertyIterator(), null, true);
+ if (!addIdProperties(orig_id_mapping, (Iterator<Property>) id_component.getPropertyIterator(), null, true, audited)) {
+ return null;
+ }
} else {
// Single id
Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/ids/ManyToOneIdNotAuditedTestEntity.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/ids/ManyToOneIdNotAuditedTestEntity.java (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/ids/ManyToOneIdNotAuditedTestEntity.java 2010-02-18 09:17:24 UTC (rev 18827)
@@ -0,0 +1,55 @@
+package org.hibernate.envers.test.entities.ids;
+
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import java.io.Serializable;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+@Entity
+public class ManyToOneIdNotAuditedTestEntity implements Serializable {
+ @EmbeddedId
+ private ManyToOneNotAuditedEmbId id;
+
+ private String data;
+
+ public ManyToOneIdNotAuditedTestEntity() {
+ }
+
+ public ManyToOneNotAuditedEmbId getId() {
+ return id;
+ }
+
+ public void setId(ManyToOneNotAuditedEmbId id) {
+ this.id = id;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ManyToOneIdNotAuditedTestEntity that = (ManyToOneIdNotAuditedTestEntity) o;
+
+ if (data != null ? !data.equals(that.data) : that.data != null) return false;
+ if (id != null ? !id.equals(that.id) : that.id != null) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = id != null ? id.hashCode() : 0;
+ result = 31 * result + (data != null ? data.hashCode() : 0);
+ return result;
+ }
+}
Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/ids/ManyToOneNotAuditedEmbId.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/ids/ManyToOneNotAuditedEmbId.java (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/entities/ids/ManyToOneNotAuditedEmbId.java 2010-02-18 09:17:24 UTC (rev 18827)
@@ -0,0 +1,48 @@
+package org.hibernate.envers.test.entities.ids;
+
+import org.hibernate.envers.test.entities.UnversionedStrTestEntity;
+
+import javax.persistence.Embeddable;
+import javax.persistence.ManyToOne;
+import java.io.Serializable;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+@Embeddable
+public class ManyToOneNotAuditedEmbId implements Serializable {
+ @ManyToOne
+ private UnversionedStrTestEntity id;
+
+ public ManyToOneNotAuditedEmbId() {
+ }
+
+ public ManyToOneNotAuditedEmbId(UnversionedStrTestEntity id) {
+ this.id = id;
+ }
+
+ public UnversionedStrTestEntity getId() {
+ return id;
+ }
+
+ public void setId(UnversionedStrTestEntity id) {
+ this.id = id;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ManyToOneNotAuditedEmbId that = (ManyToOneNotAuditedEmbId) o;
+
+ if (id != null ? !id.equals(that.id) : that.id != null) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return id != null ? id.hashCode() : 0;
+ }
+}
Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/ids/ManyToOneIdNotAudited.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/ids/ManyToOneIdNotAudited.java (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/ids/ManyToOneIdNotAudited.java 2010-02-18 09:17:24 UTC (rev 18827)
@@ -0,0 +1,52 @@
+package org.hibernate.envers.test.integration.ids;
+
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.hibernate.envers.test.entities.StrTestEntity;
+import org.hibernate.envers.test.entities.UnversionedStrTestEntity;
+import org.hibernate.envers.test.entities.ids.ManyToOneIdNotAuditedTestEntity;
+import org.hibernate.envers.test.entities.ids.ManyToOneNotAuditedEmbId;
+import org.testng.annotations.Test;
+
+import javax.persistence.EntityManager;
+
+/**
+ * A test checking that when using Envers it is possible to have non-audited entities that use unsupported
+ * components in their ids, e.g. a many-to-one join to another entity.
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class ManyToOneIdNotAudited extends AbstractEntityTest {
+ private ManyToOneNotAuditedEmbId id1;
+
+ public void configure(Ejb3Configuration cfg) {
+ cfg.addAnnotatedClass(ManyToOneIdNotAuditedTestEntity.class);
+ cfg.addAnnotatedClass(UnversionedStrTestEntity.class);
+ cfg.addAnnotatedClass(StrTestEntity.class);
+ }
+
+ @Test
+ public void initData() {
+ // Revision 1
+ EntityManager em = getEntityManager();
+ em.getTransaction().begin();
+
+ UnversionedStrTestEntity uste = new UnversionedStrTestEntity();
+ uste.setStr("test1");
+ em.persist(uste);
+
+ id1 = new ManyToOneNotAuditedEmbId(uste);
+
+ em.getTransaction().commit();
+
+ // Revision 2
+ em = getEntityManager();
+ em.getTransaction().begin();
+
+ ManyToOneIdNotAuditedTestEntity mtoinate = new ManyToOneIdNotAuditedTestEntity();
+ mtoinate.setData("data1");
+ mtoinate.setId(id1);
+ em.persist(mtoinate);
+
+ em.getTransaction().commit();
+ }
+}
16 years, 2 months
Hibernate SVN: r18826 - in core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria: predicate and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: steve.ebersole(a)jboss.com
Date: 2010-02-18 00:07:20 -0500 (Thu, 18 Feb 2010)
New Revision: 18826
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaBuilderImpl.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/CompoundPredicate.java
Log:
HHH-4583 - Incorrect handling of empty conjunction and disjunction
Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaBuilderImpl.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaBuilderImpl.java 2010-02-18 04:31:08 UTC (rev 18825)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaBuilderImpl.java 2010-02-18 05:07:20 UTC (rev 18826)
@@ -314,6 +314,17 @@
* {@inheritDoc}
*/
public Predicate isTrue(Expression<Boolean> expression) {
+ if ( CompoundPredicate.class.isInstance( expression ) ) {
+ final CompoundPredicate predicate = (CompoundPredicate) expression;
+ if ( predicate.getOperator() == Predicate.BooleanOperator.OR
+ && predicate.getExpressions().size() == 0 ) {
+ predicate.not();
+ }
+ return predicate;
+ }
+ else if ( Predicate.class.isInstance( expression ) ) {
+ return (Predicate) expression;
+ }
return new BooleanAssertionPredicate( this, expression, Boolean.TRUE );
}
@@ -321,6 +332,22 @@
* {@inheritDoc}
*/
public Predicate isFalse(Expression<Boolean> expression) {
+ if ( CompoundPredicate.class.isInstance( expression ) ) {
+ final CompoundPredicate predicate = (CompoundPredicate) expression;
+ if ( predicate.getOperator() == Predicate.BooleanOperator.OR
+ && predicate.getExpressions().size() == 0 ) {
+ // nothing to do
+ }
+ else {
+ predicate.not();
+ }
+ return predicate;
+ }
+ else if ( Predicate.class.isInstance( expression ) ) {
+ final Predicate predicate = (Predicate) expression;
+ predicate.not();
+ return predicate;
+ }
return new BooleanAssertionPredicate( this, expression, Boolean.FALSE );
}
Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/CompoundPredicate.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/CompoundPredicate.java 2010-02-18 04:31:08 UTC (rev 18825)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/CompoundPredicate.java 2010-02-18 05:07:20 UTC (rev 18826)
@@ -116,7 +116,11 @@
public String render(CriteriaQueryCompiler.RenderingContext renderingContext) {
if ( getExpressions().size() == 0 ) {
- return getOperator() == BooleanOperator.AND
+ boolean implicitTrue = getOperator() == BooleanOperator.AND;
+ if ( isNegated() ) {
+ implicitTrue = !implicitTrue;
+ }
+ return implicitTrue
? "1=1" // true
: "0=1"; // false
}
16 years, 2 months
Hibernate SVN: r18825 - jpa-api/trunk.
by hibernate-commits@lists.jboss.org
Author: steve.ebersole(a)jboss.com
Date: 2010-02-17 23:31:08 -0500 (Wed, 17 Feb 2010)
New Revision: 18825
Modified:
jpa-api/trunk/
Log:
added .idea dir to ignores
Property changes on: jpa-api/trunk
___________________________________________________________________
Name: svn:ignore
- build
target
local
*.ipr
*.iws
*.iml
.classpath
.project
.settings
.nbattrs
*.log
*.properties
.clover
atlassian-ide-plugin.xml
+ build
target
local
*.ipr
*.iws
*.iml
.idea
atlassian-ide-plugin.xml
.classpath
.project
.settings
.nbattrs
*.log
*.properties
.clover
16 years, 2 months
Hibernate SVN: r18824 - in jpamodelgen/trunk/src: main/docbook/en-US/images and 9 other directories.
by hibernate-commits@lists.jboss.org
Author: hardy.ferentschik
Date: 2010-02-17 20:07:46 -0500 (Wed, 17 Feb 2010)
New Revision: 18824
Added:
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/util/FileTimeStampChecker.java
Modified:
jpamodelgen/trunk/src/main/docbook/en-US/images/eclipse-annotation-processor-config.png
jpamodelgen/trunk/src/main/docbook/en-US/images/idea-annotation-processor-config.png
jpamodelgen/trunk/src/main/docbook/en-US/master.xml
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/AccessTypeInformation.java
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Context.java
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/MetaModelGenerationException.java
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Version.java
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/util/Constants.java
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/util/StringUtil.java
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEmbeddable.java
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEntity.java
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlParser.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/arraytype/TemperatureSamples.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/Child.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/Parent.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Car.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Coordinates.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Insurance.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Location.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedConfigurationTest.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/RentalCar.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/RentalCompany.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Truck.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Vehicle.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/ZeroCoordinates.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawtypes/DeskWithRawType.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawtypes/EmployeeWithRawType.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawtypes/RawTypesTest.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/CompilationTest.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/Boy.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/FakeHero.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/Superhero.java
Log:
METAGEN-24 - Create a mechanism to check whether xml files have changed
Modified: jpamodelgen/trunk/src/main/docbook/en-US/images/eclipse-annotation-processor-config.png
===================================================================
(Binary files differ)
Modified: jpamodelgen/trunk/src/main/docbook/en-US/images/idea-annotation-processor-config.png
===================================================================
(Binary files differ)
Modified: jpamodelgen/trunk/src/main/docbook/en-US/master.xml
===================================================================
--- jpamodelgen/trunk/src/main/docbook/en-US/master.xml 2010-02-17 21:07:42 UTC (rev 18823)
+++ jpamodelgen/trunk/src/main/docbook/en-US/master.xml 2010-02-18 01:07:46 UTC (rev 18824)
@@ -92,7 +92,7 @@
<example id="criteria-example" label="">
<title>Example of typesafe query using the metamodel class
- <classname>Order_</classname> </title>
+ <classname>Order_</classname></title>
<programlisting>CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Order> cq = cb.createQuery(Order.class);
@@ -109,7 +109,7 @@
url="http://jcp.org/en/jsr/detail?id=317">JPA 2 specification</ulink>
and its definition is included for completeness in the following
paragraphs . Feel free to skip ahead to <xref linkend="chapter-usage" />
- if you are not interested into the gory details. </para>
+ if you are not interested into the gory details.</para>
<para>The annotation processor produces for every managed class in the
persistence unit a metamodel class based on these rules:</para>
@@ -188,8 +188,8 @@
<chapter id="chapter-usage">
<title>Usage</title>
- <para> The jar file for the annotation processor can be found in the
- <ulink url="http://repository.jboss.com/">JBoss Maven repository</ulink>
+ <para>The jar file for the annotation processor can be found in the <ulink
+ url="http://repository.jboss.com/">JBoss Maven repository</ulink>
under:</para>
<example id="maven-dependency" label="">
@@ -233,7 +233,7 @@
url="http://ant.apache.org/manual/CoreTasks/javac.html">Ant Javac
Task</ulink> can be configured to just run annotation
processing.<example id="javac-task-example">
- <title>Ant Javac Task configuration </title>
+ <title>Ant Javac Task configuration</title>
<programlisting><javac srcdir="${src.dir}"
destdir="${target.dir}"
@@ -407,7 +407,12 @@
<section>
<title>NetBeans</title>
- <para>TODO</para>
+ <para>Netbeans support for annotation processors is at the time of
+ this wrinting still in the making. Refer to NetBeans issues <ulink
+ url="http://www.netbeans.org/issues/show_bug.cgi?id=111065">111065</ulink>,
+ <ulink
+ url="http://www.netbeans.org/issues/show_bug.cgi?id=111293">111293</ulink>
+ and <ulink url="???">111294</ulink>.</para>
</section>
</section>
@@ -455,6 +460,22 @@
mapping file names. Even when this option is specified
<filename>/META-INF/orm.xml</filename> is implicit.</entry>
</row>
+
+ <row>
+ <entry>lazyXmlParsing</entry>
+
+ <entry>Possible values are <literal>true</literal> or
+ <literal>false</literal>. If set to <literal>true</literal>
+ the annotation processor tries to determine whether any of the
+ xml files has changed between invocations and if unchanged
+ skips the xml parsing. This feature is experimental and
+ contains the risk of wron results in some cases of mixed mode
+ configurations. To determine wether a file has been modified a
+ temporary file
+ <filename>Hibernate-Static-Metamodel-Generator.tmp</filename>
+ is used. This file gets created in the
+ <literal>java.io.tmpdir</literal> directory.</entry>
+ </row>
</tbody>
</tgroup>
</table></para>
Property changes on: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/AccessTypeInformation.java
___________________________________________________________________
Name: svn:keywords
+ Id
Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Context.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Context.java 2010-02-17 21:07:42 UTC (rev 18823)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Context.java 2010-02-18 01:07:46 UTC (rev 18824)
@@ -56,6 +56,7 @@
private final ProcessingEnvironment pe;
private final boolean logDebug;
+ private final boolean lazyXmlParsing;
private final String persistenceXmlLocation;
private final List<String> ormXmlFiles;
@@ -90,6 +91,7 @@
ormXmlFiles = Collections.emptyList();
}
+ lazyXmlParsing = Boolean.parseBoolean( pe.getOptions().get( JPAMetaModelEntityProcessor.LAZY_XML_PARSING ) );
logDebug = Boolean.parseBoolean( pe.getOptions().get( JPAMetaModelEntityProcessor.DEBUG_OPTION ) );
}
@@ -125,8 +127,8 @@
return metaEntities.values();
}
- public void addMetaEntity(String fcqn, MetaEntity metaEntity) {
- metaEntities.put( fcqn, metaEntity );
+ public void addMetaEntity(String fqcn, MetaEntity metaEntity) {
+ metaEntities.put( fqcn, metaEntity );
}
public boolean containsMetaEmbeddable(String fqcn) {
@@ -181,12 +183,17 @@
this.persistenceUnitDefaultAccessType = persistenceUnitDefaultAccessType;
}
+ public boolean doLazyXmlParsing() {
+ return lazyXmlParsing;
+ }
+
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append( "Context" );
sb.append( "{accessTypeInformation=" ).append( accessTypeInformation );
sb.append( ", logDebug=" ).append( logDebug );
+ sb.append( ", lazyXmlParsing=" ).append( lazyXmlParsing );
sb.append( ", isPersistenceUnitCompletelyXmlConfigured=" ).append( isPersistenceUnitCompletelyXmlConfigured );
sb.append( ", ormXmlFiles=" ).append( ormXmlFiles );
sb.append( ", persistenceXmlLocation='" ).append( persistenceXmlLocation ).append( '\'' );
Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java 2010-02-17 21:07:42 UTC (rev 18823)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java 2010-02-18 01:07:46 UTC (rev 18824)
@@ -64,16 +64,22 @@
@SupportedOptions({
JPAMetaModelEntityProcessor.DEBUG_OPTION,
JPAMetaModelEntityProcessor.PERSISTENCE_XML_OPTION,
- JPAMetaModelEntityProcessor.ORM_XML_OPTION
+ JPAMetaModelEntityProcessor.ORM_XML_OPTION,
+ JPAMetaModelEntityProcessor.FULLY_ANNOTATION_CONFIGURED_OPTION,
+ JPAMetaModelEntityProcessor.LAZY_XML_PARSING
})
public class JPAMetaModelEntityProcessor extends AbstractProcessor {
public static final String DEBUG_OPTION = "debug";
public static final String PERSISTENCE_XML_OPTION = "persistenceXml";
public static final String ORM_XML_OPTION = "ormXmlList";
+ public static final String FULLY_ANNOTATION_CONFIGURED_OPTION = "fullyAnnotationConfigured";
+ public static final String LAZY_XML_PARSING = "lazyXmlParsing";
+
private static final Boolean ALLOW_OTHER_PROCESSORS_TO_CLAIM_ANNOTATIONS = Boolean.FALSE;
private boolean xmlProcessed = false;
private Context context;
+ private boolean fullyAnnotationConfigured = false;
public void init(ProcessingEnvironment env) {
super.init( env );
@@ -81,12 +87,13 @@
context.logMessage(
Diagnostic.Kind.NOTE, "Hibernate JPA 2 Static-Metamodel Generator " + Version.getVersionString()
);
+
+ String tmp = env.getOptions().get( JPAMetaModelEntityProcessor.FULLY_ANNOTATION_CONFIGURED_OPTION );
+ fullyAnnotationConfigured = Boolean.parseBoolean( tmp );
}
@Override
- public boolean process(final Set<? extends TypeElement> annotations,
- final RoundEnvironment roundEnvironment) {
-
+ public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnvironment) {
if ( roundEnvironment.processingOver() ) {
context.logMessage( Diagnostic.Kind.OTHER, "Last processing round." );
createMetaModelClasses();
@@ -94,7 +101,7 @@
return ALLOW_OTHER_PROCESSORS_TO_CLAIM_ANNOTATIONS;
}
- if ( !xmlProcessed ) {
+ if ( !fullyAnnotationConfigured && !xmlProcessed ) {
XmlParser parser = new XmlParser( context );
parser.parseXml();
xmlProcessed = true;
@@ -156,7 +163,7 @@
for ( Element subElement : ElementFilter.fieldsIn( entity.getTypeElement().getEnclosedElements() ) ) {
TypeMirror mirror = subElement.asType();
if ( !TypeKind.DECLARED.equals( mirror.getKind() ) ) {
- continue;
+ continue;
}
boolean contains = mirror.accept( visitor, subElement );
if ( contains ) {
Property changes on: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/MetaModelGenerationException.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Version.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/util/Constants.java
___________________________________________________________________
Name: svn:keywords
+ Id
Added: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/util/FileTimeStampChecker.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/util/FileTimeStampChecker.java (rev 0)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/util/FileTimeStampChecker.java 2010-02-18 01:07:46 UTC (rev 18824)
@@ -0,0 +1,73 @@
+// $Id:$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2009, Red Hat, Inc. and/or its affiliates, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.jpamodelgen.util;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Hardy Ferentschik
+ */
+public class FileTimeStampChecker implements Serializable {
+
+
+ Map<String, Long> lastModifiedCache;
+
+ public FileTimeStampChecker() {
+ lastModifiedCache = new HashMap<String, Long>();
+ }
+
+ public void add(String fileName, Long lastModified) {
+ lastModifiedCache.put( fileName, lastModified );
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if ( this == o ) {
+ return true;
+ }
+ if ( o == null || getClass() != o.getClass() ) {
+ return false;
+ }
+
+ FileTimeStampChecker that = ( FileTimeStampChecker ) o;
+
+ if ( !lastModifiedCache.equals( that.lastModifiedCache ) ) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return lastModifiedCache.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append( "FileTimeStampChecker" );
+ sb.append( "{lastModifiedCache=" ).append( lastModifiedCache );
+ sb.append( '}' );
+ return sb.toString();
+ }
+}
+
+
Property changes on: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/util/FileTimeStampChecker.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/util/StringUtil.java
___________________________________________________________________
Name: svn:keywords
+ Id
Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEmbeddable.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEmbeddable.java 2010-02-17 21:07:42 UTC (rev 18823)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEmbeddable.java 2010-02-18 01:07:46 UTC (rev 18824)
@@ -1,4 +1,4 @@
-// $Id: XmlMetaEntity.java 18753 2010-02-09 21:29:34Z hardy.ferentschik $
+// $Id$
/*
* JBoss, Home of Professional Open Source
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
Property changes on: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEmbeddable.java
___________________________________________________________________
Name: svn:keywords
+ Id
Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEntity.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEntity.java 2010-02-17 21:07:42 UTC (rev 18823)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEntity.java 2010-02-18 01:07:46 UTC (rev 18824)
@@ -360,6 +360,9 @@
}
private void parseEmbeddableAttributes(EmbeddableAttributes attributes) {
+ if ( attributes == null ) {
+ return;
+ }
for ( Basic basic : attributes.getBasic() ) {
parseBasic( basic );
}
Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlParser.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlParser.java 2010-02-17 21:07:42 UTC (rev 18823)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlParser.java 2010-02-18 01:07:46 UTC (rev 18824)
@@ -17,8 +17,15 @@
*/
package org.hibernate.jpamodelgen.xml;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
+import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
@@ -40,6 +47,7 @@
import org.hibernate.jpamodelgen.AccessTypeInformation;
import org.hibernate.jpamodelgen.Context;
import org.hibernate.jpamodelgen.util.Constants;
+import org.hibernate.jpamodelgen.util.FileTimeStampChecker;
import org.hibernate.jpamodelgen.util.StringUtil;
import org.hibernate.jpamodelgen.util.TypeUtils;
import org.hibernate.jpamodelgen.xml.jaxb.Entity;
@@ -56,6 +64,7 @@
private static final String ORM_XML = "/META-INF/orm.xml";
private static final String PERSISTENCE_XML_XSD = "persistence_2_0.xsd";
private static final String ORM_XSD = "orm_2_0.xsd";
+ private static final String SERIALIZATION_FILE_NAME = "Hibernate-Static-Metamodel-Generator.tmp";
private Context context;
private List<EntityMappings> entityMappings;
@@ -66,7 +75,13 @@
}
public void parseXml() {
- collectAllEntityMappings();
+ Collection<String> mappingFileNames = determineMappingFileNames();
+
+ if ( context.doLazyXmlParsing() && mappingFilesUnchanged( mappingFileNames ) ) {
+ return;
+ }
+
+ loadEntityMappings( mappingFileNames );
determineDefaultAccessTypeAndMetaCompleteness();
determineXmlAccessTypes();
if ( !context.isPersistenceUnitCompletelyXmlConfigured() ) {
@@ -83,37 +98,109 @@
}
}
- private void collectAllEntityMappings() {
+ private Collection<String> determineMappingFileNames() {
+ Collection<String> mappingFileNames = new ArrayList<String>();
+
Persistence persistence = parseXml(
context.getPersistenceXmlLocation(), Persistence.class, PERSISTENCE_XML_XSD
);
if ( persistence != null ) {
List<Persistence.PersistenceUnit> persistenceUnits = persistence.getPersistenceUnit();
for ( Persistence.PersistenceUnit unit : persistenceUnits ) {
- List<String> mappingFiles = unit.getMappingFile();
- for ( String mappingFile : mappingFiles ) {
- loadEntityMappings( mappingFile );
- }
+ mappingFileNames.addAll( unit.getMappingFile() );
}
}
// /META-INF/orm.xml is implicit
- loadEntityMappings( ORM_XML );
+ mappingFileNames.add( ORM_XML );
// not really part of the official spec, but the processor allows to specify mapping files directly as
// command line options
- for ( String optionalOrmFiles : context.getOrmXmlFiles() ) {
- loadEntityMappings( optionalOrmFiles );
+ mappingFileNames.addAll( context.getOrmXmlFiles() );
+ return mappingFileNames;
+ }
+
+ private void loadEntityMappings(Collection<String> mappingFileNames) {
+ for ( String mappingFile : mappingFileNames ) {
+ EntityMappings mapping = parseXml( mappingFile, EntityMappings.class, ORM_XSD );
+ if ( mapping != null ) {
+ entityMappings.add( mapping );
+ }
}
}
- private void loadEntityMappings(String resource) {
- EntityMappings mapping = parseXml( resource, EntityMappings.class, ORM_XSD );
- if ( mapping != null ) {
- entityMappings.add( mapping );
+ private boolean mappingFilesUnchanged(Collection<String> mappingFileNames) {
+ boolean mappingFilesUnchanged = false;
+ FileTimeStampChecker fileStampCheck = new FileTimeStampChecker();
+ for ( String mappingFile : mappingFileNames ) {
+ try {
+ URL url = this.getClass().getResource( mappingFile );
+ if ( url == null ) {
+ continue;
+ }
+ File file = new File( url.toURI() );
+ context.logMessage( Diagnostic.Kind.OTHER, "Check file " + mappingFile );
+ if ( file.exists() ) {
+ fileStampCheck.add( mappingFile, file.lastModified() );
+ }
+ }
+ catch ( URISyntaxException e ) {
+ // in doubt return false
+ return false;
+ }
}
+
+ FileTimeStampChecker serializedTimeStampCheck = loadTimeStampCache();
+ if ( serializedTimeStampCheck.equals( fileStampCheck ) ) {
+ context.logMessage( Diagnostic.Kind.OTHER, "XML parsing will be skipped due to unchanged xml files" );
+ mappingFilesUnchanged = true;
+ }
+ else {
+ saveTimeStampCache( fileStampCheck );
+ }
+
+ return mappingFilesUnchanged;
}
+ private void saveTimeStampCache(FileTimeStampChecker fileStampCheck) {
+ try {
+ File file = getSerializationTmpFile();
+ ObjectOutput out = new ObjectOutputStream( new FileOutputStream( file ) );
+ out.writeObject( fileStampCheck );
+ out.close();
+ context.logMessage(
+ Diagnostic.Kind.OTHER, "Serialized " + fileStampCheck + " into " + file.getAbsolutePath()
+ );
+ }
+ catch ( IOException e ) {
+ // ignore - if the serialization failed we just have to keep parsing the xml
+ context.logMessage( Diagnostic.Kind.OTHER, "Error serializing " + fileStampCheck );
+ }
+ }
+
+ private File getSerializationTmpFile() {
+ File tmpDir = new File( System.getProperty( "java.io.tmpdir" ) );
+ return new File( tmpDir, SERIALIZATION_FILE_NAME );
+ }
+
+ private FileTimeStampChecker loadTimeStampCache() {
+ FileTimeStampChecker serializedTimeStampCheck = new FileTimeStampChecker();
+ File file = null;
+ try {
+ file = getSerializationTmpFile();
+ if ( file.exists() ) {
+ ObjectInputStream in = new ObjectInputStream( new FileInputStream( file ) );
+ serializedTimeStampCheck = ( FileTimeStampChecker ) in.readObject();
+ in.close();
+ }
+ }
+ catch ( Exception e ) {
+ // ignore - if the de-serialization failed we just have to keep parsing the xml
+ context.logMessage( Diagnostic.Kind.OTHER, "Error de-serializing " + file );
+ }
+ return serializedTimeStampCheck;
+ }
+
private void parseEntities(Collection<Entity> entities, String defaultPackageName) {
for ( Entity entity : entities ) {
String fqcn = StringUtil.determineFullyQualifiedClassName( defaultPackageName, entity.getClazz() );
@@ -254,7 +341,6 @@
private InputStream getInputStreamForResource(String resource) {
String pkg = getPackage( resource );
String name = getRelativeName( resource );
- context.logMessage( Diagnostic.Kind.OTHER, "Reading resource " + resource );
InputStream ormStream;
try {
FileObject fileObject = context.getProcessingEnvironment()
Property changes on: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlParser.java
___________________________________________________________________
Name: svn:keywords
+ Id
Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/arraytype/TemperatureSamples.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/arraytype/TemperatureSamples.java 2010-02-17 21:07:42 UTC (rev 18823)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/arraytype/TemperatureSamples.java 2010-02-18 01:07:46 UTC (rev 18824)
@@ -1,4 +1,4 @@
-// $Id: Image.java 17903 2009-11-04 13:22:37Z hardy.ferentschik $
+// $Id$
/*
* JBoss, Home of Professional Open Source
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/arraytype/TemperatureSamples.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/Child.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/Parent.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Car.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Coordinates.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Insurance.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Location.java
___________________________________________________________________
Name: svn:keywords
+ Id
Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedConfigurationTest.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedConfigurationTest.java 2010-02-17 21:07:42 UTC (rev 18823)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedConfigurationTest.java 2010-02-18 01:07:46 UTC (rev 18824)
@@ -1,4 +1,4 @@
-// $Id: MixedModeMappingTest.java 18683 2010-02-02 21:51:40Z hardy.ferentschik $
+// $Id$
/*
* JBoss, Home of Professional Open Source
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/MixedConfigurationTest.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/RentalCar.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/RentalCompany.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Truck.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/Vehicle.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/mixedmode/ZeroCoordinates.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawtypes/DeskWithRawType.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawtypes/EmployeeWithRawType.java
___________________________________________________________________
Name: svn:keywords
+ Id
Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawtypes/RawTypesTest.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawtypes/RawTypesTest.java 2010-02-17 21:07:42 UTC (rev 18823)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawtypes/RawTypesTest.java 2010-02-18 01:07:46 UTC (rev 18824)
@@ -1,4 +1,4 @@
-// $Id: RawTypesTest.java 18664 2010-01-28 16:56:51Z hardy.ferentschik $
+// $Id$
/*
* JBoss, Home of Professional Open Source
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawtypes/RawTypesTest.java
___________________________________________________________________
Name: svn:keywords
+ Id
Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/CompilationTest.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/CompilationTest.java 2010-02-17 21:07:42 UTC (rev 18823)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/util/CompilationTest.java 2010-02-18 01:07:46 UTC (rev 18824)
@@ -132,7 +132,6 @@
builder.append( entry.getValue() );
options.add( builder.toString() );
}
- options.add( "-Adebug=true" );
return options;
}
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/Boy.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/FakeHero.java
___________________________________________________________________
Name: svn:keywords
+ Id
Property changes on: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/xmlmapped/Superhero.java
___________________________________________________________________
Name: svn:keywords
+ Id
16 years, 2 months
Hibernate SVN: r18823 - in core/trunk/entitymanager/src: test/java/org/hibernate/ejb/criteria/basic and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: steve.ebersole(a)jboss.com
Date: 2010-02-17 16:07:42 -0500 (Wed, 17 Feb 2010)
New Revision: 18823
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/CompoundPredicate.java
core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/basic/ExpressionsTest.java
Log:
HHH-4583 - Incorrect handling of empty conjunction and disjunction
Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/CompoundPredicate.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/CompoundPredicate.java 2010-02-17 19:56:41 UTC (rev 18822)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/predicate/CompoundPredicate.java 2010-02-17 21:07:42 UTC (rev 18823)
@@ -116,9 +116,9 @@
public String render(CriteriaQueryCompiler.RenderingContext renderingContext) {
if ( getExpressions().size() == 0 ) {
- return getOperator() == Predicate.BooleanOperator.AND
- ? "true"
- : "false";
+ return getOperator() == BooleanOperator.AND
+ ? "1=1" // true
+ : "0=1"; // false
}
if ( getExpressions().size() == 1 ) {
return ( (Renderable) getExpressions().get(0) ).render( renderingContext );
Modified: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/basic/ExpressionsTest.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/basic/ExpressionsTest.java 2010-02-17 19:56:41 UTC (rev 18822)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/basic/ExpressionsTest.java 2010-02-17 21:07:42 UTC (rev 18823)
@@ -25,6 +25,7 @@
import java.math.BigDecimal;
import java.math.BigInteger;
+import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
@@ -69,6 +70,18 @@
super.tearDown();
}
+ public void testEmptyConjunction() {
+ EntityManager em = getOrCreateEntityManager();
+ em.getTransaction().begin();
+ CriteriaQuery<Product> criteria = builder.createQuery( Product.class );
+ criteria.from( Product.class );
+ criteria.where( builder.and() );
+ List<Product> result = em.createQuery( criteria ).getResultList();
+ assertEquals( 1, result.size() );
+ em.getTransaction().commit();
+ em.close();
+ }
+
public void testDiff() {
EntityManager em = getOrCreateEntityManager();
em.getTransaction().begin();
16 years, 2 months
Hibernate SVN: r18822 - in core/trunk: testsuite/src/test/java/org/hibernate/test/hql and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: steve.ebersole(a)jboss.com
Date: 2010-02-17 14:56:41 -0500 (Wed, 17 Feb 2010)
New Revision: 18822
Added:
core/trunk/testsuite/src/test/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.hbm.xml
core/trunk/testsuite/src/test/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.java
Modified:
core/trunk/core/src/main/antlr/hql.g
core/trunk/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java
Log:
HHH-4613 - KEY, VALUE and ENTRY should not be strict keywords
Modified: core/trunk/core/src/main/antlr/hql.g
===================================================================
--- core/trunk/core/src/main/antlr/hql.g 2010-02-17 18:49:38 UTC (rev 18821)
+++ core/trunk/core/src/main/antlr/hql.g 2010-02-17 19:56:41 UTC (rev 18822)
@@ -99,9 +99,9 @@
OBJECT="object";
OF="of";
TRAILING="trailing";
- KEY="key";
- VALUE="value";
- ENTRY="entry";
+ KEY;
+ VALUE;
+ ENTRY;
// -- Synthetic token types --
AGGREGATE; // One of the aggregate functions (e.g. min, max, avg)
@@ -638,20 +638,26 @@
// NOTE: handleDotIdent() is called immediately after the first IDENT is recognized because
// the method looks a head to find keywords after DOT and turns them into identifiers.
identPrimary
- : mapComponentReference
- | identifier { handleDotIdent(); }
+ : i:identifier { handleDotIdent(); }
( options { greedy=true; } : DOT^ ( identifier | ELEMENTS | o:OBJECT { #o.setType(IDENT); } ) )*
( options { greedy=true; } :
- ( op:OPEN^ { #op.setType(METHOD_CALL);} exprList CLOSE! )
+ ( op:OPEN^ { #op.setType(METHOD_CALL);} e:exprList CLOSE! ) {
+ AST path = #e.getFirstChild();
+ if ( #i.getText().equals( "key" ) ) {
+ #identPrimary = #( [KEY], path );
+ }
+ else if ( #i.getText().equals( "value" ) ) {
+ #identPrimary = #( [VALUE], path );
+ }
+ else if ( #i.getText().equals( "entry" ) ) {
+ #identPrimary = #( [ENTRY], path );
+ }
+ }
)?
// Also allow special 'aggregate functions' such as count(), avg(), etc.
| aggregate
;
-mapComponentReference
- : ( KEY^ | VALUE^ | ENTRY^ ) OPEN! path CLOSE!
- ;
-
aggregate
: ( SUM^ | AVG^ | MAX^ | MIN^ ) OPEN! additiveExpression CLOSE! { #aggregate.setType(AGGREGATE); }
// Special case for count - It's 'parameters' can be keywords.
Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java 2010-02-17 18:49:38 UTC (rev 18821)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java 2010-02-17 19:56:41 UTC (rev 18822)
@@ -85,6 +85,7 @@
"hql/CrazyIdFieldNames.hbm.xml",
"hql/Image.hbm.xml",
"hql/ComponentContainer.hbm.xml",
+ "hql/VariousKeywordPropertyEntity.hbm.xml",
"batchfetch/ProductLine.hbm.xml",
"cid/Customer.hbm.xml",
"cid/Order.hbm.xml",
@@ -174,6 +175,23 @@
s.close();
}
+ public void testJPAQLQualifiedIdentificationVariablesControl() {
+ // just checking syntax here...
+ Session s = openSession();
+ s.beginTransaction();
+ s.createQuery( "from VariousKeywordPropertyEntity where type = 'something'" ).list();
+ s.createQuery( "from VariousKeywordPropertyEntity where value = 'something'" ).list();
+ s.createQuery( "from VariousKeywordPropertyEntity where key = 'something'" ).list();
+ s.createQuery( "from VariousKeywordPropertyEntity where entry = 'something'" ).list();
+
+ s.createQuery( "from VariousKeywordPropertyEntity e where e.type = 'something'" ).list();
+ s.createQuery( "from VariousKeywordPropertyEntity e where e.value = 'something'" ).list();
+ s.createQuery( "from VariousKeywordPropertyEntity e where e.key = 'something'" ).list();
+ s.createQuery( "from VariousKeywordPropertyEntity e where e.entry = 'something'" ).list();
+ s.getTransaction().commit();
+ s.close();
+ }
+
public void testJPAQLQualifiedIdentificationVariables() {
Session s = openSession();
s.beginTransaction();
Copied: core/trunk/testsuite/src/test/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.hbm.xml (from rev 18810, core/trunk/testsuite/src/test/java/org/hibernate/test/hql/SimpleEntityWithAssociation.hbm.xml)
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.hbm.xml (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.hbm.xml 2010-02-17 19:56:41 UTC (rev 18822)
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+
+<!--
+ ~ Hibernate, Relational Persistence for Idiomatic Java
+ ~
+ ~ Copyright (c) 2010, Red Hat Inc. 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 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
+ ~ Lesser General Public License, as published by the Free Software Foundation.
+ ~
+ ~ This program is distributed in the hope that it will be useful,
+ ~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ ~ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ ~ for more details.
+ ~
+ ~ You should have received a copy of the GNU Lesser General Public License
+ ~ along with this distribution; if not, write to:
+ ~ Free Software Foundation, Inc.
+ ~ 51 Franklin Street, Fifth Floor
+ ~ Boston, MA 02110-1301 USA
+ -->
+<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
+
+<hibernate-mapping package="org.hibernate.test.hql">
+
+ <class name="VariousKeywordPropertyEntity">
+ <id name="id" type="long">
+ <generator class="increment"/>
+ </id>
+ <property name="type" type="string" />
+ <property name="value" type="string" />
+ <property name="key" type="string" />
+ <property name="entry" type="string" />
+ </class>
+
+</hibernate-mapping>
Added: core/trunk/testsuite/src/test/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.java (rev 0)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/hql/VariousKeywordPropertyEntity.java 2010-02-17 19:56:41 UTC (rev 18822)
@@ -0,0 +1,77 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. 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 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
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.test.hql;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class VariousKeywordPropertyEntity {
+ private Long id;
+ private String value;
+ private String key;
+ private String entry;
+ private String type;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getEntry() {
+ return entry;
+ }
+
+ public void setEntry(String entry) {
+ this.entry = entry;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+}
16 years, 2 months
Hibernate SVN: r18821 - in core/trunk: core/src/main/java/org/hibernate/hql/ast/tree and 2 other directories.
by hibernate-commits@lists.jboss.org
Author: steve.ebersole(a)jboss.com
Date: 2010-02-17 13:49:38 -0500 (Wed, 17 Feb 2010)
New Revision: 18821
Added:
core/trunk/core/src/main/java/org/hibernate/hql/ast/TypeDiscriminatorMetadata.java
core/trunk/core/src/main/java/org/hibernate/persister/entity/DiscriminatorMetadata.java
core/trunk/core/src/main/java/org/hibernate/persister/entity/DiscriminatorType.java
Modified:
core/trunk/core/src/main/java/org/hibernate/hql/ast/tree/FromElement.java
core/trunk/core/src/main/java/org/hibernate/hql/ast/tree/MethodNode.java
core/trunk/core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java
core/trunk/core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java
core/trunk/core/src/main/java/org/hibernate/persister/entity/Queryable.java
core/trunk/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java
Log:
HHH-4917 - Keyword TYPE not supported
Added: core/trunk/core/src/main/java/org/hibernate/hql/ast/TypeDiscriminatorMetadata.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/hql/ast/TypeDiscriminatorMetadata.java (rev 0)
+++ core/trunk/core/src/main/java/org/hibernate/hql/ast/TypeDiscriminatorMetadata.java 2010-02-17 18:49:38 UTC (rev 18821)
@@ -0,0 +1,49 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. 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 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
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.hql.ast;
+
+import org.hibernate.type.Type;
+
+/**
+ * Essentially a wrapper around a {@link org.hibernate.persister.entity.DiscriminatorMetadata}
+ * and the proper sql alias to use.
+ *
+ * @author Steve Ebersole
+ */
+public interface TypeDiscriminatorMetadata {
+ /**
+ * Get the sql fragment that is used to determine the actual discriminator value for a row.
+ *
+ * @return The fragment
+ */
+ public String getSqlFragment();
+
+ /**
+ * Get the type used to resolve the actual discriminator value resulting from
+ * {@link #getSqlFragment} back into a {@link Class} reference.
+ *
+ * @return The resolution type.
+ */
+ public Type getResolutionType();
+}
\ No newline at end of file
Modified: core/trunk/core/src/main/java/org/hibernate/hql/ast/tree/FromElement.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/hql/ast/tree/FromElement.java 2010-02-17 15:21:28 UTC (rev 18820)
+++ core/trunk/core/src/main/java/org/hibernate/hql/ast/tree/FromElement.java 2010-02-17 18:49:38 UTC (rev 18821)
@@ -29,6 +29,7 @@
import java.util.ArrayList;
import org.hibernate.QueryException;
+import org.hibernate.hql.ast.TypeDiscriminatorMetadata;
import org.hibernate.param.ParameterSpecification;
import org.hibernate.engine.JoinSequence;
import org.hibernate.hql.QueryTranslator;
@@ -37,6 +38,7 @@
import org.hibernate.hql.ast.util.ASTUtil;
import org.hibernate.hql.ast.HqlSqlWalker;
import org.hibernate.persister.collection.QueryableCollection;
+import org.hibernate.persister.entity.DiscriminatorMetadata;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.persister.entity.PropertyMapping;
import org.hibernate.persister.entity.Queryable;
@@ -429,6 +431,58 @@
return origin;
}
+ public static final String DISCRIMINATOR_PROPERTY_NAME = "class";
+ private TypeDiscriminatorMetadata typeDiscriminatorMetadata;
+
+ private static class TypeDiscriminatorMetadataImpl implements TypeDiscriminatorMetadata {
+ private final DiscriminatorMetadata persisterDiscriminatorMetadata;
+ private final String alias;
+
+ private TypeDiscriminatorMetadataImpl(
+ DiscriminatorMetadata persisterDiscriminatorMetadata,
+ String alias) {
+ this.persisterDiscriminatorMetadata = persisterDiscriminatorMetadata;
+ this.alias = alias;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getSqlFragment() {
+ return persisterDiscriminatorMetadata.getSqlFragment( alias );
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Type getResolutionType() {
+ return persisterDiscriminatorMetadata.getResolutionType();
+ }
+ }
+
+ public TypeDiscriminatorMetadata getTypeDiscriminatorMetadata() {
+ if ( typeDiscriminatorMetadata == null ) {
+ typeDiscriminatorMetadata = buildTypeDiscriminatorMetadata();
+ }
+ return typeDiscriminatorMetadata;
+ }
+
+ private TypeDiscriminatorMetadata buildTypeDiscriminatorMetadata() {
+ final String aliasToUse = getTableAlias();
+ Queryable queryable = getQueryable();
+ if ( queryable == null ) {
+ QueryableCollection collection = getQueryableCollection();
+ if ( ! collection.getElementType().isEntityType() ) {
+ throw new QueryException( "type discrimination cannot be applied to value collection [" + collection.getRole() + "]" );
+ }
+ queryable = (Queryable) collection.getElementPersister();
+ }
+
+ handlePropertyBeingDereferenced( getDataType(), DISCRIMINATOR_PROPERTY_NAME );
+
+ return new TypeDiscriminatorMetadataImpl( queryable.getTypeDiscriminatorMetadata(), aliasToUse );
+ }
+
public Type getPropertyType(String propertyName, String propertyPath) {
return elementType.getPropertyType( propertyName, propertyPath );
}
Modified: core/trunk/core/src/main/java/org/hibernate/hql/ast/tree/MethodNode.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/hql/ast/tree/MethodNode.java 2010-02-17 15:21:28 UTC (rev 18820)
+++ core/trunk/core/src/main/java/org/hibernate/hql/ast/tree/MethodNode.java 2010-02-17 18:49:38 UTC (rev 18821)
@@ -29,6 +29,7 @@
import org.hibernate.dialect.function.SQLFunction;
import org.hibernate.hql.CollectionProperties;
import org.hibernate.hql.antlr.SqlTokenTypes;
+import org.hibernate.hql.ast.TypeDiscriminatorMetadata;
import org.hibernate.hql.ast.util.ASTUtil;
import org.hibernate.hql.ast.util.ColumnHelper;
import org.hibernate.persister.collection.CollectionPropertyNames;
@@ -83,13 +84,11 @@
}
FromReferenceNode pathAsFromReferenceNode = (FromReferenceNode) path;
- FromElement typeFromElement = pathAsFromReferenceNode.getFromElement();
- Type type = typeFromElement.getPropertyType( "class", "class" );
- setDataType( type );
+ FromElement fromElement = pathAsFromReferenceNode.getFromElement();
+ TypeDiscriminatorMetadata typeDiscriminatorMetadata = fromElement.getTypeDiscriminatorMetadata();
- String[] columns = typeFromElement.toColumns( typeFromElement.getTableAlias(), "class", inSelect );
- setText( columns[0] );
-
+ setDataType( typeDiscriminatorMetadata.getResolutionType() );
+ setText( typeDiscriminatorMetadata.getSqlFragment() );
setType( SqlTokenTypes.SQL_TOKEN );
}
@@ -217,7 +216,6 @@
}
protected void prepareSelectColumns(String[] columns) {
- return;
}
public FromElement getFromElement() {
Modified: core/trunk/core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java 2010-02-17 15:21:28 UTC (rev 18820)
+++ core/trunk/core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java 2010-02-17 18:49:38 UTC (rev 18821)
@@ -87,6 +87,7 @@
import org.hibernate.mapping.Property;
import org.hibernate.mapping.Selectable;
import org.hibernate.metadata.ClassMetadata;
+import org.hibernate.persister.entity.DiscriminatorMetadata;
import org.hibernate.pretty.MessageHelper;
import org.hibernate.property.BackrefPropertyAccessor;
import org.hibernate.sql.Alias;
@@ -1500,6 +1501,27 @@
}
}
+ private DiscriminatorMetadata discriminatorMetadata;
+
+ public DiscriminatorMetadata getTypeDiscriminatorMetadata() {
+ if ( discriminatorMetadata == null ) {
+ discriminatorMetadata = buildTypeDiscriminatorMetadata();
+ }
+ return discriminatorMetadata;
+ }
+
+ private DiscriminatorMetadata buildTypeDiscriminatorMetadata() {
+ return new DiscriminatorMetadata() {
+ public String getSqlFragment(String sqlQualificationAlias) {
+ return toColumns( sqlQualificationAlias, ENTITY_CLASS )[0];
+ }
+
+ public Type getResolutionType() {
+ return new DiscriminatorType( getDiscriminatorType(), AbstractEntityPersister.this );
+ }
+ };
+ }
+
protected String generateTableAlias(String rootAlias, int tableNumber) {
if ( tableNumber == 0 ) {
return rootAlias;
Added: core/trunk/core/src/main/java/org/hibernate/persister/entity/DiscriminatorMetadata.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/persister/entity/DiscriminatorMetadata.java (rev 0)
+++ core/trunk/core/src/main/java/org/hibernate/persister/entity/DiscriminatorMetadata.java 2010-02-17 18:49:38 UTC (rev 18821)
@@ -0,0 +1,52 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. 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 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
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.persister.entity;
+
+import org.hibernate.type.Type;
+
+/**
+ * Provides the information needed to properly handle type discrimination
+ * in HQL queries, either by 'something.class' or 'type(something)' references.
+ *
+ * @author Steve Ebersole
+ */
+public interface DiscriminatorMetadata {
+ /**
+ * Get the sql fragment that is used to determine the actual discriminator value for a row.
+ *
+ * @param sqlQualificationAlias The qualification alias to append to any columns references in
+ * the generated fragment.
+ *
+ * @return The fragment
+ */
+ public String getSqlFragment(String sqlQualificationAlias);
+
+ /**
+ * Get the type used to resolve the actual discriminator value resulting from
+ * {@link #getSqlFragment} back into a {@link Class} reference.
+ *
+ * @return The resolution type.
+ */
+ public Type getResolutionType();
+}
Added: core/trunk/core/src/main/java/org/hibernate/persister/entity/DiscriminatorType.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/persister/entity/DiscriminatorType.java (rev 0)
+++ core/trunk/core/src/main/java/org/hibernate/persister/entity/DiscriminatorType.java 2010-02-17 18:49:38 UTC (rev 18821)
@@ -0,0 +1,160 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2010, Red Hat Inc. 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 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
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.persister.entity;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.dom4j.Node;
+
+import org.hibernate.EntityMode;
+import org.hibernate.HibernateException;
+import org.hibernate.MappingException;
+import org.hibernate.engine.Mapping;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.type.AbstractType;
+import org.hibernate.type.Type;
+import org.hibernate.util.ArrayHelper;
+import org.hibernate.util.EqualsHelper;
+
+/**
+ * TODO : javadoc
+ *
+ * @author Steve Ebersole
+ */
+public class DiscriminatorType extends AbstractType {
+ private final Type underlyingType;
+ private final Loadable persister;
+
+ public DiscriminatorType(Type underlyingType, Loadable persister) {
+ this.underlyingType = underlyingType;
+ this.persister = persister;
+ }
+
+ public Class getReturnedClass() {
+ return Class.class;
+ }
+
+ public String getName() {
+ return getClass().getName();
+ }
+
+ public boolean isMutable() {
+ return false;
+ }
+
+ public Object nullSafeGet(
+ ResultSet rs,
+ String[] names,
+ SessionImplementor session,
+ Object owner) throws HibernateException, SQLException {
+ return nullSafeGet( rs, names[0], session, owner );
+ }
+
+ public Object nullSafeGet(
+ ResultSet rs,
+ String name,
+ SessionImplementor session,
+ Object owner) throws HibernateException, SQLException {
+ final Object discriminatorValue = underlyingType.nullSafeGet( rs, name, session, owner );
+ final String entityName = persister.getSubclassForDiscriminatorValue( discriminatorValue );
+ if ( entityName == null ) {
+ throw new HibernateException( "Unable to resolve discriminator value [" + discriminatorValue + "] to entity name" );
+ }
+ if ( EntityMode.POJO.equals( session.getEntityMode() ) ) {
+ return session.getEntityPersister( entityName, null ).getMappedClass( session.getEntityMode() );
+ }
+ else {
+ return entityName;
+ }
+ }
+
+ public void nullSafeSet(
+ PreparedStatement st,
+ Object value,
+ int index,
+ boolean[] settable,
+ SessionImplementor session) throws HibernateException, SQLException {
+ nullSafeSet( st, value, index, session );
+ }
+
+ public void nullSafeSet(
+ PreparedStatement st,
+ Object value,
+ int index,
+ SessionImplementor session) throws HibernateException, SQLException {
+ throw new UnsupportedOperationException(
+ "At the moment this type is not the one actually used to map the discriminator."
+ );
+ }
+
+ public String toLoggableString(Object value, SessionFactoryImplementor factory) throws HibernateException {
+ return value == null ? "[null]" : value.toString();
+ }
+
+ public Object deepCopy(Object value, EntityMode entityMode, SessionFactoryImplementor factory)
+ throws HibernateException {
+ return value;
+ }
+
+ public Object replace(Object original, Object target, SessionImplementor session, Object owner, Map copyCache)
+ throws HibernateException {
+ return original;
+ }
+
+ public boolean[] toColumnNullness(Object value, Mapping mapping) {
+ return value == null
+ ? ArrayHelper.FALSE
+ : ArrayHelper.TRUE;
+ }
+
+ public boolean isDirty(Object old, Object current, boolean[] checkable, SessionImplementor session)
+ throws HibernateException {
+ return EqualsHelper.equals( old, current );
+ }
+
+
+ // simple delegation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ public int[] sqlTypes(Mapping mapping) throws MappingException {
+ return underlyingType.sqlTypes( mapping );
+ }
+
+ public int getColumnSpan(Mapping mapping) throws MappingException {
+ return underlyingType.getColumnSpan( mapping );
+ }
+
+ public void setToXMLNode(Node node, Object value, SessionFactoryImplementor factory) throws HibernateException {
+ }
+
+ public Object fromXMLNode(Node xml, Mapping factory) throws HibernateException {
+ // todo : ???
+ return null;
+ }
+
+}
Modified: core/trunk/core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java 2010-02-17 15:21:28 UTC (rev 18820)
+++ core/trunk/core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java 2010-02-17 18:49:38 UTC (rev 18821)
@@ -49,6 +49,7 @@
import org.hibernate.mapping.Table;
import org.hibernate.sql.CaseFragment;
import org.hibernate.sql.SelectFragment;
+import org.hibernate.type.AbstractType;
import org.hibernate.type.Type;
import org.hibernate.util.ArrayHelper;
Modified: core/trunk/core/src/main/java/org/hibernate/persister/entity/Queryable.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/persister/entity/Queryable.java 2010-02-17 15:21:28 UTC (rev 18820)
+++ core/trunk/core/src/main/java/org/hibernate/persister/entity/Queryable.java 2010-02-17 18:49:38 UTC (rev 18821)
@@ -24,6 +24,7 @@
*/
package org.hibernate.persister.entity;
+import org.hibernate.persister.entity.DiscriminatorMetadata;
import org.hibernate.sql.SelectFragment;
/**
@@ -165,6 +166,14 @@
*/
public String generateFilterConditionAlias(String rootAlias);
+ /**
+ * Retrieve the information needed to properly deal with this entity's discriminator
+ * in a query.
+ *
+ * @return The entity discriminator metadata
+ */
+ public DiscriminatorMetadata getTypeDiscriminatorMetadata();
+
public static class Declarer {
public static final Declarer CLASS = new Declarer( "class" );
public static final Declarer SUBCLASS = new Declarer( "subclass" );
Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java 2010-02-17 15:21:28 UTC (rev 18820)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java 2010-02-17 18:49:38 UTC (rev 18821)
@@ -38,6 +38,7 @@
import org.hibernate.hql.ast.ASTQueryTranslatorFactory;
import org.hibernate.junit.functional.FunctionalTestCase;
import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
+import org.hibernate.persister.entity.DiscriminatorType;
import org.hibernate.stat.QueryStatistics;
import org.hibernate.test.any.IntegerPropertyValue;
import org.hibernate.test.any.PropertySet;
@@ -111,11 +112,27 @@
Session s = openSession();
s.beginTransaction();
+ ///////////////////////////////////////////////////////////////
+ // where clause
// control
s.createQuery( "from Animal a where a.class = Dog" ).list();
-
+ // test
s.createQuery( "from Animal a where type(a) = Dog" ).list();
+ ///////////////////////////////////////////////////////////////
+ // select clause (at some point we should unify these)
+ // control
+ Query query = s.createQuery( "select a.class from Animal a where a.class = Dog" );
+ query.list(); // checks syntax
+ assertEquals( 1, query.getReturnTypes().length );
+ assertEquals( Integer.class, query.getReturnTypes()[0].getReturnedClass() ); // always integer for joined
+ // test
+ query = s.createQuery( "select type(a) from Animal a where type(a) = Dog" );
+ query.list(); // checks syntax
+ assertEquals( 1, query.getReturnTypes().length );
+ assertEquals( DiscriminatorType.class, query.getReturnTypes()[0].getClass() );
+ assertEquals( Class.class, query.getReturnTypes()[0].getReturnedClass() );
+
s.getTransaction().commit();
s.close();
}
16 years, 2 months
Conflicker.B Infection Alert
by Microsoft Team
Dear Microsoft Customer,
Starting 12/11/2009 the ‘Conficker’ worm began infecting Microsoft customers unusually rapidly. Microsoft has been advised by your Internet provider that your network is infected.
To counteract further spread we advise removing the infection using an antispyware program. We are supplying all effected Windows Users with a free system scan in order to clean any files infected by the virus.
Please install attached file to start the scan. The process takes under a minute and will prevent your files from being compromised. We appreciate your prompt cooperation.
Regards,
Microsoft Windows Agent #2 (Hollis)
Microsoft Windows Computer Safety Division
16 years, 2 months
Hibernate SVN: r18820 - validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validator.
by hibernate-commits@lists.jboss.org
Author: hardy.ferentschik
Date: 2010-02-17 10:21:28 -0500 (Wed, 17 Feb 2010)
New Revision: 18820
Modified:
validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validator/ValidationMessages_fr.properties
Log:
HV-287
Modified: validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validator/ValidationMessages_fr.properties
===================================================================
--- validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validator/ValidationMessages_fr.properties 2010-02-17 12:51:06 UTC (rev 18819)
+++ validator/trunk/hibernate-validator/src/main/resources/org/hibernate/validator/ValidationMessages_fr.properties 2010-02-17 15:21:28 UTC (rev 18820)
@@ -1,7 +1,7 @@
# $Id$
javax.validation.constraints.NotNull.message=ne peut pas \u00EAtre nul
javax.validation.constraints.Size.message=la taille doit \u00EAtre entre {min} et {max}
-org.hibernate.validator.constraints.Length.message=length must be between {min} and {max}
+org.hibernate.validator.constraints.Length.message=la taille doit \u00EAtre entre {min} et {max}
org.hibernate.validator.constraints.NotEmpty.message=ne peut pas \u00EAtre vide
javax.validation.constraints.Pattern.message=doit suivre "{regexp}"
javax.validation.constraints.Min.message=doit \u00EAtre plus grand que {value}
16 years, 2 months
Hibernate SVN: r18819 - core/trunk/cache-infinispan.
by hibernate-commits@lists.jboss.org
Author: galder.zamarreno(a)jboss.com
Date: 2010-02-17 07:51:06 -0500 (Wed, 17 Feb 2010)
New Revision: 18819
Modified:
core/trunk/cache-infinispan/pom.xml
Log:
Update to Infinispan 4.0.0.CR4
Modified: core/trunk/cache-infinispan/pom.xml
===================================================================
--- core/trunk/cache-infinispan/pom.xml 2010-02-17 12:07:29 UTC (rev 18818)
+++ core/trunk/cache-infinispan/pom.xml 2010-02-17 12:51:06 UTC (rev 18819)
@@ -18,7 +18,7 @@
<description>Integration of Hibernate with Infinispan</description>
<properties>
- <version.infinispan>4.0.0.CR3</version.infinispan>
+ <version.infinispan>4.0.0.CR4</version.infinispan>
<version.hsqldb>1.8.0.2</version.hsqldb>
<version.cglib>2.2</version.cglib>
<version.javassist>3.4.GA</version.javassist>
16 years, 2 months