Hibernate SVN: r10581 - in trunk/HibernateExt: ejb ejb/doc/reference/en ejb/doc/reference/en/modules ejb/lib ejb/src/java/org/hibernate/ejb ejb-api ejb-api/etc metadata metadata/doc/reference/en metadata/doc/reference/en/modules metadata/src/java/org/hibernate/cfg/annotations
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2006-10-16 00:07:21 -0400 (Mon, 16 Oct 2006)
New Revision: 10581
Added:
trunk/HibernateExt/ejb-api/etc/jdstyle.css
Modified:
trunk/HibernateExt/ejb-api/build.xml
trunk/HibernateExt/ejb/build.xml
trunk/HibernateExt/ejb/changelog.txt
trunk/HibernateExt/ejb/doc/reference/en/master.xml
trunk/HibernateExt/ejb/doc/reference/en/modules/configuration.xml
trunk/HibernateExt/ejb/lib/hibernate-annotations.jar
trunk/HibernateExt/ejb/readme.txt
trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Version.java
trunk/HibernateExt/metadata/build.xml
trunk/HibernateExt/metadata/changelog.txt
trunk/HibernateExt/metadata/doc/reference/en/master.xml
trunk/HibernateExt/metadata/doc/reference/en/modules/entity.xml
trunk/HibernateExt/metadata/doc/reference/en/modules/setup.xml
trunk/HibernateExt/metadata/readme.txt
trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/Version.java
Log:
GA release
ANN-459 and EJB-239 add EJB 3.0 javadoc to the distribution
Modified: trunk/HibernateExt/ejb/build.xml
===================================================================
--- trunk/HibernateExt/ejb/build.xml 2006-10-16 02:48:43 UTC (rev 10580)
+++ trunk/HibernateExt/ejb/build.xml 2006-10-16 04:07:21 UTC (rev 10581)
@@ -16,13 +16,15 @@
<!-- Name of project and version, used to create filenames -->
<property name="Name" value="Hibernate EntityManager"/>
<property name="name" value="hibernate-entitymanager"/>
- <property name="version" value="3.2.0.CR3"/>
+ <property name="version" value="3.2.0.GA"/>
<property name="javadoc.packagenames" value="org.hibernate.ejb.*"/>
<property name="jdbc.dir" value="jdbc"/>
<property name="copy.test" value="true"/>
<property name="common.dir" value="../common"/>
+ <available property="jpa-present" file="${basedir}/../ejb-api" type="dir"/>
<import file="${common.dir}/common-build.xml"/>
+ <property name="jpa-javadoc.dir" value="${dist.doc.dir}/ejb-api"/>
<property name="resources.dir" value="src/resources"/>
@@ -212,9 +214,19 @@
<!-- target name="javadoc" description="Compile the Javadoc API documentation to dist dir">
<echo>Skipping java doc since ant's javadoc task cannot handle an alternative javadoc</echo>
</target -->
+
+ <target name="jpa-javadoc" if="jpa-present">
+ <mkdir dir="${jpa-javadoc.dir}"/>
+ <ant dir="../ejb-api" target="javadoc" inheritAll="false"/>
+ <copy todir="${jpa-javadoc.dir}">
+ <fileset dir="${basedir}/../ejb-api/build/api">
+ <include name="**/*.*"/>
+ </fileset>
+ </copy>
+ </target>
<!-- Some of this can probably be moved to common-build... -->
- <target name="dist" depends="jar,javadoc,copysource,copytest,copylib,extras" description="Build everything">
+ <target name="dist" depends="jar,javadoc,jpa-javadoc,copysource,copytest,copylib,extras" description="Build everything">
<ant inheritall="false" dir="${basedir}/doc/reference"/>
<copy todir="${dist.dir}/doc/reference" failonerror="false">
Modified: trunk/HibernateExt/ejb/changelog.txt
===================================================================
--- trunk/HibernateExt/ejb/changelog.txt 2006-10-16 02:48:43 UTC (rev 10580)
+++ trunk/HibernateExt/ejb/changelog.txt 2006-10-16 04:07:21 UTC (rev 10581)
@@ -1,7 +1,15 @@
Hibernate EntityManager Changelog
==================================
-3.2.0.CR3 (4-10-2006)
+3.2.0.GA (16-10-2006)
+---------------------
+Same code base as 3.2.0.CR3
+
+** Task
+ * [EJB-239] - Add EJB 3.0 JavaDoc to the distribution
+
+
+3.2.0.CR3 (04-10-2006)
----------------------
** Bug
* [EJB-150] - JarVisitor.addElement does not close passed input streams
Modified: trunk/HibernateExt/ejb/doc/reference/en/master.xml
===================================================================
--- trunk/HibernateExt/ejb/doc/reference/en/master.xml 2006-10-16 02:48:43 UTC (rev 10580)
+++ trunk/HibernateExt/ejb/doc/reference/en/master.xml 2006-10-16 04:07:21 UTC (rev 10581)
@@ -16,7 +16,7 @@
<subtitle>User guide</subtitle>
- <releaseinfo>3.2.0 CR3</releaseinfo>
+ <releaseinfo>3.2.0.GA</releaseinfo>
<mediaobject>
<imageobject>
Modified: trunk/HibernateExt/ejb/doc/reference/en/modules/configuration.xml
===================================================================
--- trunk/HibernateExt/ejb/doc/reference/en/modules/configuration.xml 2006-10-16 02:48:43 UTC (rev 10580)
+++ trunk/HibernateExt/ejb/doc/reference/en/modules/configuration.xml 2006-10-16 04:07:21 UTC (rev 10581)
@@ -8,8 +8,8 @@
<para>The EJB 3.0 / JPA compatible Hibernate EntityManager is built on top
of Hibernate core and Hibernate Annotations. You have to use compatible
versions of each module. This version is known to work on Hibernate Core
- 3.2.0.CR5 (and 3.2.0.GA at the time of writing) and Hibernate Annotations
- 3.2.0.CR3. The following libraries have to be in your classpath:
+ 3.2.0.CR5 and 3.2.0.GA and Hibernate Annotations
+ 3.2.0.CR3 and 3.2.0.GA. The following libraries have to be in your classpath:
hibernate3.jar, hibernate-annotations.jar, hibernate-entitymanager.jar and
all needed third party libraries for each package.(incl.
ejb-persistence.jar).</para>
Modified: trunk/HibernateExt/ejb/lib/hibernate-annotations.jar
===================================================================
(Binary files differ)
Modified: trunk/HibernateExt/ejb/readme.txt
===================================================================
--- trunk/HibernateExt/ejb/readme.txt 2006-10-16 02:48:43 UTC (rev 10580)
+++ trunk/HibernateExt/ejb/readme.txt 2006-10-16 04:07:21 UTC (rev 10581)
@@ -1,8 +1,8 @@
Hibernate EntityManager
==================================================
-Version: 3.2.0.CR3, 4.10.2006
+Version: 3.2.0.GA, 16.10.2006
-THIS RELEASE OF HIBERNATE ENTITYMANAGER REQUIRES HIBERNATE CORE 3.2.0.CR5 AND
+THIS RELEASE OF HIBERNATE ENTITYMANAGER REQUIRES HIBERNATE CORE 3.2.0.GA (or CR5) AND
DOES NOT WORK WITH HIBERNATE 3.1.x OR ANY OLDER VERSION OF HIBERNATE.
Modified: trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Version.java
===================================================================
--- trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Version.java 2006-10-16 02:48:43 UTC (rev 10580)
+++ trunk/HibernateExt/ejb/src/java/org/hibernate/ejb/Version.java 2006-10-16 04:07:21 UTC (rev 10581)
@@ -8,7 +8,7 @@
* @author Emmanuel Bernard
*/
public class Version {
- public static final String VERSION = "3.2.0.CR3";
+ public static final String VERSION = "3.2.0.GA";
private static Log log = LogFactory.getLog( Version.class );
static {
Modified: trunk/HibernateExt/ejb-api/build.xml
===================================================================
--- trunk/HibernateExt/ejb-api/build.xml 2006-10-16 02:48:43 UTC (rev 10580)
+++ trunk/HibernateExt/ejb-api/build.xml 2006-10-16 04:07:21 UTC (rev 10581)
@@ -95,11 +95,13 @@
version="true"
windowtitle="EJB 3.0 Persistence API Documentation"
doctitle="EJB 3.0 Persistence API Documentation"
+ stylesheetfile="./etc/jdstyle.css"
link="http://java.sun.com/j2se/1.5/docs/api">
<packageset dir="${src.dir}" defaultexcludes="yes" >
<include name="**/*" />
</packageset>
</javadoc>
+
</target>
Added: trunk/HibernateExt/ejb-api/etc/jdstyle.css
===================================================================
--- trunk/HibernateExt/ejb-api/etc/jdstyle.css 2006-10-16 02:48:43 UTC (rev 10580)
+++ trunk/HibernateExt/ejb-api/etc/jdstyle.css 2006-10-16 04:07:21 UTC (rev 10581)
@@ -0,0 +1,117 @@
+/* Javadoc style sheet */
+
+/* Define colors, fonts and other style attributes here to override the defaults */
+
+/* Page background color */
+body { font-family: Arial;
+ background-color: white;
+ font-size: 10pt;
+ }
+td { font-family: Arial;
+ font-size: 10pt;
+ }
+/* Table colors */
+.TableHeadingColor { background: #F4F4F4 }
+.TableSubHeadingColor { background: #F4F4F4 }
+.TableRowColor { background: #FFFFFF }
+
+/* Font used in left-hand frame lists */
+.FrameTitleFont { font-size: normal; font-family: Arial }
+.FrameHeadingFont { font-size: normal; font-family: Arial }
+.FrameItemFont { font-size: normal; font-family: Arial }
+
+/* Example of smaller, sans-serif font in frames */
+/* .FrameItemFont { font-size: 10pt; font-family: Helvetica, Arial, sans-serif } */
+
+/* Navigation bar fonts and colors */
+.NavBarCell1 { background-color:#F4F4F4;}
+.NavBarCell1Rev { background-color:silver;}
+
+.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;}
+.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;}
+
+.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}
+.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}
+
+A {
+ color: #003399;
+}
+
+A:active {
+ color: #003399;
+}
+
+A:visited {
+ color: #888888;
+}
+
+P, OL, UL, LI, DL, DT, DD, BLOCKQUOTE {
+ color: #000000;
+}
+
+TD, TH, SPAN {
+ color: #000000;
+}
+
+BLOCKQUOTE {
+ margin-right: 0px;
+}
+
+
+/*H1, H2, H3, H4, H5, H6 {
+ color: #000000;
+ font-weight:500;
+ margin-top:10px;
+ padding-top:15px;
+}
+
+H1 { font-size: 150%; }
+H2 { font-size: 140%; }
+H3 { font-size: 110%; font-weight: bold; }
+H4 { font-size: 110%; font-weight: bold;}
+H5 { font-size: 100%; font-style: italic; }
+H6 { font-size: 100%; font-style: italic; }*/
+
+TT {
+font-size: 90%;
+ font-family: "Courier New", Courier, monospace;
+ color: #000000;
+}
+
+PRE {
+font-size: 90%;
+ padding: 5px;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #CCCCCC;
+ background-color: #F4F4F4;
+}
+
+UL, OL, LI {
+ list-style: disc;
+}
+
+HR {
+ width: 100%;
+ height: 1px;
+ background-color: #CCCCCC;
+ border-width: 0px;
+ padding: 0px;
+ color: #CCCCCC;
+}
+
+.variablelist {
+ padding-top: 10;
+ padding-bottom:10;
+ margin:0;
+}
+
+.itemizedlist, UL {
+ padding-top: 0;
+ padding-bottom:0;
+ margin:0;
+}
+
+.term {
+ font-weight:bold;
+}
Modified: trunk/HibernateExt/metadata/build.xml
===================================================================
--- trunk/HibernateExt/metadata/build.xml 2006-10-16 02:48:43 UTC (rev 10580)
+++ trunk/HibernateExt/metadata/build.xml 2006-10-16 04:07:21 UTC (rev 10581)
@@ -12,17 +12,19 @@
(and without typing -D each time it compiles it) -->
<property file="build.properties"/>
<property file="${user.home}/.ant.properties"/>
-
+
<!-- Name of project and version, used to create filenames -->
<property name="Name" value="Hibernate Annotations"/>
<property name="name" value="hibernate-annotations"/>
- <property name="version" value="3.2.0.CR3"/>
+ <property name="version" value="3.2.0.GA"/>
<property name="javadoc.packagenames" value="org.hibernate.*"/>
<property name="jdbc.dir" value="jdbc"/>
<property name="copy.test" value="true"/>
<property name="common.dir" value="../common"/>
-
+
+ <available property="jpa-present" file="${basedir}/../ejb-api" type="dir"/>
<import file="${common.dir}/common-build.xml"/>
+ <property name="jpa-javadoc.dir" value="${dist.doc.dir}/ejb-api"/>
<target name="compile" depends="init" description="Compile the Java source code">
<available
@@ -142,9 +144,19 @@
<!-- target name="javadoc" description="Compile the Javadoc API documentation to dist dir">
<echo>Skipping java doc since ant's javadoc task cannot handle an alternative javadoc</echo>
</target -->
+
+ <target name="jpa-javadoc" if="jpa-present">
+ <mkdir dir="${jpa-javadoc.dir}"/>
+ <ant dir="../ejb-api" target="javadoc" inheritAll="false"/>
+ <copy todir="${jpa-javadoc.dir}">
+ <fileset dir="${basedir}/../ejb-api/build/api">
+ <include name="**/*.*"/>
+ </fileset>
+ </copy>
+ </target>
<!-- Some of this can probably be moved to common-build... -->
- <target name="dist" depends="jar,javadoc,copysource,copytest,copylib,extras" description="Build everything">
+ <target name="dist" depends="jar,javadoc,jpa-javadoc,copysource,copytest,copylib,extras" description="Build everything">
<ant inheritall="false" dir="${basedir}/doc/reference"/>
<copy todir="${dist.dir}/doc/reference" failonerror="false">
Modified: trunk/HibernateExt/metadata/changelog.txt
===================================================================
--- trunk/HibernateExt/metadata/changelog.txt 2006-10-16 02:48:43 UTC (rev 10580)
+++ trunk/HibernateExt/metadata/changelog.txt 2006-10-16 04:07:21 UTC (rev 10581)
@@ -1,6 +1,14 @@
Hibernate Annotations Changelog
===============================
+3.2.0.GA (16-10-2006)
+---------------------
+Same code base as 3.2.0.CR3
+
+** Task
+ * [ANN-459] - Add EJB 3.0 JavaDoc to the distribution
+
+
3.2.0.CR3 (04-10-2006)
----------------------
** Bug
Modified: trunk/HibernateExt/metadata/doc/reference/en/master.xml
===================================================================
--- trunk/HibernateExt/metadata/doc/reference/en/master.xml 2006-10-16 02:48:43 UTC (rev 10580)
+++ trunk/HibernateExt/metadata/doc/reference/en/master.xml 2006-10-16 04:07:21 UTC (rev 10581)
@@ -13,7 +13,7 @@
<subtitle>Reference Guide</subtitle>
- <releaseinfo>3.2.0 CR3</releaseinfo>
+ <releaseinfo>3.2.0.GA</releaseinfo>
<mediaobject>
<imageobject>
Modified: trunk/HibernateExt/metadata/doc/reference/en/modules/entity.xml
===================================================================
--- trunk/HibernateExt/metadata/doc/reference/en/modules/entity.xml 2006-10-16 02:48:43 UTC (rev 10580)
+++ trunk/HibernateExt/metadata/doc/reference/en/modules/entity.xml 2006-10-16 04:07:21 UTC (rev 10581)
@@ -5,14 +5,14 @@
<sect1 id="entity-overview" revision="1">
<title>Intro</title>
- <para>This section covers EJB 3.0 entity bean annotations and
+ <para>This section covers EJB 3.0 (aka JPA) entity annotations and
Hibernate-specific extensions.</para>
</sect1>
<sect1 id="entity-mapping" revision="2">
- <title>Mapping with EJB3 Annotations</title>
+ <title>Mapping with EJB3/JPA Annotations</title>
- <para>EJB3 entity beans are plain POJOs. Actually they represent the exact
+ <para>EJB3 entities are plain POJOs. Actually they represent the exact
same concept as the Hibernate persistent entities. Their mappings are
defined through JDK 5.0 annotations (an XML descriptor syntax for
overriding is defined in the EJB3 specification). Annotations can be split
Modified: trunk/HibernateExt/metadata/doc/reference/en/modules/setup.xml
===================================================================
--- trunk/HibernateExt/metadata/doc/reference/en/modules/setup.xml 2006-10-16 02:48:43 UTC (rev 10580)
+++ trunk/HibernateExt/metadata/doc/reference/en/modules/setup.xml 2006-10-16 04:07:21 UTC (rev 10581)
@@ -12,15 +12,14 @@
</listitem>
<listitem>
- <para><emphasis>This release requires Hibernate 3.2.0.CR5 and above.
+ <para><emphasis>This release requires Hibernate 3.2.0.GA and above.
Do not use this release of Hibernate Annotations with an older version
of Hibernate 3.x!</emphasis></para>
</listitem>
<listitem>
- <para>This release is known to work on Hibernate core 3.2.0.CR5 and is
- expected (at the time of writing) to work on Hibernate Core
- 3.2.0.GA</para>
+ <para>This release is known to work on Hibernate core 3.2.0.CR5
+ and 3.2.0.GA</para>
</listitem>
<listitem>
Modified: trunk/HibernateExt/metadata/readme.txt
===================================================================
--- trunk/HibernateExt/metadata/readme.txt 2006-10-16 02:48:43 UTC (rev 10580)
+++ trunk/HibernateExt/metadata/readme.txt 2006-10-16 04:07:21 UTC (rev 10581)
@@ -1,8 +1,8 @@
Hibernate Annotations
==================================================
-Version: 3.2.0 CR3, 4.10.2006
+Version: 3.2.0.GA, 16.10.2006
-THIS RELEASE OF HIBERNATE ANNOTATIONS REQUIRES HIBERNATE CORE 3.2.0.CR5 AND DOES NOT
+THIS RELEASE OF HIBERNATE ANNOTATIONS REQUIRES HIBERNATE CORE 3.2.0.GA (or CR5) AND DOES NOT
WORK WITH HIBERNATE 3.1.x OR ANY OLDER VERSION OF HIBERNATE.
Modified: trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/Version.java
===================================================================
--- trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/Version.java 2006-10-16 02:48:43 UTC (rev 10580)
+++ trunk/HibernateExt/metadata/src/java/org/hibernate/cfg/annotations/Version.java 2006-10-16 04:07:21 UTC (rev 10581)
@@ -8,7 +8,7 @@
* @author Emmanuel Bernard
*/
public class Version {
- public static final String VERSION = "3.2.0.CR3";
+ public static final String VERSION = "3.2.0.GA";
private static Log log = LogFactory.getLog( Version.class );
static {
17 years, 6 months
Hibernate SVN: r10580 - in tags/v32final/Hibernate3: . doc/reference/en src/org/hibernate/cfg
by hibernate-commits@lists.jboss.org
Author: steve.ebersole(a)jboss.com
Date: 2006-10-15 22:48:43 -0400 (Sun, 15 Oct 2006)
New Revision: 10580
Modified:
tags/v32final/Hibernate3/build.xml
tags/v32final/Hibernate3/changelog.txt
tags/v32final/Hibernate3/doc/reference/en/master.xml
tags/v32final/Hibernate3/readme.txt
tags/v32final/Hibernate3/src/org/hibernate/cfg/Environment.java
Log:
update release version/date
Modified: tags/v32final/Hibernate3/build.xml
===================================================================
--- tags/v32final/Hibernate3/build.xml 2006-10-16 02:12:03 UTC (rev 10579)
+++ tags/v32final/Hibernate3/build.xml 2006-10-16 02:48:43 UTC (rev 10580)
@@ -23,7 +23,7 @@
<property name="version.major" value="3"/>
<property name="version.minor" value="2"/>
<property name="version.micro" value="0"/>
- <property name="version.qualifier" value="cr5"/>
+ <property name="version.qualifier" value="ga"/>
<property name="version.full" value="${version.major}.${version.minor}.${version.micro}.${version.qualifier}"/>
<property name="version.major_minor" value="${version.major}.${version.minor}"/>
<property name="fullname" value="${name}-${version.full}"/>
Modified: tags/v32final/Hibernate3/changelog.txt
===================================================================
--- tags/v32final/Hibernate3/changelog.txt 2006-10-16 02:12:03 UTC (rev 10579)
+++ tags/v32final/Hibernate3/changelog.txt 2006-10-16 02:48:43 UTC (rev 10580)
@@ -6,6 +6,10 @@
more about each case.
+Chages in version 3.2.0.ga (2006.10.16)
+-------------------------------------------
+
+
Chages in version 3.2.0.cr5 (2006.10.04)
-------------------------------------------
Modified: tags/v32final/Hibernate3/doc/reference/en/master.xml
===================================================================
--- tags/v32final/Hibernate3/doc/reference/en/master.xml 2006-10-16 02:12:03 UTC (rev 10579)
+++ tags/v32final/Hibernate3/doc/reference/en/master.xml 2006-10-16 02:48:43 UTC (rev 10580)
@@ -33,7 +33,7 @@
<bookinfo>
<title>HIBERNATE - Relational Persistence for Idiomatic Java</title>
<subtitle>Hibernate Reference Documentation</subtitle>
- <releaseinfo>3.2 cr5</releaseinfo>
+ <releaseinfo>3.2.0.ga</releaseinfo>
</bookinfo>
<toc/>
Modified: tags/v32final/Hibernate3/readme.txt
===================================================================
--- tags/v32final/Hibernate3/readme.txt 2006-10-16 02:12:03 UTC (rev 10579)
+++ tags/v32final/Hibernate3/readme.txt 2006-10-16 02:48:43 UTC (rev 10580)
@@ -1,6 +1,6 @@
Hibernate - Relational Persistence for Idiomatic Java
=====================================================
-version 3.2 cr5, October 4, 2006
+version 3.2.0, October 16, 2006
Instructions
------------
Modified: tags/v32final/Hibernate3/src/org/hibernate/cfg/Environment.java
===================================================================
--- tags/v32final/Hibernate3/src/org/hibernate/cfg/Environment.java 2006-10-16 02:12:03 UTC (rev 10579)
+++ tags/v32final/Hibernate3/src/org/hibernate/cfg/Environment.java 2006-10-16 02:48:43 UTC (rev 10580)
@@ -153,7 +153,7 @@
*/
public final class Environment {
- public static final String VERSION = "3.2.0.cr5";
+ public static final String VERSION = "3.2.0";
/**
* <tt>ConnectionProvider</tt> implementor to use when obtaining connections
17 years, 6 months
Hibernate SVN: r10579 - tags/v32final
by hibernate-commits@lists.jboss.org
Author: steve.ebersole(a)jboss.com
Date: 2006-10-15 22:12:03 -0400 (Sun, 15 Oct 2006)
New Revision: 10579
Added:
tags/v32final/Hibernate3/
Log:
copying 3.2.0.cr5 to make 3.2.0.ga
Copied: tags/v32final/Hibernate3 (from rev 10578, tags/v32cr5/Hibernate3)
17 years, 6 months
Hibernate SVN: r10578 - tags
by hibernate-commits@lists.jboss.org
Author: steve.ebersole(a)jboss.com
Date: 2006-10-15 22:10:49 -0400 (Sun, 15 Oct 2006)
New Revision: 10578
Added:
tags/v32final/
Log:
created 3.2.0.ga tag folder
17 years, 6 months
Hibernate SVN: r10577 - in branches/Lucene_Integration/HibernateExt/metadata/src: java/org/hibernate/lucene java/org/hibernate/lucene/bridge java/org/hibernate/lucene/event java/org/hibernate/lucene/store java/org/hibernate/lucene/util test/org/hibernate/lucene/test test/org/hibernate/lucene/test/fieldAccess
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2006-10-13 18:27:43 -0400 (Fri, 13 Oct 2006)
New Revision: 10577
Added:
branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/
branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/Document.java
branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/FieldAccessTest.java
Modified:
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Boost.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/DocumentBuilder.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Keyword.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Text.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Unstored.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/BridgeFactory.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/event/LuceneEventListener.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/store/DirectoryProviderFactory.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/util/BinderHelper.java
Log:
ANN-457 Support for field annotations (Richard Hallier)
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Boost.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Boost.java 2006-10-13 20:26:32 UTC (rev 10576)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Boost.java 2006-10-13 22:27:43 UTC (rev 10577)
@@ -13,7 +13,7 @@
* @author Emmanuel Bernard
*/
@Retention(RetentionPolicy.RUNTIME)
-(a)Target({ElementType.TYPE, ElementType.METHOD})
+(a)Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Documented
public @interface Boost {
float value();
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/DocumentBuilder.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/DocumentBuilder.java 2006-10-13 20:26:32 UTC (rev 10576)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/DocumentBuilder.java 2006-10-13 22:27:43 UTC (rev 10577)
@@ -2,10 +2,6 @@
package org.hibernate.lucene;
import java.io.Serializable;
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Member;
-import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collections;
@@ -25,26 +21,38 @@
import org.hibernate.lucene.event.LuceneEventListener;
import org.hibernate.lucene.store.DirectoryProvider;
import org.hibernate.lucene.util.BinderHelper;
+import org.hibernate.reflection.ReflectionManager;
+import org.hibernate.reflection.XAnnotatedElement;
+import org.hibernate.reflection.XClass;
+import org.hibernate.reflection.XMember;
+import org.hibernate.reflection.XProperty;
import org.hibernate.util.ReflectHelper;
-//TODO handle attribute (only getters are handled currently)
+/**
+ * Set up and provide a manager for indexes classes
+ *
+ * @author Gavin King
+ * @author Emmanuel Bernard
+ * @author Sylvain Vieujot
+ * @author Richard Hallier
+ */
public class DocumentBuilder<T> {
static {
Version.touch(); //touch version
}
- private final List<Member> keywordGetters = new ArrayList<Member>();
+ private final List<XMember> keywordGetters = new ArrayList<XMember>();
private final List<String> keywordNames = new ArrayList<String>();
private final List<FieldBridge> keywordBridges = new ArrayList<FieldBridge>();
- private final List<Member> unstoredGetters = new ArrayList<Member>();
+ private final List<XMember> unstoredGetters = new ArrayList<XMember>();
private final List<String> unstoredNames = new ArrayList<String>();
private final List<FieldBridge> unstoredBridges = new ArrayList<FieldBridge>();
- private final List<Member> textGetters = new ArrayList<Member>();
+ private final List<XMember> textGetters = new ArrayList<XMember>();
private final List<String> textNames = new ArrayList<String>();
private final List<FieldBridge> textBridges = new ArrayList<FieldBridge>();
- private final Class<T> beanClass;
+ private final XClass beanClass;
private final DirectoryProvider directoryProvider;
private String idKeywordName;
private final Analyzer analyzer;
@@ -52,118 +60,131 @@
public static final String CLASS_FIELDNAME = "_hibernate_class";
private FieldBridge idBridge;
private Set<Class> mappedSubclasses = new HashSet<Class>();
+ private ReflectionManager reflectionManager;
- public DocumentBuilder(Class<T> clazz, Analyzer analyzer, DirectoryProvider directory) {
+ public DocumentBuilder(XClass clazz, Analyzer analyzer, DirectoryProvider directory, ReflectionManager reflectionManager) {
this.beanClass = clazz;
this.analyzer = analyzer;
this.directoryProvider = directory;
+ //FIXME get rid of it when boost is stored?
+ this.reflectionManager = reflectionManager;
- for (Class currClass = clazz; currClass != null; currClass = currClass.getSuperclass()) {
- Method[] methods = currClass.getDeclaredMethods();
- for (int i = 0; i < methods.length; i++) {
- Method method = methods[i];
- Keyword keywordAnn = method.getAnnotation(Keyword.class);
- if (keywordAnn != null) {
- String name = BinderHelper.getAttributeName( method, keywordAnn.name() );
- if ( keywordAnn.id() ) {
- idKeywordName = name;
- idBoost = getBoost(method);
- idBridge = BridgeFactory.guessType(method);
- } else {
- setAccessible(method);
- keywordGetters.add(method);
- keywordNames.add(name);
- keywordBridges.add( BridgeFactory.guessType(method) );
- }
- }
- Unstored unstoredAnn = method.getAnnotation(Unstored.class);
- if (unstoredAnn != null) {
- setAccessible(method);
- unstoredGetters.add(method);
- unstoredNames.add(BinderHelper.getAttributeName( method, unstoredAnn.name() ) );
- unstoredBridges.add( BridgeFactory.guessType(method) );
- }
- Text textAnn = method.getAnnotation(Text.class);
- if (textAnn != null) {
- textGetters.add(method);
- textNames.add( BinderHelper.getAttributeName( method, textAnn.name() ) );
- textBridges.add( BridgeFactory.guessType(method) );
- }
+ if (clazz == null) throw new AssertionFailure("Unable to build a DocumentBuilder with a null class");
+
+ for ( XClass currClass = beanClass; currClass != null; currClass = currClass.getSuperclass() ) {
+ //rejecting non properties because the object is loaded from Hibernate, so indexing a non property does not make sense
+ List<XProperty> methods = currClass.getDeclaredProperties( XClass.ACCESS_PROPERTY );
+ for ( XProperty method : methods ) {
+ initializeMember( method );
}
+
+ List<XProperty> fields = currClass.getDeclaredProperties( XClass.ACCESS_FIELD );
+ for ( XProperty field : fields ) {
+ initializeMember( field );
+ }
}
- if (idKeywordName == null) {
- throw new HibernateException("No id Keyword for: " + clazz.getName());
+ if ( idKeywordName == null ) {
+ throw new HibernateException( "No id Keyword for: " + clazz.getName() );
}
}
+ private void initializeMember(XMember member) {
+ Keyword keywordAnn = member.getAnnotation( Keyword.class );
+ if ( keywordAnn != null ) {
+ String name = BinderHelper.getAttributeName( member, keywordAnn.name() );
+ if ( keywordAnn.id() ) {
+ idKeywordName = name;
+ idBoost = getBoost( member );
+ idBridge = BridgeFactory.guessType( member );
+ }
+ else {
+ setAccessible( member );
+ keywordGetters.add( member );
+ keywordNames.add( name );
+ keywordBridges.add( BridgeFactory.guessType( member ) );
+ }
+ }
- private Float getBoost(AnnotatedElement element) {
- if (element == null) return null;
- Boost boost = element.getAnnotation(Boost.class);
- return boost != null ? Float.valueOf(boost.value()) : null;
- }
+ Unstored unstoredAnn = member.getAnnotation( Unstored.class );
+ if ( unstoredAnn != null ) {
+ setAccessible( member );
+ unstoredGetters.add( member );
+ unstoredNames.add( BinderHelper.getAttributeName( member, unstoredAnn.name() ) );
+ unstoredBridges.add( BridgeFactory.guessType( member ) );
+ }
- private Object getValue(Member member, T bean) {
- try {
- if (member instanceof java.lang.reflect.Field) {
- return ((java.lang.reflect.Field) member).get(bean);
- } else if (member instanceof Method) {
- return ((Method) member).invoke(bean);
- } else {
- throw new AssertionFailure("Unexpected member: " + member.getClass().getName());
- }
+ Text textAnn = member.getAnnotation( Text.class );
+ if ( textAnn != null ) {
+ setAccessible( member );
+ textGetters.add( member );
+ textNames.add( BinderHelper.getAttributeName( member, textAnn.name() ) );
+ textBridges.add( BridgeFactory.guessType( member ) );
}
- catch (Exception e) {
- throw new IllegalStateException("Could not get property value", e);
- }
}
+
+ private Float getBoost(XAnnotatedElement element) {
+ if ( element == null ) return null;
+ Boost boost = element.getAnnotation( Boost.class );
+ return boost != null ?
+ boost.value() :
+ null;
+ }
+
+ private Object getMemberValue(T bean, XMember getter) {
+ Object value;
+ try {
+ value = getter.invoke( bean );
+ }
+ catch (Exception e) {
+ throw new IllegalStateException( "Could not get property value", e );
+ }
+ return value;
+ }
+
public Document getDocument(T instance, Serializable id) {
Document doc = new Document();
- Float boost = getBoost(instance.getClass());
- if (boost != null) {
- doc.setBoost(boost.floatValue());
+ XClass instanceClass = reflectionManager.toXClass( instance.getClass() );
+ Float boost = getBoost( instanceClass );
+ if ( boost != null ) {
+ doc.setBoost( boost );
}
{
- Field classField = new Field(CLASS_FIELDNAME, instance.getClass().getName(), Field.Store.YES, Field.Index.NO);
- doc.add(classField);
- idBridge.set(idKeywordName, id, doc, Field.Store.YES, Field.Index.UN_TOKENIZED, idBoost);
+ Field classField =
+ new Field( CLASS_FIELDNAME, instanceClass.getName(), Field.Store.YES, Field.Index.NO );
+ doc.add( classField );
+ idBridge.set( idKeywordName, id, doc, Field.Store.YES, Field.Index.UN_TOKENIZED, idBoost );
}
- for (int i = 0; i < keywordNames.size(); i++) {
- Member member = keywordGetters.get(i);
- Object value = getValue(member, instance);
- keywordBridges.get(i).set(
- keywordNames.get(i), value, doc, Field.Store.YES,
- Field.Index.UN_TOKENIZED, getBoost( (AnnotatedElement) member )
+ for ( int i = 0; i < keywordNames.size(); i++ ) {
+ XMember member = keywordGetters.get( i );
+ Object value = getMemberValue( instance, member );
+ keywordBridges.get( i ).set(
+ keywordNames.get( i ), value, doc, Field.Store.YES,
+ Field.Index.UN_TOKENIZED, getBoost( member )
);
}
- for (int i = 0; i < textNames.size(); i++) {
- Member member = textGetters.get(i);
- Object value = getValue(member, instance);
- textBridges.get(i).set(
- textNames.get(i), value, doc, Field.Store.YES,
- Field.Index.TOKENIZED, getBoost( (AnnotatedElement) member )
+ for ( int i = 0; i < textNames.size(); i++ ) {
+ XMember member = textGetters.get( i );
+ Object value = getMemberValue( instance, member );
+ textBridges.get( i ).set(
+ textNames.get( i ), value, doc, Field.Store.YES,
+ Field.Index.TOKENIZED, getBoost( member )
);
}
- for (int i = 0; i < unstoredNames.size(); i++) {
- Member member = unstoredGetters.get(i);
- Object value = getValue(member, instance);
- unstoredBridges.get(i).set(
- unstoredNames.get(i), value, doc, Field.Store.NO,
- Field.Index.TOKENIZED, getBoost( (AnnotatedElement) member )
+ for ( int i = 0; i < unstoredNames.size(); i++ ) {
+ XMember member = unstoredGetters.get( i );
+ Object value = getMemberValue( instance, member );
+ unstoredBridges.get( i ).set(
+ unstoredNames.get( i ), value, doc, Field.Store.NO,
+ Field.Index.TOKENIZED, getBoost( member )
);
}
return doc;
}
- private void boostField(Field field, Member member) {
- Float boost = getBoost((AnnotatedElement) member);
- if (boost != null) field.setBoost(boost.floatValue());
- }
-
public Term getTerm(Serializable id) {
- return new Term(idKeywordName, id.toString());
+ return new Term( idKeywordName, id.toString() );
}
public DirectoryProvider getDirectoryProvider() {
@@ -174,9 +195,9 @@
return analyzer;
}
- private static void setAccessible(Member member) {
- if (!Modifier.isPublic(member.getModifiers())) {
- ((AccessibleObject) member).setAccessible(true);
+ private static void setAccessible(XMember member) {
+ if ( !Modifier.isPublic( member.getModifiers() ) ) {
+ member.setAccessible( true );
}
}
@@ -189,31 +210,30 @@
}
public static Class getDocumentClass(Document document) {
- String className = document.get(DocumentBuilder.CLASS_FIELDNAME);
+ String className = document.get( DocumentBuilder.CLASS_FIELDNAME );
try {
- return ReflectHelper.classForName(className);
+ return ReflectHelper.classForName( className );
}
catch (ClassNotFoundException e) {
- throw new HibernateException("Unable to load indexed class: " + className, e);
+ throw new HibernateException( "Unable to load indexed class: " + className, e );
}
}
public static Serializable getDocumentId(LuceneEventListener listener, Class clazz, Document document) {
- DocumentBuilder builder = listener.getDocumentBuilders().get(clazz);
- if (builder == null) throw new HibernateException("No Lucene configuration set up for: " + clazz.getName());
- Serializable id = (Serializable) builder.getIdBridge().get(builder.getIdKeywordName(), document);
- return id;
+ DocumentBuilder builder = listener.getDocumentBuilders().get( clazz );
+ if ( builder == null ) throw new HibernateException( "No Lucene configuration set up for: " + clazz.getName() );
+ return (Serializable) builder.getIdBridge().get( builder.getIdKeywordName(), document );
}
public void postInitialize(Set<Class> indexedClasses) {
//this method does not requires synchronization
-
+ Class plainClass = reflectionManager.toClass( beanClass );
Set<Class> tempMappedSubclasses = new HashSet<Class>();
//together with the caller this creates a o(2), but I think it's still faster than create the up hierarchy for each class
- for (Class currentClass : indexedClasses) {
- if (beanClass.isAssignableFrom(currentClass)) tempMappedSubclasses.add(currentClass);
+ for ( Class currentClass : indexedClasses ) {
+ if ( plainClass.isAssignableFrom( currentClass ) ) tempMappedSubclasses.add( currentClass );
}
- mappedSubclasses = Collections.unmodifiableSet(tempMappedSubclasses);
+ mappedSubclasses = Collections.unmodifiableSet( tempMappedSubclasses );
}
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Keyword.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Keyword.java 2006-10-13 20:26:32 UTC (rev 10576)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Keyword.java 2006-10-13 22:27:43 UTC (rev 10577)
@@ -8,7 +8,7 @@
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
-(a)Target(ElementType.METHOD)
+(a)Target({ElementType.METHOD, ElementType.FIELD})
@Documented
/**
* Specifies that a property of an entity is a Lucene
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Text.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Text.java 2006-10-13 20:26:32 UTC (rev 10576)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Text.java 2006-10-13 22:27:43 UTC (rev 10577)
@@ -8,7 +8,7 @@
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
-(a)Target(ElementType.METHOD)
+(a)Target({ElementType.METHOD, ElementType.FIELD})
@Documented
/**
* Specifies that a property of an entity is a Lucene
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Unstored.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Unstored.java 2006-10-13 20:26:32 UTC (rev 10576)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Unstored.java 2006-10-13 22:27:43 UTC (rev 10577)
@@ -8,7 +8,7 @@
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
-(a)Target(ElementType.METHOD)
+(a)Target({ElementType.METHOD, ElementType.FIELD})
@Documented
/**
* Specifies that a property of an entity is a Lucene
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/BridgeFactory.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/BridgeFactory.java 2006-10-13 20:26:32 UTC (rev 10576)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/BridgeFactory.java 2006-10-13 22:27:43 UTC (rev 10577)
@@ -8,6 +8,8 @@
import java.util.Map;
import org.hibernate.HibernateException;
+import org.hibernate.reflection.XMember;
+import org.hibernate.reflection.XClass;
import org.hibernate.annotations.Parameter;
import org.hibernate.lucene.util.BinderHelper;
@@ -66,9 +68,9 @@
return new String2FieldBridgeAdaptor( date );
}
- public static FieldBridge guessType(Member member) {
+ public static FieldBridge guessType(XMember member) {
FieldBridge bridge = null;
- org.hibernate.lucene.FieldBridge bridgeAnn = ( (AnnotatedElement) member ).getAnnotation( org.hibernate.lucene.FieldBridge.class );
+ org.hibernate.lucene.FieldBridge bridgeAnn = member.getAnnotation( org.hibernate.lucene.FieldBridge.class );
if (bridgeAnn != null) {
Class impl = bridgeAnn.impl();
try {
@@ -88,15 +90,17 @@
}
}
catch (Exception e) {
- throw new HibernateException("Unable to instanciate FieldBridge for " + BinderHelper.getAttributeName(member), e );
+ //TODO add classname
+ throw new HibernateException("Unable to instanciate FieldBridge for " + member.getName(), e );
}
}
else {
//find in built-ins
- Class<?> returnType = BinderHelper.getReturnType( member );
+ XClass returnType = member.getType();
bridge = builtInBridges.get( returnType.getName() );
}
- if (bridge == null) throw new HibernateException("Unable to guess FieldBridge for " + BinderHelper.getAttributeName(member) );
+ //TODO add classname
+ if (bridge == null) throw new HibernateException("Unable to guess FieldBridge for " + member.getName() );
return bridge;
}
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/event/LuceneEventListener.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/event/LuceneEventListener.java 2006-10-13 20:26:32 UTC (rev 10576)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/event/LuceneEventListener.java 2006-10-13 22:27:43 UTC (rev 10577)
@@ -19,7 +19,11 @@
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.hibernate.HibernateException;
+import org.hibernate.reflection.ReflectionManager;
+import org.hibernate.reflection.XClass;
+import org.hibernate.reflection.java.JavaXFactory;
import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.event.Initializable;
import org.hibernate.event.PostDeleteEvent;
import org.hibernate.event.PostDeleteEventListener;
@@ -46,6 +50,7 @@
//TODO work on sharing the same indexWriters and readers across a single post operation...
public class LuceneEventListener implements PostDeleteEventListener, PostInsertEventListener,
PostUpdateEventListener, Initializable {
+ ReflectionManager reflectionManager;
//FIXME keeping this here is a bad decision since you might want to search indexes wo maintain it
@Deprecated
@@ -63,6 +68,8 @@
public void initialize(Configuration cfg) {
if (initialized) return;
+ //yuk
+ reflectionManager = ( (AnnotationConfiguration) cfg ).createExtendedMappings().getReflectionManager();
Class analyzerClass;
String analyzerClassName = cfg.getProperty(Environment.ANALYZER_CLASS);
@@ -99,14 +106,16 @@
PersistentClass clazz = (PersistentClass) iter.next();
Class<?> mappedClass = clazz.getMappedClass();
if (mappedClass != null) {
- if (mappedClass.isAnnotationPresent(Indexed.class)) {
- DirectoryProvider provider = factory.createDirectoryProvider(mappedClass, cfg);
- final DocumentBuilder<Object> documentBuilder = new DocumentBuilder<Object>(
- (Class<Object>) mappedClass, analyzer, provider
- );
+ XClass mappedXClass = reflectionManager.toXClass( mappedClass );
+ if ( mappedXClass != null && mappedXClass.isAnnotationPresent(Indexed.class) ) {
+ DirectoryProvider provider = factory.createDirectoryProvider(mappedXClass, cfg);
if (!indexLock.containsKey(provider)) {
indexLock.put(provider, new ReentrantLock());
}
+ final DocumentBuilder<Object> documentBuilder = new DocumentBuilder<Object>(
+ mappedXClass, analyzer, provider, reflectionManager
+ );
+
documentBuilders.put(mappedClass, documentBuilder);
}
}
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/store/DirectoryProviderFactory.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/store/DirectoryProviderFactory.java 2006-10-13 20:26:32 UTC (rev 10576)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/store/DirectoryProviderFactory.java 2006-10-13 22:27:43 UTC (rev 10577)
@@ -7,8 +7,11 @@
import java.util.Properties;
import org.hibernate.HibernateException;
+import org.hibernate.reflection.XClass;
+import org.hibernate.reflection.ReflectionManager;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.lucene.Indexed;
import org.hibernate.util.ReflectHelper;
import org.hibernate.util.StringHelper;
@@ -36,12 +39,14 @@
private static String LUCENE_DEFAULT = LUCENE_PREFIX + "default.";
private static String DEFAULT_DIRECTORY_PROVIDER = FSDirectoryProvider.class.getName();
+ //TODO for the public?
+ //public DirectoryProvider<?> createDirectoryProvider(XClass entity, Configuration cfg) {
- public DirectoryProvider<?> createDirectoryProvider(Class<?> entity, Configuration cfg) {
+ public DirectoryProvider<?> createDirectoryProvider(XClass entity, Configuration cfg) {
//get properties
String directoryProviderName = getDirectoryProviderName( entity, cfg );
Properties indexProps = getDirectoryProperties( cfg, directoryProviderName );
-
+
//set up the directory
String className = indexProps.getProperty( "directory_provider" );
if ( StringHelper.isEmpty( className ) ) {
@@ -88,20 +93,17 @@
return indexProps;
}
- @Deprecated
- public static String getTypeNameOld(Class<?> clazz) {
- String name = clazz.getAnnotation(Indexed.class).index();
- return "".equals( name ) ? clazz.getName() : name;
- }
-
- public static String getDirectoryProviderName(Class<?> clazz, Configuration cfg) {
- //get the most specialized (ie subclass > superclass) non default index name
+ public static String getDirectoryProviderName(XClass clazz, Configuration cfg) {
+ //yuk
+ ReflectionManager reflectionManager =
+ ( (AnnotationConfiguration) cfg ).createExtendedMappings().getReflectionManager();
+ //get the most specialized (ie subclass > superclass) non default index name
//if none extract the name from the most generic (superclass > subclass) @Indexed class in the hierarchy
//FIXME I'm inclined to get rid of the default value
PersistentClass pc = cfg.getClassMapping( clazz.getName() );
- Class rootIndex = null;
+ XClass rootIndex = null;
do {
- Class<?> currentClazz = pc.getMappedClass();
+ XClass currentClazz = reflectionManager.toXClass( pc.getMappedClass() );
Indexed indexAnn = currentClazz.getAnnotation( Indexed.class );
if (indexAnn != null) {
if ( indexAnn.index().length() != 0 ) {
@@ -118,12 +120,7 @@
return rootIndex.getName();
}
else {
- if (clazz == null) {
- throw new HibernateException("Trying to extract the index name a null entity");
- }
- else {
- throw new HibernateException("Trying to extract the index name from a non @Indexed class: " + clazz.getName() );
- }
+ throw new HibernateException("Trying to extract the index name from a non @Indexed class: " + clazz.getName() );
}
}
}
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/util/BinderHelper.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/util/BinderHelper.java 2006-10-13 20:26:32 UTC (rev 10576)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/util/BinderHelper.java 2006-10-13 22:27:43 UTC (rev 10577)
@@ -7,6 +7,7 @@
import java.beans.Introspector;
import org.hibernate.util.StringHelper;
+import org.hibernate.reflection.XMember;
/**
* @author Emmanuel Bernard
@@ -15,37 +16,12 @@
private BinderHelper() {}
- public static String getAttributeName(Member member) {
- return getAttributeName( member, null );
- }
/**
* Get attribute name out of member unless overriden by <code>name</code>
*/
- //TODO move to reflection layer
- public static String getAttributeName(Member member, String name) {
- if( StringHelper.isNotEmpty( name ) ) return name; //explicit field name
- if (member instanceof Field ) {
- return ( (Field) member ).getName();
- }
- else {
- //decapitalize
- String methodName = ( (Method) member).getName();
- //FIXME we probably should exclude methods not starting with "get" nor "is"
- int startIndex = 3;
- if( methodName.startsWith("is") ) {
- startIndex = 2;
- }
- return Introspector.decapitalize( methodName.substring( startIndex ) );
- }
+ public static String getAttributeName(XMember member, String name) {
+ return StringHelper.isNotEmpty( name ) ?
+ name :
+ member.getName(); //explicit field name
}
-
- //TODO move to reflection layer
- public static Class<?> getReturnType(Member member) {
- if (member instanceof Field) {
- return ( (Field) member ).getType();
- }
- else {
- return ( (Method) member ).getReturnType();
- }
- }
}
Added: branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/Document.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/Document.java 2006-10-13 20:26:32 UTC (rev 10576)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/Document.java 2006-10-13 22:27:43 UTC (rev 10577)
@@ -0,0 +1,79 @@
+//$Id: $
+package org.hibernate.lucene.test.fieldAccess;
+
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Entity;
+import javax.persistence.Lob;
+
+import org.hibernate.lucene.Unstored;
+import org.hibernate.lucene.Text;
+import org.hibernate.lucene.Keyword;
+import org.hibernate.lucene.Boost;
+import org.hibernate.lucene.Indexed;
+
+/**
+ * @author Richard Hallier
+ */
+@Entity
+@Indexed(index = "DocumentField")
+public class Document {
+ @Id
+ @GeneratedValue
+ @Keyword(id = true)
+ private Long id;
+
+ @Text
+ @Boost(2)
+ private String title;
+
+ @Unstored(name = "Abstract")
+ private String summary;
+
+ @Lob
+ @Unstored
+ private String text;
+
+ Document() {
+ }
+
+ public Document(String title, String summary, String text) {
+ super();
+ this.summary = summary;
+ this.text = text;
+ this.title = title;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+}
+
Added: branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/FieldAccessTest.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/FieldAccessTest.java 2006-10-13 20:26:32 UTC (rev 10576)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/FieldAccessTest.java 2006-10-13 22:27:43 UTC (rev 10577)
@@ -0,0 +1,68 @@
+//$Id: $
+package org.hibernate.lucene.test.fieldAccess;
+
+import java.util.List;
+
+import org.hibernate.lucene.test.TestCase;
+import org.hibernate.lucene.LuceneSession;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FieldAccessTest extends TestCase {
+
+ public void testFields() throws Exception {
+ Document doc = new Document( "Hibernate in Action", "Object/relational mapping with Hibernate", "blah blah blah" );
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist( doc );
+ tx.commit();
+
+ s.clear();
+
+ LuceneSession session = new LuceneSession(s);
+ tx = session.beginTransaction();
+ QueryParser p = new QueryParser("id", new StandardAnalyzer( ) );
+ List result = session.createLuceneQuery( p.parse( "Abstract:Hibernate" ) ).list();
+ assertEquals( "Query by field", 1, result.size() );
+ s.delete( result.get( 0 ) );
+ tx.commit();
+ s.close();
+
+ }
+
+ public void testFieldBoost() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist(
+ new Document( "Hibernate in Action", "Object and Relational", "blah blah blah" )
+ );
+ s.persist(
+ new Document( "Object and Relational", "Hibernate in Action", "blah blah blah" )
+ );
+ tx.commit();
+
+ s.clear();
+
+ LuceneSession session = new LuceneSession(s);
+ tx = session.beginTransaction();
+ QueryParser p = new QueryParser("id", new StandardAnalyzer( ) );
+ List result = session.createLuceneQuery( p.parse( "title:Action OR Abstract:Action" ) ).list();
+ assertEquals( "Query by field", 2, result.size() );
+ assertEquals( "@Boost fails", "Hibernate in Action", ( (Document) result.get( 0 ) ).getTitle() );
+ s.delete( result.get( 0 ) );
+ tx.commit();
+ s.close();
+
+ }
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ Document.class
+ };
+ }
+}
17 years, 6 months
Hibernate SVN: r10576 - in branches/Lucene_Integration/HibernateExt/metadata/src: java/org/hibernate/lucene java/org/hibernate/lucene/bridge java/org/hibernate/reflection/java test/org/hibernate/lucene/test test/org/hibernate/lucene/test/bridge
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2006-10-13 16:26:32 -0400 (Fri, 13 Oct 2006)
New Revision: 10576
Added:
branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/bridge/
branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/bridge/BridgeTest.java
branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/bridge/Cloud.java
Modified:
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/DocumentBuilder.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/BridgeFactory.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/DateBridge.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/DoubleBridge.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/FloatBridge.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/IntegerBridge.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/LongBridge.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/NumberBridge.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/String2FieldBridgeAdaptor.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/StringBridge.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/StringImplBridge.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java
Log:
ANN-454 Support for Bridge
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/DocumentBuilder.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/DocumentBuilder.java 2006-10-13 16:39:45 UTC (rev 10575)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/DocumentBuilder.java 2006-10-13 20:26:32 UTC (rev 10576)
@@ -36,10 +36,13 @@
private final List<Member> keywordGetters = new ArrayList<Member>();
private final List<String> keywordNames = new ArrayList<String>();
+ private final List<FieldBridge> keywordBridges = new ArrayList<FieldBridge>();
private final List<Member> unstoredGetters = new ArrayList<Member>();
private final List<String> unstoredNames = new ArrayList<String>();
+ private final List<FieldBridge> unstoredBridges = new ArrayList<FieldBridge>();
private final List<Member> textGetters = new ArrayList<Member>();
private final List<String> textNames = new ArrayList<String>();
+ private final List<FieldBridge> textBridges = new ArrayList<FieldBridge>();
private final Class<T> beanClass;
private final DirectoryProvider directoryProvider;
@@ -61,8 +64,8 @@
Method method = methods[i];
Keyword keywordAnn = method.getAnnotation(Keyword.class);
if (keywordAnn != null) {
- String name = BinderHelper.getAttributeName(method, keywordAnn.name());
- if (keywordAnn.id()) {
+ String name = BinderHelper.getAttributeName( method, keywordAnn.name() );
+ if ( keywordAnn.id() ) {
idKeywordName = name;
idBoost = getBoost(method);
idBridge = BridgeFactory.guessType(method);
@@ -70,18 +73,21 @@
setAccessible(method);
keywordGetters.add(method);
keywordNames.add(name);
+ keywordBridges.add( BridgeFactory.guessType(method) );
}
}
Unstored unstoredAnn = method.getAnnotation(Unstored.class);
if (unstoredAnn != null) {
setAccessible(method);
unstoredGetters.add(method);
- unstoredNames.add(BinderHelper.getAttributeName(method, unstoredAnn.name()));
+ unstoredNames.add(BinderHelper.getAttributeName( method, unstoredAnn.name() ) );
+ unstoredBridges.add( BridgeFactory.guessType(method) );
}
Text textAnn = method.getAnnotation(Text.class);
if (textAnn != null) {
textGetters.add(method);
- textNames.add(BinderHelper.getAttributeName(method, textAnn.name()));
+ textNames.add( BinderHelper.getAttributeName( method, textAnn.name() ) );
+ textBridges.add( BridgeFactory.guessType(method) );
}
}
}
@@ -127,31 +133,27 @@
for (int i = 0; i < keywordNames.size(); i++) {
Member member = keywordGetters.get(i);
Object value = getValue(member, instance);
- if (value != null) {
- Field field = new Field(keywordNames.get(i), toString(value), Field.Store.YES, Field.Index.UN_TOKENIZED);
- boostField(field, member);
- doc.add(field);
- }
+ keywordBridges.get(i).set(
+ keywordNames.get(i), value, doc, Field.Store.YES,
+ Field.Index.UN_TOKENIZED, getBoost( (AnnotatedElement) member )
+ );
}
for (int i = 0; i < textNames.size(); i++) {
Member member = textGetters.get(i);
Object value = getValue(member, instance);
- if (value != null) {
- Field field = new Field(textNames.get(i), toString(value), Field.Store.YES, Field.Index.TOKENIZED);
- boostField(field, member);
- doc.add(field);
- }
+ textBridges.get(i).set(
+ textNames.get(i), value, doc, Field.Store.YES,
+ Field.Index.TOKENIZED, getBoost( (AnnotatedElement) member )
+ );
}
for (int i = 0; i < unstoredNames.size(); i++) {
Member member = unstoredGetters.get(i);
Object value = getValue(member, instance);
- if (value != null) {
- Field field = new Field(unstoredNames.get(i), toString(value), Field.Store.NO, Field.Index.TOKENIZED);
- boostField(field, member);
- doc.add(field);
- }
+ unstoredBridges.get(i).set(
+ unstoredNames.get(i), value, doc, Field.Store.NO,
+ Field.Index.TOKENIZED, getBoost( (AnnotatedElement) member )
+ );
}
-
return doc;
}
@@ -160,10 +162,6 @@
if (boost != null) field.setBoost(boost.floatValue());
}
- private static String toString(Object value) {
- return value.toString();
- }
-
public Term getTerm(Serializable id) {
return new Term(idKeywordName, id.toString());
}
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/BridgeFactory.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/BridgeFactory.java 2006-10-13 16:39:45 UTC (rev 10575)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/BridgeFactory.java 2006-10-13 20:26:32 UTC (rev 10576)
@@ -38,10 +38,14 @@
static {
builtInBridges.put( Double.class.getName(), DOUBLE );
- builtInBridges.put( Float.class.getName(), FLOAT );
- builtInBridges.put( Integer.class.getName(), INTEGER );
- builtInBridges.put( Long.class.getName(), LONG );
- builtInBridges.put( String.class.getName(), STRING );
+ builtInBridges.put( double.class.getName(), DOUBLE );
+ builtInBridges.put( Float.class.getName(), FLOAT );
+ builtInBridges.put( float.class.getName(), FLOAT );
+ builtInBridges.put( Integer.class.getName(), INTEGER );
+ builtInBridges.put( int.class.getName(), INTEGER );
+ builtInBridges.put( Long.class.getName(), LONG );
+ builtInBridges.put( long.class.getName(), LONG );
+ builtInBridges.put( String.class.getName(), STRING );
DATE_YEAR = createDateBridge( Resolution.YEAR );
DATE_MONTH = createDateBridge( Resolution.MONTH );
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/DateBridge.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/DateBridge.java 2006-10-13 16:39:45 UTC (rev 10575)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/DateBridge.java 2006-10-13 20:26:32 UTC (rev 10576)
@@ -8,6 +8,7 @@
import org.apache.lucene.document.DateTools;
import org.hibernate.AssertionFailure;
import org.hibernate.HibernateException;
+import org.hibernate.util.StringHelper;
/**
* @author Emmanuel Bernard
@@ -16,8 +17,8 @@
DateTools.Resolution resolution;
public Object stringToObject(String stringValue) {
- //usually does not make sense
- try {
+ if ( StringHelper.isEmpty(stringValue) ) return null;
+ try {
return DateTools.stringToDate( stringValue );
}
catch (ParseException e) {
@@ -26,7 +27,9 @@
}
public String objectToString(Object object) {
- return DateTools.dateToString( (Date) object, resolution );
+ return object != null ?
+ DateTools.dateToString( (Date) object, resolution ) :
+ null;
}
public void setParameterValues(Map parameters) {
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/DoubleBridge.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/DoubleBridge.java 2006-10-13 16:39:45 UTC (rev 10575)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/DoubleBridge.java 2006-10-13 20:26:32 UTC (rev 10576)
@@ -1,11 +1,14 @@
//$Id: $
package org.hibernate.lucene.bridge;
+import org.hibernate.util.StringHelper;
+
/**
* @author Emmanuel Bernard
*/
public class DoubleBridge extends NumberBridge {
public Object stringToObject(String stringValue) {
- return new Double(stringValue);
+ if ( StringHelper.isEmpty(stringValue) ) return null;
+ return new Double(stringValue);
}
}
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/FloatBridge.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/FloatBridge.java 2006-10-13 16:39:45 UTC (rev 10575)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/FloatBridge.java 2006-10-13 20:26:32 UTC (rev 10576)
@@ -1,11 +1,14 @@
//$Id: $
package org.hibernate.lucene.bridge;
+import org.hibernate.util.StringHelper;
+
/**
* @author Emmanuel Bernard
*/
public class FloatBridge extends NumberBridge {
public Object stringToObject(String stringValue) {
- return new Float(stringValue);
+ if ( StringHelper.isEmpty(stringValue) ) return null;
+ return new Float(stringValue);
}
}
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/IntegerBridge.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/IntegerBridge.java 2006-10-13 16:39:45 UTC (rev 10575)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/IntegerBridge.java 2006-10-13 20:26:32 UTC (rev 10576)
@@ -1,11 +1,14 @@
//$Id: $
package org.hibernate.lucene.bridge;
+import org.hibernate.util.StringHelper;
+
/**
* @author Emmanuel Bernard
*/
public class IntegerBridge extends NumberBridge {
public Object stringToObject(String stringValue) {
- return new Integer(stringValue);
+ if ( StringHelper.isEmpty(stringValue) ) return null;
+ return new Integer(stringValue);
}
}
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/LongBridge.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/LongBridge.java 2006-10-13 16:39:45 UTC (rev 10575)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/LongBridge.java 2006-10-13 20:26:32 UTC (rev 10576)
@@ -1,11 +1,14 @@
//$Id: $
package org.hibernate.lucene.bridge;
+import org.hibernate.util.StringHelper;
+
/**
* @author Emmanuel Bernard
*/
public class LongBridge extends NumberBridge {
public Object stringToObject(String stringValue) {
- return new Long(stringValue);
+ if ( StringHelper.isEmpty(stringValue) ) return null;
+ return new Long(stringValue);
}
}
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/NumberBridge.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/NumberBridge.java 2006-10-13 16:39:45 UTC (rev 10575)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/NumberBridge.java 2006-10-13 20:26:32 UTC (rev 10576)
@@ -1,11 +1,17 @@
//$Id: $
package org.hibernate.lucene.bridge;
+import java.util.Date;
+
+import org.apache.lucene.document.DateTools;
+
/**
* @author Emmanuel Bernard
*/
public abstract class NumberBridge implements StringBridge {
public String objectToString(Object object) {
- return object.toString();
+ return object != null ?
+ object.toString() :
+ null;
}
}
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/String2FieldBridgeAdaptor.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/String2FieldBridgeAdaptor.java 2006-10-13 16:39:45 UTC (rev 10575)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/String2FieldBridgeAdaptor.java 2006-10-13 20:26:32 UTC (rev 10576)
@@ -3,6 +3,7 @@
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
+import org.hibernate.util.StringHelper;
/**
* Bridge to use a Java2String as a Java2Field
@@ -22,10 +23,14 @@
}
public void set(String name, Object value, Document document, Field.Store store, Field.Index index, Float boost) {
- Field field = new Field(name, stringBridge.objectToString( value ), store, index);
- if (boost != null) field.setBoost( boost );
- document.add( field );
- }
+ String indexedString = stringBridge.objectToString(value);
+ //Do not add fields on empty strings, seems a sensible default in most situations
+ if ( StringHelper.isNotEmpty( indexedString ) ) {
+ Field field = new Field(name, indexedString, store, index);
+ if (boost != null) field.setBoost( boost );
+ document.add( field );
+ }
+ }
}
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/StringBridge.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/StringBridge.java 2006-10-13 16:39:45 UTC (rev 10575)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/StringBridge.java 2006-10-13 20:26:32 UTC (rev 10576)
@@ -15,6 +15,7 @@
/**
* convert the object representation to a String
+ * The return String must not be null, it can be empty though
*/
String objectToString(Object object);
}
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/StringImplBridge.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/StringImplBridge.java 2006-10-13 16:39:45 UTC (rev 10575)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/StringImplBridge.java 2006-10-13 20:26:32 UTC (rev 10576)
@@ -1,15 +1,17 @@
//$Id: $
package org.hibernate.lucene.bridge;
+import org.hibernate.util.StringHelper;
+
/**
* @author Emmanuel Bernard
*/
public class StringImplBridge implements StringBridge {
public Object stringToObject(String stringValue) {
- return stringValue;
+ return stringValue;
}
public String objectToString(Object object) {
- return (String) object;
+ return (String) object;
}
}
Modified: branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-10-13 16:39:45 UTC (rev 10575)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/reflection/java/EJB3OverridenAnnotationReader.java 2006-10-13 20:26:32 UTC (rev 10576)
@@ -364,7 +364,8 @@
else {
this.annotations = super.getAnnotations();
}
- }
+ xmlContext = null;
+ }
}
private void processEventAnnotations(List<Annotation> annotationList, XMLContext.Default defaults) {
Added: branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/bridge/BridgeTest.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/bridge/BridgeTest.java 2006-10-13 16:39:45 UTC (rev 10575)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/bridge/BridgeTest.java 2006-10-13 20:26:32 UTC (rev 10576)
@@ -0,0 +1,91 @@
+//$Id: $
+package org.hibernate.lucene.test.bridge;
+
+import java.util.Date;
+import java.util.List;
+import java.util.GregorianCalendar;
+import java.util.Calendar;
+
+import org.hibernate.Transaction;
+
+import org.hibernate.lucene.test.TestCase;
+import org.hibernate.lucene.LuceneSession;
+import org.hsqldb.Session;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class BridgeTest extends TestCase {
+ public void testDefaultAndNullBridges() throws Exception {
+ Cloud cloud = new Cloud();
+ cloud.setDate( null );
+ cloud.setDouble1( null );
+ cloud.setDouble2( 2.1d );
+ cloud.setInt1( null );
+ cloud.setInt2( 2 );
+ cloud.setFloat1( null );
+ cloud.setFloat2( 2.1f );
+ cloud.setLong1( null );
+ cloud.setLong2( 2l );
+ cloud.setString(null);
+ org.hibernate.Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist(cloud);
+ s.flush();
+ tx.commit();
+
+ tx = s.beginTransaction();
+ LuceneSession session = new LuceneSession(s);
+ QueryParser parser = new QueryParser("id", new StandardAnalyzer() );
+ Query query;
+ List result;
+
+ query = parser.parse("double2:[2.1 TO 2.1] AND float2:[2.1 TO 2.1] AND int2:[2 TO 2.1] AND long2:[2 TO 2.1]");
+ result = session.createLuceneQuery(query).list();
+ assertEquals( "find primitives and do not fail on null", 1, result.size() );
+
+ query = parser.parse("double1:[2.1 TO 2.1] OR float1:[2.1 TO 2.1] OR int1:[2 TO 2.1] OR long1:[2 TO 2.1]");
+ result = session.createLuceneQuery(query).list();
+ assertEquals( "null elements should not be stored", 0, result.size() ); //the query is dumb because restrictive
+
+ s.delete( s.get( Cloud.class, cloud.getId() ) );
+ tx.commit();
+ s.close();
+
+ }
+
+ public void testDateBridge() throws Exception {
+ Cloud cloud = new Cloud();
+ Calendar c = GregorianCalendar.getInstance();
+ c.set(2000, 11, 15);
+ cloud.setDate( c.getTime() );
+ org.hibernate.Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist(cloud);
+ s.flush();
+ tx.commit();
+
+ tx = s.beginTransaction();
+ LuceneSession session = new LuceneSession(s);
+ QueryParser parser = new QueryParser("id", new StandardAnalyzer() );
+ Query query;
+ List result;
+
+ query = parser.parse("date:[19900101 TO 20060101]");
+ result = session.createLuceneQuery(query).list();
+ assertEquals( "date found", 1, result.size() );
+
+ s.delete( s.get( Cloud.class, cloud.getId() ) );
+ tx.commit();
+ s.close();
+
+ }
+ protected Class[] getMappings() {
+ return new Class[] {
+ Cloud.class
+ };
+ }
+}
Added: branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/bridge/Cloud.java
===================================================================
--- branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/bridge/Cloud.java 2006-10-13 16:39:45 UTC (rev 10575)
+++ branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/bridge/Cloud.java 2006-10-13 20:26:32 UTC (rev 10576)
@@ -0,0 +1,186 @@
+//$Id: $
+package org.hibernate.lucene.test.bridge;
+
+import java.util.Date;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+import org.hibernate.lucene.Keyword;
+import org.hibernate.lucene.Indexed;
+import org.hibernate.lucene.FieldBridge;
+import org.hibernate.lucene.Text;
+import org.hibernate.lucene.bridge.DateBridge;
+import org.hibernate.annotations.Parameter;
+
+/**
+ * @author Emmanuel Bernard
+ */
+@Entity
+@Indexed
+public class Cloud {
+ private int id;
+ private Long long1;
+ private long long2;
+ private Integer int1;
+ private int int2;
+ private Double double1;
+ private double double2;
+ private Float float1;
+ private float float2;
+ private String string;
+ private Date date;
+ private Date dateYear;
+ private Date dateMonth;
+ private Date dateDay;
+ private Date dateHour;
+ private Date dateSecond;
+ private Date dateMillisecond;
+
+ @Id @GeneratedValue @Keyword(id=true)
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ @Keyword
+ public Long getLong1() {
+ return long1;
+ }
+
+ public void setLong1(Long long1) {
+ this.long1 = long1;
+ }
+
+ @Keyword
+ public long getLong2() {
+ return long2;
+ }
+
+ public void setLong2(long long2) {
+ this.long2 = long2;
+ }
+
+ @Keyword
+ public Integer getInt1() {
+ return int1;
+ }
+
+ public void setInt1(Integer int1) {
+ this.int1 = int1;
+ }
+
+ @Keyword
+ public int getInt2() {
+ return int2;
+ }
+
+ public void setInt2(int int2) {
+ this.int2 = int2;
+ }
+
+ @Keyword
+ public Double getDouble1() {
+ return double1;
+ }
+
+ public void setDouble1(Double double1) {
+ this.double1 = double1;
+ }
+
+ @Keyword
+ public double getDouble2() {
+ return double2;
+ }
+
+ public void setDouble2(double double2) {
+ this.double2 = double2;
+ }
+
+ @Keyword
+ public Float getFloat1() {
+ return float1;
+ }
+
+ public void setFloat1(Float float1) {
+ this.float1 = float1;
+ }
+
+ @Keyword
+ public float getFloat2() {
+ return float2;
+ }
+
+ public void setFloat2(float float2) {
+ this.float2 = float2;
+ }
+
+ @Text
+ public String getString() {
+ return string;
+ }
+
+ public void setString(String string) {
+ this.string = string;
+ }
+ //FIXME DATE and RESOLUTION
+ @Keyword
+ public Date getDate() {
+ return date;
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+ public Date getDateYear() {
+ return dateYear;
+ }
+
+ public void setDateYear(Date dateYear) {
+ this.dateYear = dateYear;
+ }
+
+ public Date getDateMonth() {
+ return dateMonth;
+ }
+
+ public void setDateMonth(Date dateMonth) {
+ this.dateMonth = dateMonth;
+ }
+
+ public Date getDateDay() {
+ return dateDay;
+ }
+
+ public void setDateDay(Date dateDay) {
+ this.dateDay = dateDay;
+ }
+
+ public Date getDateHour() {
+ return dateHour;
+ }
+
+ public void setDateHour(Date dateHour) {
+ this.dateHour = dateHour;
+ }
+
+ public Date getDateSecond() {
+ return dateSecond;
+ }
+
+ public void setDateSecond(Date dateSecond) {
+ this.dateSecond = dateSecond;
+ }
+
+ public Date getDateMillisecond() {
+ return dateMillisecond;
+ }
+
+ public void setDateMillisecond(Date dateMillisecond) {
+ this.dateMillisecond = dateMillisecond;
+ }
+}
17 years, 6 months
Hibernate SVN: r10574 - in trunk/HibernateExt/tools/src: java/org/hibernate/cfg test/org/hibernate/tool/hbm2x/query
by hibernate-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2006-10-12 15:45:37 -0400 (Thu, 12 Oct 2006)
New Revision: 10574
Modified:
trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java
trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCReaderFactory.java
trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/query/QueryExporterTest.java
Log:
HBX-95 create a hbmlint
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2006-10-12 17:23:59 UTC (rev 10573)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2006-10-12 19:45:37 UTC (rev 10574)
@@ -102,9 +102,10 @@
/**
* Read JDBC Metadata from the database. Does not create any classes or other ORM releated structures.
*
+ * @deprecated should use readDatabaseSchema(DatabaseCollector, catalog, schema)
* @param catalog
* @param schema
- * @return
+ * @return
* @throws SQLException
*/
public Map readDatabaseSchema(String catalog, String schema) throws SQLException {
@@ -114,7 +115,7 @@
JDBCReader reader = JDBCReaderFactory.newJDBCReader(cfg.getProperties(),settings,revengStrategy);
DatabaseCollector dbs = new MappingsDatabaseCollector(mappings);
- dbs = reader.readDatabaseSchema(dbs, catalog, schema);
+ reader.readDatabaseSchema(dbs, catalog, schema);
return dbs.getOneToManyCandidates();
}
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCReaderFactory.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCReaderFactory.java 2006-10-12 17:23:59 UTC (rev 10573)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCReaderFactory.java 2006-10-12 19:45:37 UTC (rev 10574)
@@ -10,11 +10,16 @@
final public class JDBCReaderFactory {
+
public static JDBCReader newJDBCReader(Properties cfg, Settings settings,
ReverseEngineeringStrategy revengStrategy) {
MetaDataDialect mdd = newMetaDataDialect( cfg );
+ return newJDBCReader( settings, revengStrategy, mdd );
+ }
+
+ public static JDBCReader newJDBCReader(Settings settings, ReverseEngineeringStrategy revengStrategy, MetaDataDialect mdd) {
return new JDBCReader( mdd, settings.getConnectionProvider(), settings
.getSQLExceptionConverter(), settings.getDefaultCatalogName(), settings.getDefaultSchemaName(), revengStrategy );
}
Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/query/QueryExporterTest.java
===================================================================
--- trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/query/QueryExporterTest.java 2006-10-12 17:23:59 UTC (rev 10573)
+++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/query/QueryExporterTest.java 2006-10-12 19:45:37 UTC (rev 10574)
@@ -53,7 +53,9 @@
queries.add("from java.lang.Object");
exporter.setQueries( queries );
- exporter.start();
+ exporter.start();
+
+ factory.close();
}
protected void tearDown() throws Exception {
17 years, 6 months
Hibernate SVN: r10573 - in trunk/HibernateExt/tools/src: java/org/hibernate/cfg/reveng java/org/hibernate/cfg/reveng/dialect java/org/hibernate/tool java/org/hibernate/tool/ant java/org/hibernate/tool/hbm2x java/org/hibernate/tool/hbm2x/pojo java/org/hibernate/tool/hbmlint java/org/hibernate/tool/hbmlint/detector templates/lint test/org/hibernate/tool test/org/hibernate/tool/ant test/org/hibernate/tool/hbm2x testsupport
by hibernate-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2006-10-12 13:23:59 -0400 (Thu, 12 Oct 2006)
New Revision: 10573
Added:
trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/HbmLintExporterTask.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/HbmLintExporter.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/Detector.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/HbmLint.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/Issue.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/IssueCollector.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/BadCachingDetector.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/EntityModelDetector.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/InstrumentationDetector.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/RelationalModelDetector.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/SchemaByMetaDataDetector.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/ShadowedIdentifierDetector.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/TableSelectorStrategy.java
trunk/HibernateExt/tools/src/templates/lint/text-report.ftl
trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/IncrementalSchemaReadingTest.java
trunk/HibernateExt/tools/src/testsupport/SchemaIssues.hbm.xml
Modified:
trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java
trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/SchemaSelection.java
trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/dialect/JDBCMetaDataDialect.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/Hbm2CfgXmlExporterTask.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/Hbm2DocExporterTask.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/HibernateToolTask.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/GenericExporter.java
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/pojo/EntityPOJOClass.java
trunk/HibernateExt/tools/src/test/org/hibernate/tool/JDBCMetaDataBinderTestCase.java
trunk/HibernateExt/tools/src/test/org/hibernate/tool/ToolAllTests.java
trunk/HibernateExt/tools/src/test/org/hibernate/tool/ant/HibernateToolTest.java
trunk/HibernateExt/tools/src/testsupport/anttest-build.xml
Log:
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -1,8 +1,12 @@
package org.hibernate.cfg.reveng;
+import java.sql.Connection;
import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
import java.sql.SQLException;
+import java.sql.Statement;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
@@ -19,6 +23,7 @@
import org.hibernate.cfg.JDBCBinderException;
import org.hibernate.cfg.reveng.dialect.MetaDataDialect;
import org.hibernate.connection.ConnectionProvider;
+import org.hibernate.dialect.Dialect;
import org.hibernate.exception.SQLExceptionConverter;
import org.hibernate.mapping.Column;
import org.hibernate.mapping.ForeignKey;
@@ -55,7 +60,7 @@
}
}
- public DatabaseCollector readDatabaseSchema(DatabaseCollector dbs, String catalog, String schema, ProgressListener progress) {
+ public List readDatabaseSchema(DatabaseCollector dbs, String catalog, String schema, ProgressListener progress) {
try {
getMetaDataDialect().configure(provider, sec);
revengStrategy.configure(provider, sec);
@@ -63,16 +68,17 @@
Set hasIndices = new HashSet();
List schemaSelectors = revengStrategy.getSchemaSelections();
+ List foundTables = new ArrayList();
if(schemaSelectors==null) {
- processTables(dbs, new SchemaSelection(catalog, schema), hasIndices, progress);
+ foundTables.addAll( processTables(dbs, new SchemaSelection(catalog, schema), hasIndices, progress) );
} else {
for (Iterator iter = schemaSelectors.iterator(); iter.hasNext();) {
SchemaSelection selection = (SchemaSelection) iter.next();
- processTables(dbs, selection, hasIndices, progress);
+ foundTables.addAll( processTables(dbs, selection, hasIndices, progress) );
}
}
- Iterator tables = dbs.iterateTables();
+ Iterator tables = foundTables.iterator(); // not dbs.iterateTables() to avoid "double-read" of columns etc.
while ( tables.hasNext() ) {
Table table = (Table) tables.next();
processBasicColumns(table, progress);
@@ -82,33 +88,45 @@
}
}
- tables = dbs.iterateTables();
- List fks = new ArrayList();
- while ( tables.hasNext() ) {
- Table table = (Table) tables.next();
- // Done here after the basic process of collections as we might not have touched
- // all referenced tables (this ensure the columns are the same instances througout the basic JDBC derived model.
- // after this stage it should be "ok" to divert from keeping columns in sync as it can be required if the same
- //column is used with different aliases in the ORM mapping.
- ForeignKeysInfo foreignKeys = processForeignKeys(dbs, table, progress);
- fks.add( foreignKeys );
- }
+ tables = foundTables.iterator(); //dbs.iterateTables();
+ Map oneToManyCandidates = resolveForeignKeys( dbs, tables, progress );
- Map oneToManyCandidates = new HashMap();
- for (Iterator iter = fks.iterator(); iter.hasNext();) {
- ForeignKeysInfo element = (ForeignKeysInfo) iter.next();
- Map map = element.process( revengStrategy );
- mergeMultiMap( oneToManyCandidates, map );
- }
-
dbs.setOneToManyCandidates(oneToManyCandidates);
- return dbs;
+ return foundTables;
} finally {
getMetaDataDialect().close();
revengStrategy.close();
}
}
+
+ /**
+ * Iterates the tables and find all the foreignkeys that refers to something that is available inside the DatabaseCollector.
+ * @param dbs
+ * @param progress
+ * @param tables
+ * @return
+ */
+ private Map resolveForeignKeys(DatabaseCollector dbs, Iterator tables, ProgressListener progress) {
+ List fks = new ArrayList();
+ while ( tables.hasNext() ) {
+ Table table = (Table) tables.next();
+ // Done here after the basic process of collections as we might not have touched
+ // all referenced tables (this ensure the columns are the same instances througout the basic JDBC derived model.
+ // after this stage it should be "ok" to divert from keeping columns in sync as it can be required if the same
+ //column is used with different aliases in the ORM mapping.
+ ForeignKeysInfo foreignKeys = processForeignKeys(dbs, table, progress);
+ fks.add( foreignKeys );
+ }
+
+ Map oneToManyCandidates = new HashMap();
+ for (Iterator iter = fks.iterator(); iter.hasNext();) {
+ ForeignKeysInfo element = (ForeignKeysInfo) iter.next();
+ Map map = element.process( revengStrategy ); // the actual foreignkey is created here.
+ mergeMultiMap( oneToManyCandidates, map );
+ }
+ return oneToManyCandidates;
+ }
static class ForeignKeysInfo {
@@ -416,7 +434,7 @@
return value.equals(tf);
}
- private void processTables(DatabaseCollector dbs, SchemaSelection schemaSelection, Set hasIndices, ProgressListener progress) {
+ private Collection processTables(DatabaseCollector dbs, SchemaSelection schemaSelection, Set hasIndices, ProgressListener progress) {
Map tableRs = null;
Iterator tableIterator = null;
List tables = new ArrayList();
@@ -465,6 +483,7 @@
}
}
+ List processedTables = new ArrayList();
tableIterator = tables.iterator();
while (tableIterator.hasNext() ) {
tableRs = (Map) tableIterator.next();
@@ -503,6 +522,7 @@
if(tableType.equals("TABLE")) {
hasIndices.add(table);
}
+ processedTables.add( table );
}
else {
log.debug("Ignoring table " + tableName + " of type " + tableType);
@@ -510,6 +530,7 @@
}
}
+ return processedTables;
}
private void processBasicColumns(Table table, ProgressListener progress) {
@@ -803,7 +824,7 @@
}
}
- public DatabaseCollector readDatabaseSchema(DatabaseCollector dbs, String catalog, String schema) {
+ public List readDatabaseSchema(DatabaseCollector dbs, String catalog, String schema) {
return readDatabaseSchema(dbs, catalog, schema, new NoopProgressListener());
}
@@ -827,5 +848,44 @@
protected String getSchemaForDBLookup(String schema) {
return schema==null?defaultSchema:schema;
- }
-}
+ }
+
+ public Set readSequences(String sql) {
+ Set sequences = new HashSet();
+ if (sql!=null) {
+ Connection connection = null;
+ try {
+
+ connection = provider.getConnection();
+ Statement statement = null;
+ ResultSet rs = null;
+ try {
+ statement = connection.createStatement();
+ rs = statement.executeQuery(sql);
+
+ while ( rs.next() ) {
+ sequences.add( rs.getString(1).toLowerCase().trim() );
+ }
+ }
+ finally {
+ if (rs!=null) rs.close();
+ if (statement!=null) statement.close();
+ }
+
+ } catch (SQLException e) {
+ sec.convert(e, "Problem while closing connection", null);
+ }
+ finally {
+ if(connection!=null)
+ try {
+ provider.closeConnection( connection );
+ }
+ catch (SQLException e) {
+ sec.convert(e, "Problem while closing connection", null);
+ }
+ }
+ }
+ return sequences;
+ }
+}
+
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/SchemaSelection.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/SchemaSelection.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/SchemaSelection.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -5,16 +5,20 @@
String matchCatalog;
String matchSchema;
String matchTable;
-
- public SchemaSelection(String catalog, String schema) {
+
+ public SchemaSelection(String catalog, String schema, String table) {
matchCatalog = catalog;
matchSchema = schema;
+ matchTable = table;
}
- public SchemaSelection() {
-
+ public SchemaSelection(String catalog, String schema) {
+ this(catalog, schema, null);
}
+ public SchemaSelection() { }
+
+
public String getMatchCatalog() {
return matchCatalog;
}
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/dialect/JDBCMetaDataDialect.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/dialect/JDBCMetaDataDialect.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/dialect/JDBCMetaDataDialect.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -7,9 +7,7 @@
import java.util.Iterator;
import java.util.Map;
-import org.hibernate.cfg.JDBCBinderException;
import org.hibernate.mapping.Table;
-import org.hibernate.util.StringHelper;
/**
* MetaData dialect that uses standard JDBC for reading metadata.
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/Hbm2CfgXmlExporterTask.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/Hbm2CfgXmlExporterTask.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/Hbm2CfgXmlExporterTask.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -24,7 +24,7 @@
}
public String getName() {
- return "cfg2cfgxml (Generates hibernate.cfg.xml)";
+ return "hbm2cfgxml (Generates hibernate.cfg.xml)";
}
protected Exporter configureExporter(Exporter exporter) {
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/Hbm2DocExporterTask.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/Hbm2DocExporterTask.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/Hbm2DocExporterTask.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -14,7 +14,7 @@
}
public String getName() {
- return "cfg2doc (Generates html schema documentation)";
+ return "hbm2doc (Generates html schema documentation)";
}
protected Exporter createExporter() {
Added: trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/HbmLintExporterTask.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/HbmLintExporterTask.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/HbmLintExporterTask.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -0,0 +1,21 @@
+package org.hibernate.tool.ant;
+
+import org.hibernate.tool.hbm2x.Exporter;
+import org.hibernate.tool.hbm2x.HbmLintExporter;
+
+public class HbmLintExporterTask extends ExporterTask {
+
+ public HbmLintExporterTask(HibernateToolTask parent) {
+ super( parent );
+ }
+
+ protected Exporter createExporter() {
+ return new HbmLintExporter();
+ }
+
+
+ String getName() {
+ return "hbmlint (scans mapping for errors)";
+ }
+
+}
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/HibernateToolTask.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/HibernateToolTask.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/ant/HibernateToolTask.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -129,6 +129,13 @@
return generator;
}
+ public HbmLintExporterTask createHbmLint() {
+ HbmLintExporterTask generator = new HbmLintExporterTask(this);
+ generators.add(generator);
+ return generator;
+ }
+
+
/**
* Set the classpath to be used when running the Java class
*
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/GenericExporter.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/GenericExporter.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/GenericExporter.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -35,7 +35,7 @@
protected void doStart() {
if(filePattern==null) throw new ExporterException("File pattern not set on " + this.getClass());
- if(templateName==null) throw new ExporterException("Template pattern not set on " + this.getClass());
+ if(templateName==null) throw new ExporterException("Template name not set on " + this.getClass());
if(filePattern.indexOf("{class-name}")>=0) {
exportClasses();
Added: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/HbmLintExporter.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/HbmLintExporter.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/HbmLintExporter.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -0,0 +1,38 @@
+package org.hibernate.tool.hbm2x;
+
+import java.io.File;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.tool.hbmlint.HbmLint;
+
+public class HbmLintExporter extends GenericExporter {
+
+ private static final String TEXT_REPORT_FTL = "lint/text-report.ftl";
+
+ public HbmLintExporter() {
+ }
+
+ public HbmLintExporter(Configuration cfg, File outputdir) {
+ super(cfg, outputdir);
+
+ }
+
+ public void start() {
+ // TODO: make non-hardwired
+ setFilePattern( "hbmlint-result.txt" );
+ setTemplateName( TEXT_REPORT_FTL );
+ super.start();
+ }
+ protected void setupContext() {
+ HbmLint hbmlint = HbmLint.createInstance();
+ hbmlint.analyze( getConfiguration() );
+ getProperties().put("lintissues", hbmlint.getResults());
+ super.setupContext();
+ }
+
+ public String getName() {
+ return "hbmlint";
+ }
+
+
+}
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/pojo/EntityPOJOClass.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/pojo/EntityPOJOClass.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/pojo/EntityPOJOClass.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -505,38 +505,7 @@
.append(", fetch=").append( getFetchType( property ) );
if ( collection.isInverse() ) {
annotation.append(", mappedBy=\"");
- Iterator joinColumnsIt = collection.getKey().getColumnIterator();
- Set joinColumns = new HashSet();
- while ( joinColumnsIt.hasNext() ) {
- joinColumns.add( joinColumnsIt.next() );
- }
- OneToMany oneToMany = (OneToMany) collection.getElement();
- PersistentClass pc = cfg.getClassMapping( oneToMany.getReferencedEntityName() );
- Iterator properties = pc.getPropertyClosureIterator();
- //TODO we should check the table too
- boolean isOtherSide = false;
- mappedBy = "unresolved";
- while ( ! isOtherSide && properties.hasNext() ) {
- Property manyProperty = (Property) properties.next();
- Value manyValue = manyProperty.getValue();
- if ( manyValue != null && manyValue instanceof ManyToOne ) {
- if ( joinColumns.size() == manyValue.getColumnSpan() ) {
- isOtherSide = true;
- Iterator it = manyValue.getColumnIterator();
- while ( it.hasNext() ) {
- Object column = it.next();
- if (! joinColumns.contains( column ) ) {
- isOtherSide = false;
- break;
- }
- }
- if (isOtherSide) {
- mappedBy = manyProperty.getName();
- }
- }
-
- }
- }
+ mappedBy = getOneToManyMappedBy( cfg, collection );
annotation.append( mappedBy ).append("\"");
}
annotation.append(")");
@@ -551,40 +520,7 @@
.append(", fetch=").append( getFetchType( property ) );
if ( collection.isInverse() ) {
annotation.append(", mappedBy=\"");
- Iterator joinColumnsIt = collection.getKey().getColumnIterator();
- Set joinColumns = new HashSet();
- while ( joinColumnsIt.hasNext() ) {
- joinColumns.add( joinColumnsIt.next() );
- }
- ManyToOne manyToOne = (ManyToOne) collection.getElement();
- PersistentClass pc = cfg.getClassMapping( manyToOne.getReferencedEntityName() );
- Iterator properties = pc.getPropertyClosureIterator();
- //TODO we should check the table too
- boolean isOtherSide = false;
- mappedBy = "unresolved";
- while ( ! isOtherSide && properties.hasNext() ) {
- Property collectionProperty = (Property) properties.next();
- Value collectionValue = collectionProperty.getValue();
- if ( collectionValue != null && collectionValue instanceof Collection ) {
- Collection realCollectionValue = (Collection) collectionValue;
- if ( ! realCollectionValue.isOneToMany() ) {
- if ( joinColumns.size() == realCollectionValue.getElement().getColumnSpan() ) {
- isOtherSide = true;
- Iterator it = realCollectionValue.getElement().getColumnIterator();
- while ( it.hasNext() ) {
- Object column = it.next();
- if (! joinColumns.contains( column ) ) {
- isOtherSide = false;
- break;
- }
- }
- if (isOtherSide) {
- mappedBy = collectionProperty.getName();
- }
- }
- }
- }
- }
+ mappedBy = getManyToManyMappedBy( cfg, collection );
annotation.append( mappedBy ).append("\"");
}
annotation.append(")");
@@ -630,6 +566,82 @@
}
return annotation.toString();
}
+
+ private String getManyToManyMappedBy(Configuration cfg, Collection collection) {
+ String mappedBy;
+ Iterator joinColumnsIt = collection.getKey().getColumnIterator();
+ Set joinColumns = new HashSet();
+ while ( joinColumnsIt.hasNext() ) {
+ joinColumns.add( joinColumnsIt.next() );
+ }
+ ManyToOne manyToOne = (ManyToOne) collection.getElement();
+ PersistentClass pc = cfg.getClassMapping( manyToOne.getReferencedEntityName() );
+ Iterator properties = pc.getPropertyClosureIterator();
+ //TODO we should check the table too
+ boolean isOtherSide = false;
+ mappedBy = "unresolved";
+ while ( ! isOtherSide && properties.hasNext() ) {
+ Property collectionProperty = (Property) properties.next();
+ Value collectionValue = collectionProperty.getValue();
+ if ( collectionValue != null && collectionValue instanceof Collection ) {
+ Collection realCollectionValue = (Collection) collectionValue;
+ if ( ! realCollectionValue.isOneToMany() ) {
+ if ( joinColumns.size() == realCollectionValue.getElement().getColumnSpan() ) {
+ isOtherSide = true;
+ Iterator it = realCollectionValue.getElement().getColumnIterator();
+ while ( it.hasNext() ) {
+ Object column = it.next();
+ if (! joinColumns.contains( column ) ) {
+ isOtherSide = false;
+ break;
+ }
+ }
+ if (isOtherSide) {
+ mappedBy = collectionProperty.getName();
+ }
+ }
+ }
+ }
+ }
+ return mappedBy;
+ }
+
+ private String getOneToManyMappedBy(Configuration cfg, Collection collection) {
+ String mappedBy;
+ Iterator joinColumnsIt = collection.getKey().getColumnIterator();
+ Set joinColumns = new HashSet();
+ while ( joinColumnsIt.hasNext() ) {
+ joinColumns.add( joinColumnsIt.next() );
+ }
+ OneToMany oneToMany = (OneToMany) collection.getElement();
+ PersistentClass pc = cfg.getClassMapping( oneToMany.getReferencedEntityName() );
+ Iterator properties = pc.getPropertyClosureIterator();
+ //TODO we should check the table too
+ boolean isOtherSide = false;
+ mappedBy = "unresolved";
+ while ( ! isOtherSide && properties.hasNext() ) {
+ Property manyProperty = (Property) properties.next();
+ Value manyValue = manyProperty.getValue();
+ if ( manyValue != null && manyValue instanceof ManyToOne ) {
+ if ( joinColumns.size() == manyValue.getColumnSpan() ) {
+ isOtherSide = true;
+ Iterator it = manyValue.getColumnIterator();
+ while ( it.hasNext() ) {
+ Object column = it.next();
+ if (! joinColumns.contains( column ) ) {
+ isOtherSide = false;
+ break;
+ }
+ }
+ if (isOtherSide) {
+ mappedBy = manyProperty.getName();
+ }
+ }
+
+ }
+ }
+ return mappedBy;
+ }
public boolean isSubclass() {
return clazz.getSuperclass()!=null;
Added: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/Detector.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/Detector.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/Detector.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -0,0 +1,29 @@
+package org.hibernate.tool.hbmlint;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Settings;
+
+public abstract class Detector {
+
+ private Configuration cfg;
+ private Settings settings;
+
+ public void initialize(Configuration cfg, Settings settings) {
+ this.cfg = cfg;
+ this.settings = settings;
+ }
+
+ protected Settings getSettings() {
+ return settings;
+ }
+
+ protected Configuration getConfiguration() {
+ return cfg;
+ }
+
+ public void visit(Configuration cfg, IssueCollector collector) {
+
+ }
+
+ abstract public String getName();
+}
Added: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/HbmLint.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/HbmLint.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/HbmLint.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -0,0 +1,57 @@
+package org.hibernate.tool.hbmlint;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Settings;
+import org.hibernate.tool.hbmlint.detector.BadCachingDetector;
+import org.hibernate.tool.hbmlint.detector.InstrumentationDetector;
+import org.hibernate.tool.hbmlint.detector.SchemaByMetaDataDetector;
+import org.hibernate.tool.hbmlint.detector.ShadowedIdentifierDetector;
+
+public class HbmLint implements IssueCollector {
+
+
+ final Detector[] detectors;
+
+ public HbmLint(Detector[] detectors) {
+ this.detectors = detectors;
+ }
+
+ List results = new ArrayList();
+
+ public void analyze(Configuration cfg) {
+
+ Settings settings = cfg.buildSettings();
+
+ for (int i = 0; i < detectors.length; i++) {
+ detectors[i].initialize( cfg, settings );
+ detectors[i].visit(cfg, this);
+ }
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.hibernate.tool.hbmlint.IssueCollector#reportProblem(org.hibernate.tool.hbmlint.Issue)
+ */
+ public void reportIssue(Issue analyze) {
+ results.add(analyze);
+ }
+
+ public List getResults() {
+ return results;
+ }
+
+ public static HbmLint createInstance() {
+ return new HbmLint(
+ new Detector[] {
+ new BadCachingDetector(),
+ new InstrumentationDetector(),
+ new ShadowedIdentifierDetector(),
+ new SchemaByMetaDataDetector()
+ });
+
+ }
+
+}
Added: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/Issue.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/Issue.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/Issue.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -0,0 +1,27 @@
+package org.hibernate.tool.hbmlint;
+
+public class Issue {
+
+ public static final int HIGH_PRIORITY = 100;
+ public static final int NORMAL_PRIORITY = 50;
+ public static final int LOW_PRIORITY = 0;
+
+ private final String type;
+ private final int priority;
+
+ private final String description;
+
+ public Issue(String type, int priority, String description) {
+ this.description = description;
+ this.priority = priority;
+ this.type = type;
+ }
+
+ public String toString() {
+ return type + ":" + description;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+}
Added: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/IssueCollector.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/IssueCollector.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/IssueCollector.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -0,0 +1,7 @@
+package org.hibernate.tool.hbmlint;
+
+public interface IssueCollector {
+
+ public abstract void reportIssue(Issue analyze);
+
+}
\ No newline at end of file
Added: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/BadCachingDetector.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/BadCachingDetector.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/BadCachingDetector.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -0,0 +1,36 @@
+package org.hibernate.tool.hbmlint.detector;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.Value;
+import org.hibernate.tool.hbm2x.visitor.EntityNameFromValueVisitor;
+import org.hibernate.tool.hbmlint.Issue;
+import org.hibernate.tool.hbmlint.IssueCollector;
+
+public class BadCachingDetector extends EntityModelDetector {
+
+ public String getName() {
+ return "cache";
+ }
+ public void visitProperty(Configuration configuration, PersistentClass clazz, Property property, IssueCollector collector) {
+ Value value = property.getValue();
+
+ if(value instanceof Collection) {
+ Collection col = (Collection) value;
+ if(col.getCacheConcurrencyStrategy()!=null) { // caching is enabled
+ if (!col.getElement().isSimpleValue()) {
+ String entityName = (String) col.getElement().accept( new EntityNameFromValueVisitor() );
+
+ if(entityName!=null) {
+ PersistentClass classMapping = configuration.getClassMapping( entityName );
+ if(classMapping.getCacheConcurrencyStrategy()==null) {
+ collector.reportIssue( new Issue("CACHE_COLLECTION_NONCACHABLE_TARGET", Issue.HIGH_PRIORITY, "Entity '" + classMapping.getEntityName() +"' is referenced from the cache-enabled collection '" + col.getRole() + "' without the entity being cachable"));
+ }
+ }
+ }
+ }
+ }
+ }
+}
Added: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/EntityModelDetector.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/EntityModelDetector.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/EntityModelDetector.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -0,0 +1,39 @@
+package org.hibernate.tool.hbmlint.detector;
+
+import java.util.Iterator;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.tool.hbmlint.Detector;
+import org.hibernate.tool.hbmlint.IssueCollector;
+
+public abstract class EntityModelDetector extends Detector {
+
+ public void visit(Configuration cfg, IssueCollector collector) {
+ for (Iterator iter = cfg.getClassMappings(); iter.hasNext();) {
+ PersistentClass clazz = (PersistentClass) iter.next();
+ this.visit(cfg, clazz, collector);
+ }
+ }
+
+ public void visit(Configuration cfg, PersistentClass clazz, IssueCollector collector) {
+ visitProperties( cfg, clazz, collector );
+ }
+
+ public void visitProperties(Configuration cfg, PersistentClass clazz, IssueCollector collector) {
+ if(clazz.hasIdentifierProperty()) {
+ this.visitProperty(getConfiguration(), clazz, clazz.getIdentifierProperty(), collector);
+ }
+ Iterator propertyIterator = clazz.getPropertyIterator();
+ while ( propertyIterator.hasNext() ) {
+ Property property = (Property) propertyIterator.next();
+ this.visitProperty(getConfiguration(), clazz, property, collector);
+
+ }
+ }
+
+ public void visitProperty(Configuration configuration, PersistentClass clazz, Property property, IssueCollector collector) {
+
+ }
+}
Added: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/InstrumentationDetector.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/InstrumentationDetector.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/InstrumentationDetector.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -0,0 +1,81 @@
+package org.hibernate.tool.hbmlint.detector;
+
+import org.hibernate.MappingException;
+import org.hibernate.bytecode.cglib.BytecodeProviderImpl;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.cfg.Settings;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.tool.hbmlint.Issue;
+import org.hibernate.tool.hbmlint.IssueCollector;
+
+public class InstrumentationDetector extends EntityModelDetector {
+
+ public String getName() {
+ return "instrument";
+ }
+ private boolean cglibEnabled;
+ private boolean javassistEnabled;
+
+ public void initialize(Configuration cfg, Settings settings) {
+ super.initialize( cfg, settings );
+
+ cglibEnabled = false;
+ javassistEnabled = false;
+
+ if(Environment.getBytecodeProvider() instanceof BytecodeProviderImpl) {
+ cglibEnabled = true;
+ } else if(Environment.getBytecodeProvider() instanceof BytecodeProviderImpl) {
+ javassistEnabled = true;
+ }
+ }
+
+ public void visit(Configuration cfg, PersistentClass clazz, IssueCollector collector) {
+ Class mappedClass;
+
+
+ try {
+ mappedClass = clazz.getMappedClass();
+ } catch(MappingException me) {
+ // ignore
+ return;
+ }
+
+ if(clazz.isLazy()) {
+ try {
+ mappedClass.getConstructor( new Class[0] );
+ }
+ catch (SecurityException e) {
+ // ignore
+ }
+ catch (NoSuchMethodException e) {
+ collector.reportIssue(new Issue("LAZY_NO_DEFAULT_CONSTRUCTOR",Issue.NORMAL_PRIORITY, "lazy='true' set for '" + clazz.getEntityName() +"', but class has no default constructor." ));
+ return;
+ }
+
+ } else if(cglibEnabled || javassistEnabled){
+ Class[] interfaces = mappedClass.getInterfaces();
+ boolean cglib = false;
+ boolean javaassist = false;
+ for (int i = 0; i < interfaces.length; i++) {
+ Class intface = interfaces[i];
+ if(intface.getName().equals( "net.sf.cglib.transform.impl.InterceptFieldEnabled" )) {
+ cglib = true;
+ } else if(javassistEnabled && !intface.getName().equals( "org.hibernate.bytecode.javassist.FieldHandled" )) {
+ javaassist = true;
+ }
+ }
+
+ if(cglibEnabled && !cglib) {
+ collector.reportIssue( new Issue("LAZY_NOT_INSTRUMENTED", Issue.HIGH_PRIORITY, "'" + clazz.getEntityName() + "' has lazy='false', but its class '" + mappedClass.getName() + "' has not been instrumented with cglib") );
+ return;
+ } else if (javassistEnabled && !javaassist) {
+ collector.reportIssue( new Issue("LAZY_NOT_INSTRUMENTED", Issue.HIGH_PRIORITY, "'" + clazz.getEntityName() + "' has lazy='false', but its class '" + mappedClass.getName() + "' has not been instrumented with javaassist") );
+ return;
+ } else {
+ // unknown bytecodeprovider...can't really check for that.
+ }
+
+ }
+ }
+}
Added: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/RelationalModelDetector.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/RelationalModelDetector.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/RelationalModelDetector.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -0,0 +1,41 @@
+package org.hibernate.tool.hbmlint.detector;
+
+import java.util.Iterator;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.Table;
+import org.hibernate.tool.hbmlint.Detector;
+import org.hibernate.tool.hbmlint.IssueCollector;
+
+public abstract class RelationalModelDetector extends Detector {
+
+ public void visit(Configuration cfg, IssueCollector collector) {
+ for (Iterator iter = cfg.getTableMappings(); iter.hasNext();) {
+ Table table = (Table) iter.next();
+ this.visit(cfg, table, collector);
+ }
+ }
+
+
+ protected void visit(Configuration cfg, Table table, Column col, IssueCollector collector) {
+
+ }
+
+ protected void visitColumns(Configuration cfg, Table table, IssueCollector collector) {
+ Iterator columnIter = table.getColumnIterator();
+ while ( columnIter.hasNext() ) {
+ Column col = ( Column ) columnIter.next();
+ this.visit( cfg, table, col, collector );
+ }
+ }
+
+ /**
+ * @return true if visit should continue down through the columns
+ */
+ protected void visit(Configuration cfg, Table table, IssueCollector collector) {
+ visitColumns(cfg, table, collector);
+ }
+
+}
+
Added: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/SchemaByMetaDataDetector.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/SchemaByMetaDataDetector.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/SchemaByMetaDataDetector.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -0,0 +1,266 @@
+package org.hibernate.tool.hbmlint.detector;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeMap;
+
+import org.hibernate.HibernateException;
+import org.hibernate.MappingException;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.cfg.JDBCReaderFactory;
+import org.hibernate.cfg.Settings;
+import org.hibernate.cfg.reveng.DefaultDatabaseCollector;
+import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy;
+import org.hibernate.cfg.reveng.JDBCReader;
+import org.hibernate.cfg.reveng.JDBCToHibernateTypeHelper;
+import org.hibernate.cfg.reveng.SchemaSelection;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.engine.Mapping;
+import org.hibernate.id.IdentifierGenerator;
+import org.hibernate.id.PersistentIdentifierGenerator;
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.IdentifierCollection;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.RootClass;
+import org.hibernate.mapping.Table;
+import org.hibernate.tool.hbmlint.Issue;
+import org.hibernate.tool.hbmlint.IssueCollector;
+import org.hibernate.util.StringHelper;
+
+public class SchemaByMetaDataDetector extends RelationalModelDetector {
+
+ public String getName() {
+ return "schema";
+ }
+
+ JDBCReader reader;
+
+ private TableSelectorStrategy tableSelector;
+
+ private DefaultDatabaseCollector dbc;
+
+ private Dialect dialect;
+
+ private Mapping mapping;
+
+ /** current table as read from the database */
+ Table currentDbTable = null;
+
+ public SchemaByMetaDataDetector() {
+
+ }
+
+ public void initialize(Configuration cfg, Settings settings) {
+ super.initialize( cfg, settings );
+ dialect = settings.getDialect();
+
+ tableSelector = new TableSelectorStrategy(
+ new DefaultReverseEngineeringStrategy() );
+ reader = JDBCReaderFactory.newJDBCReader( cfg.getProperties(),
+ settings, tableSelector );
+ dbc = new DefaultDatabaseCollector();
+ mapping = cfg.buildMapping();
+ }
+
+ public void visit(Configuration cfg, IssueCollector collector) {
+ super.visit( cfg, collector );
+
+ visitGenerators(cfg, collector);
+
+ }
+
+ public void visitGenerators(Configuration cfg, IssueCollector collector) {
+ Iterator iter = iterateGenerators(cfg);
+
+ Set sequences = Collections.EMPTY_SET;
+ if(dialect.supportsSequences()) {
+ sequences = reader.readSequences(dialect.getQuerySequencesString());
+ }
+
+ // TODO: move this check into something that could check per class or collection instead.
+ while ( iter.hasNext() ) {
+ PersistentIdentifierGenerator generator = (PersistentIdentifierGenerator) iter.next();
+ Object key = generator.generatorKey();
+ if ( !isSequence(key, sequences) && !isTable( key ) ) {
+ collector.reportIssue( new Issue( "MISSING_ID_GENERATOR", Issue.HIGH_PRIORITY, "Missing sequence or table: " + key));
+ }
+ }
+
+
+ }
+
+ private boolean isSequence(Object key, Set sequences) {
+ if(key instanceof String) {
+ if ( sequences.contains( key ) ) {
+ return true;
+ } else {
+ String[] strings = StringHelper.split(".", (String) key);
+ if(strings.length==3) {
+ return sequences.contains(strings[2]);
+ } else if (strings.length==2) {
+ return sequences.contains(strings[1]);
+ }
+ }
+ }
+ return false;
+ }
+
+ private boolean isTable(Object key) throws HibernateException {
+ // BIG HACK - should probably utilize the table cache before going to the jdbcreader :(
+ if(key instanceof String) {
+ String[] strings = StringHelper.split(".", (String) key);
+ if(strings.length==1) {
+ tableSelector.clearSchemaSelections();
+ tableSelector.addSchemaSelection( new SchemaSelection(null,null, strings[0]) );
+ List list = reader.readDatabaseSchema( dbc, null, null );
+ return !list.isEmpty();
+ } else if(strings.length==3) {
+ tableSelector.clearSchemaSelections();
+ tableSelector.addSchemaSelection( new SchemaSelection(strings[0],strings[1], strings[2]) );
+ List list = reader.readDatabaseSchema( dbc, null, null );
+ return !list.isEmpty();
+ } else if (strings.length==2) {
+ tableSelector.clearSchemaSelections();
+ tableSelector.addSchemaSelection( new SchemaSelection(null,strings[0], strings[1]) );
+ List list = reader.readDatabaseSchema( dbc, null, null );
+ return !list.isEmpty();
+ }
+ }
+ return false;
+ }
+
+ public void visit(Configuration cfg, Table table, IssueCollector pc) {
+
+ if ( table.isPhysicalTable() ) {
+ setSchemaSelection( table );
+
+ List list = reader.readDatabaseSchema( dbc, null, null );
+
+ if ( list.isEmpty() ) {
+ pc.reportIssue( new Issue( "SCHEMA_TABLE_MISSING",
+ Issue.HIGH_PRIORITY, "Missing table "
+ + Table.qualify( table.getCatalog(), table
+ .getSchema(), table.getName() ) ) );
+ return;
+ }
+ else if ( list.size() > 1 ) {
+ pc.reportIssue( new Issue( "SCHEMA_TABLE_MISSING",
+ Issue.NORMAL_PRIORITY, "Found "
+ + list.size()
+ + " tables for "
+ + Table.qualify( table.getCatalog(), table
+ .getSchema(), table.getName() ) ) );
+ return;
+ }
+ else {
+ currentDbTable = (Table) list.get( 0 );
+ visitColumns(cfg,table,pc);
+ }
+ }
+ else {
+ // log?
+ }
+ }
+
+ String table(Table t) {
+ return Table.qualify( t.getCatalog(), t.getSchema(), t.getName() );
+ }
+
+ public void visit(Configuration cfg, Table table, Column col,
+ IssueCollector pc) {
+ if ( currentDbTable == null ) {
+ return;
+ }
+
+ Column dbColumn = currentDbTable
+ .getColumn( new Column( col.getName() ) );
+
+ if ( dbColumn == null ) {
+ pc.reportIssue( new Issue( "SCHEMA_COLUMN_MISSING",
+ Issue.HIGH_PRIORITY, table(table) + " is missing column: " + col.getName() ) );
+ }
+ else {
+ //TODO: this needs to be able to know if a type is truly compatible or not. Right now it requires an exact match.
+ String sqlType = col.getSqlType( dialect, mapping );
+ int dbTypeCode = dbColumn.getSqlTypeCode().intValue();
+ int modelTypeCode = col
+ .getSqlTypeCode( mapping );
+ // TODO: sqltype name string
+ if ( !(dbTypeCode == modelTypeCode ) ) {
+ pc.reportIssue( new Issue( "SCHEMA_COLUMN_TYPE_MISMATCH",
+ Issue.NORMAL_PRIORITY, table(table) + " has a wrong column type for "
+ + col.getName() + ", expected: "
+ + JDBCToHibernateTypeHelper.getJDBCTypeName(modelTypeCode) + " but was " + JDBCToHibernateTypeHelper.getJDBCTypeName(dbTypeCode) + " in db") );
+ }
+ }
+ }
+
+ private void setSchemaSelection(Table table) {
+ tableSelector.clearSchemaSelections();
+ tableSelector.addSchemaSelection( new SchemaSelection( table
+ .getCatalog(), table.getSchema(), table.getName() ) );
+
+ }
+
+ /**
+ *
+ * @param cfg
+ * @return iterator over all the IdentifierGenerator's found in the entitymodel and return a list of unique IdentifierGenerators
+ * @throws MappingException
+ */
+ private Iterator iterateGenerators(Configuration cfg) throws MappingException {
+
+ TreeMap generators = new TreeMap();
+ String defaultCatalog = getSettings().getDefaultCatalogName();
+ String defaultSchema = getSettings().getDefaultSchemaName();
+
+ Iterator iter = cfg.getClassMappings();
+ while ( iter.hasNext() ) {
+ PersistentClass pc = (PersistentClass) iter.next();
+
+ if ( !pc.isInherited() ) {
+
+ IdentifierGenerator ig = pc.getIdentifier()
+ .createIdentifierGenerator(
+ dialect,
+ defaultCatalog,
+ defaultSchema,
+ (RootClass) pc
+ );
+
+ if ( ig instanceof PersistentIdentifierGenerator ) {
+ generators.put( ( (PersistentIdentifierGenerator) ig ).generatorKey(), ig );
+ }
+
+ }
+ }
+
+ iter = getConfiguration().getCollectionMappings();
+ while ( iter.hasNext() ) {
+ Collection collection = (Collection) iter.next();
+
+ if ( collection.isIdentified() ) {
+
+ IdentifierGenerator ig = ( (IdentifierCollection) collection ).getIdentifier()
+ .createIdentifierGenerator(
+ dialect,
+ defaultCatalog,
+ defaultSchema,
+ null
+ );
+
+ if ( ig instanceof PersistentIdentifierGenerator ) {
+ generators.put( ( (PersistentIdentifierGenerator) ig ).generatorKey(), ig );
+ }
+
+ }
+ }
+
+ return generators.values().iterator();
+ }
+
+}
Added: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/ShadowedIdentifierDetector.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/ShadowedIdentifierDetector.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/ShadowedIdentifierDetector.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -0,0 +1,22 @@
+package org.hibernate.tool.hbmlint.detector;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.tool.hbmlint.Issue;
+import org.hibernate.tool.hbmlint.IssueCollector;
+
+public class ShadowedIdentifierDetector extends EntityModelDetector {
+
+ public String getName() {
+ return "shadow-id";
+ }
+
+ public void visitProperty(Configuration configuration, PersistentClass clazz, Property property, IssueCollector collector) {
+ if(property.getName().equals("id")) {
+ if (property != property.getPersistentClass().getIdentifierProperty()) {
+ collector.reportIssue(new Issue("ID_SHADOWED", Issue.LOW_PRIORITY, property.getPersistentClass().getEntityName() + " has a normal property named 'id'. This can cause issues since HQL queries will always interpret 'id' as the identifier and not the concrete property"));
+ }
+ }
+ }
+}
Added: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/TableSelectorStrategy.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/TableSelectorStrategy.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/TableSelectorStrategy.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -0,0 +1,33 @@
+/**
+ *
+ */
+package org.hibernate.tool.hbmlint.detector;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.cfg.reveng.DelegatingReverseEngineeringStrategy;
+import org.hibernate.cfg.reveng.ReverseEngineeringStrategy;
+import org.hibernate.cfg.reveng.SchemaSelection;
+
+public class TableSelectorStrategy extends DelegatingReverseEngineeringStrategy {
+
+ List selections = new ArrayList();
+
+ public TableSelectorStrategy(ReverseEngineeringStrategy res) {
+ super(res);
+ }
+
+ public List getSchemaSelections() {
+ return selections;
+ }
+
+
+ public void clearSchemaSelections() {
+ selections.clear();
+ }
+
+ public void addSchemaSelection(SchemaSelection selection) {
+ selections.add(selection);
+ }
+}
\ No newline at end of file
Added: trunk/HibernateExt/tools/src/templates/lint/text-report.ftl
===================================================================
--- trunk/HibernateExt/tools/src/templates/lint/text-report.ftl 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/templates/lint/text-report.ftl 2006-10-12 17:23:59 UTC (rev 10573)
@@ -0,0 +1,3 @@
+<#foreach issue in lintissues>
+${issue}
+</#foreach>
\ No newline at end of file
Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/JDBCMetaDataBinderTestCase.java
===================================================================
--- trunk/HibernateExt/tools/src/test/org/hibernate/tool/JDBCMetaDataBinderTestCase.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/JDBCMetaDataBinderTestCase.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -139,7 +139,7 @@
protected void tearDown() throws Exception {
executeDDL(getDropSQL(), false);
- assertNoTables();
+
super.tearDown();
}
/**
Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/ToolAllTests.java
===================================================================
--- trunk/HibernateExt/tools/src/test/org/hibernate/tool/ToolAllTests.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/ToolAllTests.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -1,6 +1,7 @@
package org.hibernate.tool;
import org.hibernate.tool.hbm2x.query.QueryAllTests;
+import org.hibernate.tool.hbmlint.HbmLintAllTests;
import org.hibernate.tool.ide.completion.CompletionAllTests;
import junit.framework.Test;
@@ -17,6 +18,6 @@
suite.addTest(org.hibernate.tool.hbm2x.Hbm2XAllTests.suite() );
suite.addTest(CompletionAllTests.suite() );
suite.addTest(QueryAllTests.suite() );
-
+ suite.addTest(HbmLintAllTests.suite() );
return suite;
}}
Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/ant/HibernateToolTest.java
===================================================================
--- trunk/HibernateExt/tools/src/test/org/hibernate/tool/ant/HibernateToolTest.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/ant/HibernateToolTest.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -178,6 +178,15 @@
}
+ public void testHbmLint() {
+ executeTarget("testhbmlint");
+
+ File baseDir = new File(project.getProperty("build.dir"), "linttest");
+
+ assertTrue(new File(baseDir, "hbmlint-result.txt").exists());
+
+ }
+
public void testNoConfig() {
try {
executeTarget("noconfig-shoulderror");
Added: trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/IncrementalSchemaReadingTest.java
===================================================================
--- trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/IncrementalSchemaReadingTest.java 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/IncrementalSchemaReadingTest.java 2006-10-12 17:23:59 UTC (rev 10573)
@@ -0,0 +1,121 @@
+/*
+ * Created on 2004-12-01
+ *
+ */
+package org.hibernate.tool.hbm2x;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.hibernate.cfg.Environment;
+import org.hibernate.cfg.JDBCMetaDataConfiguration;
+import org.hibernate.cfg.JDBCReaderFactory;
+import org.hibernate.cfg.Settings;
+import org.hibernate.cfg.reveng.DatabaseCollector;
+import org.hibernate.cfg.reveng.DefaultDatabaseCollector;
+import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy;
+import org.hibernate.cfg.reveng.JDBCReader;
+import org.hibernate.cfg.reveng.OverrideRepository;
+import org.hibernate.cfg.reveng.SchemaSelection;
+import org.hibernate.cfg.reveng.TableIdentifier;
+import org.hibernate.cfg.reveng.dialect.JDBCMetaDataDialect;
+import org.hibernate.mapping.Table;
+import org.hibernate.tool.JDBCMetaDataBinderTestCase;
+import org.hibernate.tool.hbmlint.detector.TableSelectorStrategy;
+
+
+
+/**
+ * @author max
+ *
+ */
+public class IncrementalSchemaReadingTest extends JDBCMetaDataBinderTestCase {
+
+
+ protected void configure(JDBCMetaDataConfiguration cfg) {
+ super.configure( cfg );
+ }
+
+ public class MockedMetaDataDialect extends JDBCMetaDataDialect {
+ List gottenTables = new ArrayList();
+ public Iterator getTables(String catalog, String schema, String table) {
+ gottenTables.add(table);
+ return super.getTables( catalog, schema, table );
+ }
+
+ }
+
+ public void testReadSchemaIncremental() {
+ Settings buildSettings = cfg.buildSettings();
+ TableSelectorStrategy tss = new TableSelectorStrategy(new DefaultReverseEngineeringStrategy());
+ MockedMetaDataDialect mockedMetaDataDialect = new MockedMetaDataDialect();
+ JDBCReader reader = JDBCReaderFactory.newJDBCReader( buildSettings, tss, mockedMetaDataDialect );
+
+ tss.addSchemaSelection( new SchemaSelection(null,null, "CHILD") );
+
+ DatabaseCollector dc = new DefaultDatabaseCollector();
+ reader.readDatabaseSchema( dc, null, null );
+
+ assertEquals(mockedMetaDataDialect.gottenTables.size(),1);
+ assertEquals(mockedMetaDataDialect.gottenTables.get(0),"CHILD");
+
+ Iterator iterator = dc.iterateTables();
+ Table firstChild = (Table) iterator.next();
+ assertEquals(firstChild.getName(), "CHILD");
+ assertFalse(iterator.hasNext());
+
+ assertFalse("should not record foreignkey to table it doesn't know about yet",firstChild.getForeignKeyIterator().hasNext());
+
+ tss.clearSchemaSelections();
+ tss.addSchemaSelection( new SchemaSelection(null, null, "MASTER") );
+
+ mockedMetaDataDialect.gottenTables.clear();
+ reader.readDatabaseSchema( dc, null, null );
+
+ assertEquals(mockedMetaDataDialect.gottenTables.size(),1);
+ assertEquals(mockedMetaDataDialect.gottenTables.get(0),"MASTER");
+
+
+ iterator = dc.iterateTables();
+ assertNotNull(iterator.next());
+ assertNotNull(iterator.next());
+ assertFalse(iterator.hasNext());
+
+ Table table = dc.getTable( null, null, "CHILD" );
+ assertSame( firstChild, table );
+
+ assertHasNext("should have recorded one foreignkey to child table", 1, firstChild.getForeignKeyIterator() );
+
+
+ tss.clearSchemaSelections();
+ reader.readDatabaseSchema( dc, null, null );
+
+ Table finalMaster = dc.getTable( null, null, "MASTER" );
+
+ assertSame(firstChild, dc.getTable( null, null, "CHILD" ));
+ assertHasNext( 1, firstChild.getForeignKeyIterator() );
+ assertHasNext( 0, finalMaster.getForeignKeyIterator() );
+
+
+ }
+
+ protected String[] getCreateSQL() {
+
+ return new String[] {
+ "create table master ( id char not null, name varchar(20), primary key (id) )",
+ "create table child ( childid char not null, masterref char, primary key (childid), foreign key (masterref) references master(id) )",
+ };
+ }
+
+ protected String[] getDropSQL() {
+
+ return new String[] {
+ "drop table child",
+ "drop table master",
+ };
+ }
+
+}
Added: trunk/HibernateExt/tools/src/testsupport/SchemaIssues.hbm.xml
===================================================================
--- trunk/HibernateExt/tools/src/testsupport/SchemaIssues.hbm.xml 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/testsupport/SchemaIssues.hbm.xml 2006-10-12 17:23:59 UTC (rev 10573)
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.tool.hbmlint">
+
+ <class name="Category">
+
+ <id name="id" type="int">
+ <generator class="sequence">
+ <param name="sequence">should_be_there</param>
+ </generator>
+ </id>
+
+ <property name="name" type="string"/>
+
+ </class>
+
+ <class name="BadType">
+
+ <id name="id" type="int">
+ <generator class="hilo"/>
+ </id>
+
+ <property name="name" type="text"/>
+
+ </class>
+
+ <class name="MissingTable">
+ <id name="id" type="long">
+ <generator class="hilo">
+ <param name="table">hilo_table</param>
+ </generator>
+ </id>
+ </class>
+</hibernate-mapping>
Modified: trunk/HibernateExt/tools/src/testsupport/anttest-build.xml
===================================================================
--- trunk/HibernateExt/tools/src/testsupport/anttest-build.xml 2006-10-12 17:23:52 UTC (rev 10572)
+++ trunk/HibernateExt/tools/src/testsupport/anttest-build.xml 2006-10-12 17:23:59 UTC (rev 10573)
@@ -436,6 +436,20 @@
<antcall target="afterCfg2hbm" />
</target>
+ <target name="testhbmlint" depends="prepareCfg2hbm" description="test the query tasks">
+ <taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask" classpathref="tasks.classpath" />
+
+ <hibernatetool destdir="${build.dir}/linttest">
+ <configuration propertyfile="../../etc/hibernate.properties" configurationfile="querytest-hibernate.cfg.xml">
+ <fileset dir="../test">
+ <include name="**/SchemaIssues.hbm.xml"/>
+ </fileset>
+ </configuration>
+ <hbmlint/>
+ </hibernatetool>
+
+ <antcall target="afterCfg2hbm" />
+ </target>
<target name="noconfig-shoulderror">
<taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask" classpathref="tasks.classpath" />
17 years, 6 months
Hibernate SVN: r10571 - trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor
by hibernate-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2006-10-12 09:01:43 -0400 (Thu, 12 Oct 2006)
New Revision: 10571
Modified:
trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/EntityNameFromValueVisitor.java
Log:
HBX-775 Graphs fail for entities with Set collections
Modified: trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/EntityNameFromValueVisitor.java
===================================================================
--- trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/EntityNameFromValueVisitor.java 2006-10-11 20:26:55 UTC (rev 10570)
+++ trunk/HibernateExt/tools/src/java/org/hibernate/tool/hbm2x/visitor/EntityNameFromValueVisitor.java 2006-10-12 13:01:43 UTC (rev 10571)
@@ -4,12 +4,14 @@
import org.hibernate.mapping.Bag;
import org.hibernate.mapping.Collection;
import org.hibernate.mapping.Component;
+import org.hibernate.mapping.IdentifierBag;
import org.hibernate.mapping.List;
import org.hibernate.mapping.ManyToOne;
import org.hibernate.mapping.Map;
import org.hibernate.mapping.OneToMany;
import org.hibernate.mapping.OneToOne;
import org.hibernate.mapping.PrimitiveArray;
+import org.hibernate.mapping.Set;
import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.ToOne;
@@ -47,6 +49,14 @@
return acceptCollection( o );
}
+ public Object accept(IdentifierBag o) {
+ return acceptCollection( o );
+ }
+
+ public Object accept(Set o) {
+ return acceptCollection( o );
+ }
+
public Object accept(Map o) {
return acceptCollection( o );
}
17 years, 6 months