METAGEN Start of JPA metamodel processor project
This commit is contained in:
parent
1e39c4b07f
commit
31901374fc
|
@ -0,0 +1,19 @@
|
|||
|
||||
- Find host for project
|
||||
|
||||
- Implement XML overriding of annotation metadata
|
||||
|
||||
- Implement access Type rules for XML metadata
|
||||
|
||||
- Investigate why it is not possible to use the Filer API to load non class resources, eg
|
||||
/META-INF/orm.xml. The API throws a FilerException with the message "Illegal name /META-INF".
|
||||
The call is processingEnv.getFiler().getResource((StandardLocation.CLASS_OUTPUT, "/META-INF", "orm.xml" )
|
||||
Currently we work around this by using Class.getResourceAsStream()
|
||||
|
||||
- Optimize XML parsing by only processing XML files if they have changed since last run (maybe write
|
||||
a tmp file against which to compare the last modified time stamp)
|
||||
|
||||
- Reduce the amount of logging and make logging configurable using the possibility to pass arguments to
|
||||
the processor using -Akey[=value]
|
||||
|
||||
- Write IDE specific plugins which allow to cache processing steps
|
|
@ -0,0 +1,202 @@
|
|||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
|
@ -0,0 +1,323 @@
|
|||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.hibernate</groupId>
|
||||
<artifactId>hibernate-jpamodelgen</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
|
||||
<name>JPA 2 Static-Metamodel Generator</name>
|
||||
<description>Annotation Processor to generate JPA 2 static metamodel classes</description>
|
||||
|
||||
<inceptionYear>2009</inceptionYear>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.hibernate.java-persistence</groupId>
|
||||
<artifactId>jpa-api</artifactId>
|
||||
<version>2.0-cr-1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.testng</groupId>
|
||||
<artifactId>testng</artifactId>
|
||||
<version>5.8</version>
|
||||
<classifier>jdk15</classifier>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<licenses>
|
||||
<license>
|
||||
<name>Apache License, Version 2.0</name>
|
||||
<url>license.txt</url>
|
||||
</license>
|
||||
</licenses>
|
||||
|
||||
<scm>
|
||||
<connection>scm:svn:https://svn.jboss.org/repos/hibernate/jpamodelgen/trunk</connection>
|
||||
<url>http://fisheye.jboss.org/browse/Hibernate/jpamodelgen/trunk</url>
|
||||
</scm>
|
||||
|
||||
<developers>
|
||||
<developer>
|
||||
<id>epbernard</id>
|
||||
<name>Emmanuel Bernard</name>
|
||||
<email>emmanuel@hibernate.org</email>
|
||||
<url>http://in.relation.to/Bloggers/Emmanuel</url>
|
||||
</developer>
|
||||
<developer>
|
||||
<id>hardy.ferentschik</id>
|
||||
<name>Hardy Ferentschik</name>
|
||||
<email>hferents@redhat.com</email>
|
||||
<organization>JBoss, a division of Red Hat</organization>
|
||||
<url>http://in.relation.to/Bloggers/Hardy</url>
|
||||
</developer>
|
||||
<developer>
|
||||
<id>max.andersen@jboss.com</id>
|
||||
<name>Max Andersen</name>
|
||||
<email>max.andersen@redhat.com</email>
|
||||
<url>http://in.relation.to/Bloggers/Max</url>
|
||||
</developer>
|
||||
</developers>
|
||||
|
||||
<build>
|
||||
<defaultGoal>test</defaultGoal>
|
||||
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
</resource>
|
||||
<resource>
|
||||
<directory>src/main/xsd</directory>
|
||||
</resource>
|
||||
</resources>
|
||||
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>2.0.2</version>
|
||||
<configuration>
|
||||
<source>1.6</source>
|
||||
<target>1.6</target>
|
||||
<compilerArgument>-proc:none</compilerArgument>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-antrun-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>process_annotations</id>
|
||||
<phase>process-test-resources</phase>
|
||||
<configuration>
|
||||
<tasks>
|
||||
<property name="build.compiler" value="extJavac"/>
|
||||
<property name="target.dir" value="${project.build.directory}/generated-src/jpamodelgen"/>
|
||||
<mkdir dir="${target.dir}"/>
|
||||
<javac srcdir="${project.build.testSourceDirectory}"
|
||||
destdir="${target.dir}"
|
||||
failonerror="false"
|
||||
excludes="test/**">
|
||||
<compilerarg value="-proc:only"/>
|
||||
<classpath>
|
||||
<path refid="maven.test.classpath"/>
|
||||
</classpath>
|
||||
</javac>
|
||||
</tasks>
|
||||
<testSourceRoot>${project.build.directory}/generated-src/jpamodelgen</testSourceRoot>
|
||||
</configuration>
|
||||
<goals>
|
||||
<goal>run</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>jaxb2-maven-plugin</artifactId>
|
||||
<version>1.2</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>xjc</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<packageName>org.hibernate.jpamodelgen.xml.jaxb</packageName>
|
||||
<outputDirectory>${basedir}/target/generated-sources</outputDirectory>
|
||||
<extension>true</extension>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<inherited>true</inherited>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-source-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-sources</id>
|
||||
<goals>
|
||||
<goal>jar</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<configuration>
|
||||
<suiteXmlFiles>
|
||||
<suiteXmlFile>${basedir}/src/test/suite/unit-tests.xml</suiteXmlFile>
|
||||
</suiteXmlFiles>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-report-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>generate-test-report</id>
|
||||
<phase>test</phase>
|
||||
<goals>
|
||||
<goal>report-only</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<outputDirectory>${project.build.directory}/surefire-reports</outputDirectory>
|
||||
<outputName>test-report</outputName>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>2.2</version>
|
||||
<configuration>
|
||||
<archive>
|
||||
<manifestEntries>
|
||||
<Implementation-Title>${pom.artifactId}</Implementation-Title>
|
||||
<Implementation-Version>${pom.version}</Implementation-Version>
|
||||
<Implementation-Vendor>${pom.groupId}</Implementation-Vendor>
|
||||
<Implementation-Vendor-Id>${pom.groupId}</Implementation-Vendor-Id>
|
||||
<Implementation-URL>${pom.url}</Implementation-URL>
|
||||
<Specification-Title>JPA2 Model Generator</Specification-Title>
|
||||
</manifestEntries>
|
||||
</archive>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-source-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-sources</id>
|
||||
<goals>
|
||||
<goal>jar</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-assembly-plugin</artifactId>
|
||||
<configuration>
|
||||
<descriptors>
|
||||
<descriptor>src/main/assembly/dist.xml</descriptor>
|
||||
</descriptors>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>make-assembly</id>
|
||||
<phase>site</phase>
|
||||
<goals>
|
||||
<goal>assembly</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-release-plugin</artifactId>
|
||||
<version>2.0-beta-9</version>
|
||||
<configuration>
|
||||
<autoVersionSubmodules>true</autoVersionSubmodules>
|
||||
<allowTimestampedSnapshots>true</allowTimestampedSnapshots>
|
||||
<remoteTagging>true</remoteTagging>
|
||||
<goals>package deploy</goals>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
|
||||
<extensions>
|
||||
<!-- scm based deployments (jboss release repo) -->
|
||||
<extension>
|
||||
<groupId>org.apache.maven.wagon</groupId>
|
||||
<artifactId>wagon-scm</artifactId>
|
||||
<version>1.0-beta-6</version>
|
||||
</extension>
|
||||
<extension>
|
||||
<groupId>org.apache.maven.scm</groupId>
|
||||
<artifactId>maven-scm-manager-plexus</artifactId>
|
||||
<version>1.0</version>
|
||||
</extension>
|
||||
<extension>
|
||||
<groupId>org.apache.maven.scm</groupId>
|
||||
<artifactId>maven-scm-provider-svnexe</artifactId>
|
||||
<version>1.0</version>
|
||||
</extension>
|
||||
</extensions>
|
||||
</build>
|
||||
|
||||
<distributionManagement>
|
||||
<repository>
|
||||
<id>repository.jboss.org</id>
|
||||
<name>JBoss Release Repository</name>
|
||||
<url>scm:svn:https://svn.jboss.org/repos/repository.jboss.org/maven2</url>
|
||||
</repository>
|
||||
<snapshotRepository>
|
||||
<id>snapshots.jboss.org</id>
|
||||
<name>JBoss Snapshot Repository</name>
|
||||
<url>dav:https://snapshots.jboss.org/maven2</url>
|
||||
</snapshotRepository>
|
||||
</distributionManagement>
|
||||
|
||||
<reporting>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-project-info-reports-plugin</artifactId>
|
||||
<version>2.0.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<reportSets>
|
||||
<reportSet>
|
||||
<id>html</id>
|
||||
<configuration>
|
||||
<tags>
|
||||
<tag>
|
||||
<name>todo</name>
|
||||
<placement>a</placement>
|
||||
<head>ToDo:</head>
|
||||
</tag>
|
||||
</tags>
|
||||
</configuration>
|
||||
<reports>
|
||||
<report>javadoc</report>
|
||||
</reports>
|
||||
</reportSet>
|
||||
</reportSets>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>jxr-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-clover-plugin</artifactId>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-pmd-plugin</artifactId>
|
||||
<configuration>
|
||||
<targetJdk>1.5</targetJdk>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>taglist-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>changelog-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>changes-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</reporting>
|
||||
</project>
|
|
@ -0,0 +1,65 @@
|
|||
JPA Model Generator
|
||||
|
||||
What is it?
|
||||
-----------
|
||||
|
||||
This is a Java 6 annotation processor generating meta model classes for the JPA 2 criteria queries.
|
||||
The processor (JPAMetaModelEntityProcessor) processes all classes annotated with @Entity, as well as
|
||||
entities mapped in /META-INF/orm.xml and mapping files specified in persistence.xml.
|
||||
|
||||
|
||||
Status
|
||||
------
|
||||
|
||||
This is an alpha release of the annotation processor. The implemented functionality includes:
|
||||
- full support for annotations honoring the access type (v2.0)
|
||||
- support for persistence.xml, orm.xml and <mapping-file>
|
||||
- tests (both via compilation failure and regular assertion failure)
|
||||
|
||||
|
||||
System Requirements
|
||||
-------------------
|
||||
|
||||
JDK 1.6 or above.
|
||||
|
||||
|
||||
Issues
|
||||
------
|
||||
|
||||
See issues.txt
|
||||
|
||||
|
||||
Using JPA Model Generator
|
||||
-------------------------
|
||||
|
||||
- Copy jpamodelgen-*.jar together will all jar files from lib into the classpath of your application.
|
||||
The jpamodelgen jar file contains a service file (/META-INF/services/javax.annotation.processing.Processor)
|
||||
so that the annotation processor will automatically be executed during compilation.
|
||||
You can also explicitly specify the processor using the -processor flag:
|
||||
> javac -cp <myclasspath> -d <target> -sourcepath <sources> -processor org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor
|
||||
|
||||
|
||||
* Maven
|
||||
This distribution contains a pom.xml file showing one of three possible ways to integrate the processor in a maven project.
|
||||
You can just add <processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor> to the maven-compiler-plugin.
|
||||
This approach has, however, the shortcoming that messages from the annotation processor are not displayed. This is a known
|
||||
issue. See also - http://weblogs.java.net/blog/ss141213/archive/2007/11/my_maven_experi.html
|
||||
The second alternative is the maven-annotation-plugin (http://code.google.com/p/maven-annotation-plugin/). This approach
|
||||
hasn't been tested yet.
|
||||
Last but not least, you can use the maven-antrun-plugin to just run the annotation processor and ignore the processor in
|
||||
in the maven-compiler-plugin via '-proc:none'. This is the approach chosen in the POM for this project.
|
||||
|
||||
* Ant
|
||||
Make sure the annotation processor and its dependencies are in the classpath. Due the service file the processor will be
|
||||
automatically executed when the javac task executes.
|
||||
If not try adding <compilerarg value="-processor org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor"/>
|
||||
|
||||
* Idea
|
||||
Again, if in the classpath the JPAMetaModelEntityProcessor should execute automatically. If not add the following under
|
||||
'Compiler->Java Compiler': -target 1.6 -processor org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor
|
||||
You can also turn of annotation processing via: -target 1.6 -proc:none
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!--
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
-->
|
||||
|
||||
<assembly>
|
||||
<id>dist</id>
|
||||
<formats>
|
||||
<format>tar.gz</format>
|
||||
<format>tar.bz2</format>
|
||||
<format>zip</format>
|
||||
</formats>
|
||||
|
||||
<dependencySets>
|
||||
<dependencySet>
|
||||
<useProjectArtifact>false</useProjectArtifact>
|
||||
<outputDirectory>lib</outputDirectory>
|
||||
<scope>runtime</scope>
|
||||
</dependencySet>
|
||||
</dependencySets>
|
||||
|
||||
<files>
|
||||
<file>
|
||||
<source>readme.txt</source>
|
||||
<outputDirectory>/</outputDirectory>
|
||||
<filtered>true</filtered>
|
||||
</file>
|
||||
<file>
|
||||
<source>license.txt</source>
|
||||
<outputDirectory>/</outputDirectory>
|
||||
</file>
|
||||
<file>
|
||||
<source>issues.txt</source>
|
||||
<outputDirectory>/</outputDirectory>
|
||||
</file>
|
||||
</files>
|
||||
|
||||
<fileSets>
|
||||
<fileSet>
|
||||
<directory>target</directory>
|
||||
<outputDirectory/>
|
||||
<excludes>
|
||||
<exclude>*-javadoc.jar</exclude>
|
||||
<exclude>*-sources.jar</exclude>
|
||||
</excludes>
|
||||
<includes>
|
||||
<include>jpamodelgen-*.jar</include>
|
||||
</includes>
|
||||
</fileSet>
|
||||
<fileSet>
|
||||
<directory>target/site/apidocs</directory>
|
||||
<outputDirectory>docs/api</outputDirectory>
|
||||
</fileSet>
|
||||
<fileSet>
|
||||
<directory>.</directory>
|
||||
<outputDirectory/>
|
||||
<useDefaultExcludes>true</useDefaultExcludes>
|
||||
<excludes>
|
||||
<exclude>*.txt</exclude>
|
||||
<exclude>**/target/**</exclude>
|
||||
<exclude>*.iml</exclude>
|
||||
</excludes>
|
||||
</fileSet>
|
||||
</fileSets>
|
||||
|
||||
</assembly>
|
|
@ -0,0 +1,140 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen;
|
||||
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.StringWriter;
|
||||
import java.util.List;
|
||||
import javax.annotation.processing.ProcessingEnvironment;
|
||||
import javax.annotation.processing.FilerException;
|
||||
import javax.annotation.Generated;
|
||||
import javax.tools.FileObject;
|
||||
import javax.tools.Diagnostic;
|
||||
import javax.lang.model.type.TypeMirror;
|
||||
import javax.lang.model.type.TypeKind;
|
||||
import javax.lang.model.type.DeclaredType;
|
||||
import javax.lang.model.element.Element;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
public class ClassWriter {
|
||||
|
||||
public static void writeFile(IMetaEntity entity, ProcessingEnvironment processingEnv, Context context) {
|
||||
try {
|
||||
String metaModelPackage = entity.getPackageName();
|
||||
|
||||
StringBuffer body = generateBody( entity, context );
|
||||
|
||||
FileObject fo = processingEnv.getFiler().createSourceFile(
|
||||
metaModelPackage + "." + entity.getSimpleName() + "_"
|
||||
);
|
||||
OutputStream os = fo.openOutputStream();
|
||||
PrintWriter pw = new PrintWriter( os );
|
||||
|
||||
pw.println( "package " + metaModelPackage + ";" );
|
||||
|
||||
pw.println();
|
||||
|
||||
pw.println( entity.generateImports() );
|
||||
|
||||
pw.println( body );
|
||||
|
||||
pw.flush();
|
||||
pw.close();
|
||||
|
||||
}
|
||||
catch ( FilerException filerEx ) {
|
||||
processingEnv.getMessager().printMessage(
|
||||
Diagnostic.Kind.ERROR,
|
||||
"Problem with Processing Environment Filer: "
|
||||
+ filerEx.getMessage()
|
||||
);
|
||||
}
|
||||
catch ( IOException ioEx ) {
|
||||
processingEnv.getMessager().printMessage(
|
||||
Diagnostic.Kind.ERROR,
|
||||
"Problem opening file to write MetaModel for " + entity.getSimpleName()
|
||||
+ ioEx.getMessage()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate everything after import statements.
|
||||
*
|
||||
* @param entity The meta entity for which to write the body
|
||||
*
|
||||
* @return body content
|
||||
*/
|
||||
private static StringBuffer generateBody(IMetaEntity entity, Context context) {
|
||||
|
||||
StringWriter sw = new StringWriter();
|
||||
PrintWriter pw = null;
|
||||
try {
|
||||
|
||||
pw = new PrintWriter( sw );
|
||||
|
||||
//pw.println( "@" + entity.importType( Generated.class.getName() ) + "(\"JPA MetaModel for " + entity.getQualifiedName() + "\")" );
|
||||
|
||||
pw.println( "@" + entity.importType( "javax.persistence.metamodel.StaticMetamodel" ) + "(" + entity.getSimpleName() + ".class)" );
|
||||
|
||||
|
||||
|
||||
printClassDeclaration( entity, pw, context );
|
||||
|
||||
pw.println();
|
||||
|
||||
List<IMetaAttribute> members = entity.getMembers();
|
||||
|
||||
for ( IMetaAttribute metaMember : members ) {
|
||||
pw.println( " " + metaMember.getDeclarationString() );
|
||||
}
|
||||
pw.println();
|
||||
pw.println( "}" );
|
||||
return sw.getBuffer();
|
||||
}
|
||||
finally {
|
||||
if ( pw != null ) {
|
||||
pw.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void printClassDeclaration(IMetaEntity entity, PrintWriter pw, Context context) {
|
||||
pw.print( "public abstract class " + entity.getSimpleName() + "_" );
|
||||
|
||||
final TypeMirror superClass = entity.getTypeElement().getSuperclass();
|
||||
//superclass of Object is of NoType which returns some other kind
|
||||
String superclassDeclaration = "";
|
||||
if (superClass.getKind() == TypeKind.DECLARED ) {
|
||||
//F..king Ch...t Have those people used their horrible APIs even once?
|
||||
final Element superClassElement = ( ( DeclaredType ) superClass ).asElement();
|
||||
String superClassName = ( ( TypeElement ) superClassElement ).getQualifiedName().toString();
|
||||
if ( context.getMetaEntitiesToProcess().containsKey( superClassName )
|
||||
|| context.getMetaSuperclassAndEmbeddableToProcess().containsKey( superClassName ) ) {
|
||||
pw.print( " extends " + superClassName + "_" );
|
||||
}
|
||||
}
|
||||
|
||||
pw.println( " {" );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,104 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
import java.util.Set;
|
||||
import java.util.HashSet;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
import javax.persistence.AccessType;
|
||||
import javax.annotation.processing.ProcessingEnvironment;
|
||||
import javax.tools.Diagnostic;
|
||||
|
||||
import org.hibernate.jpamodelgen.annotation.MetaEntity;
|
||||
|
||||
/**
|
||||
* @author Max Andersen
|
||||
* @author Hardy Ferentschik
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
public class Context {
|
||||
//used to cache access types
|
||||
private Map<TypeElement, AccessTypeHolder> accessTypes = new HashMap<TypeElement, AccessTypeHolder>();
|
||||
private Set<String> elementsAlreadyProcessed = new HashSet<String>();
|
||||
private ProcessingEnvironment pe;
|
||||
private final Map<String, IMetaEntity> metaEntitiesToProcess = new HashMap<String, IMetaEntity>();
|
||||
private final Map<String, IMetaEntity> metaSuperclassAndEmbeddableToProcess = new HashMap<String, IMetaEntity>();
|
||||
|
||||
private static class AccessTypeHolder {
|
||||
public AccessType elementAccessType;
|
||||
public AccessType hierarchyAccessType;
|
||||
}
|
||||
|
||||
public Context(ProcessingEnvironment pe) {
|
||||
this.pe = pe;
|
||||
}
|
||||
|
||||
public Map<String, IMetaEntity> getMetaEntitiesToProcess() {
|
||||
return metaEntitiesToProcess;
|
||||
}
|
||||
|
||||
public Map<String, IMetaEntity> getMetaSuperclassAndEmbeddableToProcess() {
|
||||
return metaSuperclassAndEmbeddableToProcess;
|
||||
}
|
||||
|
||||
public void addAccessType(TypeElement element, AccessType accessType) {
|
||||
AccessTypeHolder typeHolder = accessTypes.get( element );
|
||||
if ( typeHolder == null ) {
|
||||
typeHolder = new AccessTypeHolder();
|
||||
accessTypes.put( element, typeHolder );
|
||||
}
|
||||
typeHolder.elementAccessType = accessType;
|
||||
}
|
||||
|
||||
public void addAccessTypeForHierarchy(TypeElement element, AccessType accessType) {
|
||||
AccessTypeHolder typeHolder = accessTypes.get( element );
|
||||
if ( typeHolder == null ) {
|
||||
typeHolder = new AccessTypeHolder();
|
||||
accessTypes.put( element, typeHolder );
|
||||
}
|
||||
typeHolder.hierarchyAccessType = accessType;
|
||||
}
|
||||
|
||||
public AccessType getAccessType(TypeElement element) {
|
||||
final AccessTypeHolder typeHolder = accessTypes.get( element );
|
||||
return typeHolder != null ? typeHolder.elementAccessType : null;
|
||||
}
|
||||
|
||||
public AccessType getDefaultAccessTypeForHerarchy(TypeElement element) {
|
||||
final AccessTypeHolder typeHolder = accessTypes.get( element );
|
||||
return typeHolder != null ? typeHolder.hierarchyAccessType : null;
|
||||
}
|
||||
|
||||
public Set<String> getElementsAlreadyProcessed() {
|
||||
return elementsAlreadyProcessed;
|
||||
}
|
||||
|
||||
//only process Embeddable or Superclass
|
||||
//does not work for Entity (risk of circularity)
|
||||
public void processElement(TypeElement element, AccessType defaultAccessTypeForHierarchy) {
|
||||
if ( elementsAlreadyProcessed.contains( element.getQualifiedName().toString() ) ) {
|
||||
pe.getMessager().printMessage( Diagnostic.Kind.WARNING, "Element already processed (ignoring): " + element );
|
||||
return;
|
||||
}
|
||||
|
||||
ClassWriter.writeFile( new MetaEntity( pe, element, this, defaultAccessTypeForHierarchy ), pe, this );
|
||||
elementsAlreadyProcessed.add( element.getQualifiedName().toString() );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen;
|
||||
|
||||
/**
|
||||
* @author Hardy Ferentschik
|
||||
*/
|
||||
public interface IMetaAttribute {
|
||||
String getDeclarationString();
|
||||
|
||||
String getMetaType();
|
||||
|
||||
String getPropertyName();
|
||||
|
||||
String getTypeDeclaration();
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen;
|
||||
|
||||
import org.hibernate.jpamodelgen.IMetaAttribute;
|
||||
|
||||
/**
|
||||
* @author Hardy Ferentschik
|
||||
*/
|
||||
public interface IMetaCollection extends IMetaAttribute {
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen;
|
||||
|
||||
import javax.lang.model.element.Name;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Hardy Ferentschik
|
||||
*/
|
||||
public interface IMetaEntity extends ImportContext {
|
||||
String getSimpleName();
|
||||
|
||||
String getQualifiedName();
|
||||
|
||||
String getPackageName();
|
||||
|
||||
List<IMetaAttribute> getMembers();
|
||||
|
||||
String generateImports();
|
||||
|
||||
String importType(String fqcn);
|
||||
|
||||
String staticImport(String fqcn, String member);
|
||||
|
||||
String importType(Name qualifiedName);
|
||||
|
||||
TypeElement getTypeElement();
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen;
|
||||
|
||||
/**
|
||||
* @author Hardy Ferentschik
|
||||
*/
|
||||
public interface IMetaSingleAttribute extends IMetaAttribute {
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Max Andersen
|
||||
* @author Hardy Ferentschik
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
public interface ImportContext {
|
||||
|
||||
/**
|
||||
* Add fqcn to the import list. Returns fqcn as needed in source code.
|
||||
* Attempts to handle fqcn with array and generics references.
|
||||
* <p/>
|
||||
* e.g.
|
||||
* java.util.Collection<org.marvel.Hulk> imports java.util.Collection and returns Collection
|
||||
* org.marvel.Hulk[] imports org.marvel.Hulk and returns Hulk
|
||||
*
|
||||
* @param fqcn Fully qualified class name of the type to import.
|
||||
*
|
||||
* @return import string
|
||||
*/
|
||||
public abstract String importType(String fqcn);
|
||||
|
||||
public abstract String staticImport(String fqcn, String member);
|
||||
|
||||
public abstract String generateImports();
|
||||
|
||||
}
|
|
@ -0,0 +1,184 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Max Andersen
|
||||
* @author Hardy Ferentschik
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
public class ImportContextImpl implements ImportContext {
|
||||
|
||||
Set<String> imports = new TreeSet<String>();
|
||||
Set<String> staticImports = new TreeSet<String>();
|
||||
Map<String, String> simpleNames = new HashMap<String, String>();
|
||||
|
||||
String basePackage = "";
|
||||
|
||||
private static final Map<String, String> PRIMITIVES = new HashMap<String, String>();
|
||||
static {
|
||||
PRIMITIVES.put( "char", "Character" );
|
||||
|
||||
PRIMITIVES.put( "byte", "Byte" );
|
||||
PRIMITIVES.put( "short", "Short" );
|
||||
PRIMITIVES.put( "int", "Integer" );
|
||||
PRIMITIVES.put( "long", "Long" );
|
||||
|
||||
PRIMITIVES.put( "boolean", "Boolean" );
|
||||
|
||||
PRIMITIVES.put( "float", "Float" );
|
||||
PRIMITIVES.put( "double", "Double" );
|
||||
|
||||
}
|
||||
|
||||
public ImportContextImpl(String basePackage) {
|
||||
this.basePackage = basePackage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add fqcn to the import list. Returns fqcn as needed in source code.
|
||||
* Attempts to handle fqcn with array and generics references.
|
||||
*
|
||||
* e.g.
|
||||
* java.util.Collection<org.marvel.Hulk> imports java.util.Collection and returns Collection
|
||||
* org.marvel.Hulk[] imports org.marvel.Hulk and returns Hulk
|
||||
*
|
||||
*
|
||||
* @param fqcn
|
||||
* @return import string
|
||||
*/
|
||||
public String importType(String fqcn) {
|
||||
String result = fqcn;
|
||||
|
||||
//if(fqcn==null) return "/** (null) **/";
|
||||
|
||||
String additionalTypePart = null;
|
||||
if(fqcn.indexOf('<')>=0) {
|
||||
additionalTypePart = result.substring(fqcn.indexOf('<'));
|
||||
result = result.substring(0,fqcn.indexOf('<'));
|
||||
fqcn = result;
|
||||
} else if(fqcn.indexOf('[')>=0) {
|
||||
additionalTypePart = result.substring(fqcn.indexOf('['));
|
||||
result = result.substring(0,fqcn.indexOf('['));
|
||||
fqcn = result;
|
||||
}
|
||||
|
||||
String pureFqcn = fqcn.replace( '$', '.' );
|
||||
|
||||
boolean canBeSimple = true;
|
||||
|
||||
|
||||
String simpleName = unqualify(fqcn);
|
||||
if(simpleNames.containsKey(simpleName)) {
|
||||
String existingFqcn = simpleNames.get(simpleName);
|
||||
if(existingFqcn.equals(pureFqcn)) {
|
||||
canBeSimple = true;
|
||||
} else {
|
||||
canBeSimple = false;
|
||||
}
|
||||
} else {
|
||||
canBeSimple = true;
|
||||
simpleNames.put(simpleName, pureFqcn);
|
||||
imports.add( pureFqcn );
|
||||
}
|
||||
|
||||
|
||||
if ( inSamePackage(fqcn) || (imports.contains( pureFqcn ) && canBeSimple) ) {
|
||||
result = unqualify( result ); // dequalify
|
||||
} else if ( inJavaLang( fqcn ) ) {
|
||||
result = result.substring( "java.lang.".length() );
|
||||
}
|
||||
|
||||
if(additionalTypePart!=null) {
|
||||
result = result + additionalTypePart;
|
||||
}
|
||||
|
||||
result = result.replace( '$', '.' );
|
||||
return result;
|
||||
}
|
||||
|
||||
public String staticImport(String fqcn, String member) {
|
||||
String local = fqcn + "." + member;
|
||||
imports.add(local);
|
||||
staticImports.add(local);
|
||||
|
||||
if(member.equals("*")) {
|
||||
return "";
|
||||
} else {
|
||||
return member;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean inDefaultPackage(String className) {
|
||||
return className.indexOf( "." ) < 0;
|
||||
}
|
||||
|
||||
private boolean isPrimitive(String className) {
|
||||
return PRIMITIVES.containsKey( className );
|
||||
}
|
||||
|
||||
private boolean inSamePackage(String className) {
|
||||
String other = qualifier( className );
|
||||
return other == basePackage
|
||||
|| (other != null && other.equals( basePackage ) );
|
||||
}
|
||||
|
||||
private boolean inJavaLang(String className) {
|
||||
return "java.lang".equals( qualifier( className ) );
|
||||
}
|
||||
|
||||
public String generateImports() {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
|
||||
for ( Iterator<String> imps = imports.iterator(); imps.hasNext(); ) {
|
||||
String next = imps.next();
|
||||
if(isPrimitive(next) || inDefaultPackage(next) || inJavaLang(next) || inSamePackage(next)) {
|
||||
// dont add automatically "imported" stuff
|
||||
} else {
|
||||
if(staticImports.contains(next)) {
|
||||
buf.append("import static " + next + ";\r\n");
|
||||
} else {
|
||||
buf.append("import " + next + ";\r\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(buf.indexOf( "$" )>=0) {
|
||||
return buf.toString();
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public static String unqualify(String qualifiedName) {
|
||||
int loc = qualifiedName.lastIndexOf(".");
|
||||
return ( loc < 0 ) ? qualifiedName : qualifiedName.substring( qualifiedName.lastIndexOf(".") + 1 );
|
||||
}
|
||||
|
||||
public static String qualifier(String qualifiedName) {
|
||||
int loc = qualifiedName.lastIndexOf(".");
|
||||
return ( loc < 0 ) ? "" : qualifiedName.substring( 0, loc );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,443 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import javax.annotation.processing.AbstractProcessor;
|
||||
import javax.annotation.processing.ProcessingEnvironment;
|
||||
import javax.annotation.processing.RoundEnvironment;
|
||||
import javax.annotation.processing.SupportedAnnotationTypes;
|
||||
import javax.annotation.processing.SupportedSourceVersion;
|
||||
import static javax.lang.model.SourceVersion.RELEASE_6;
|
||||
import javax.lang.model.element.AnnotationMirror;
|
||||
import javax.lang.model.element.Element;
|
||||
import javax.lang.model.element.ElementKind;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
import javax.lang.model.util.Elements;
|
||||
import javax.persistence.AccessType;
|
||||
import javax.persistence.Embeddable;
|
||||
import javax.persistence.MappedSuperclass;
|
||||
import javax.tools.Diagnostic;
|
||||
import javax.tools.FileObject;
|
||||
import javax.tools.StandardLocation;
|
||||
import javax.xml.bind.JAXBContext;
|
||||
import javax.xml.bind.JAXBException;
|
||||
import javax.xml.bind.Unmarshaller;
|
||||
import javax.xml.validation.Schema;
|
||||
import javax.xml.validation.SchemaFactory;
|
||||
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import org.hibernate.jpamodelgen.annotation.MetaEntity;
|
||||
import org.hibernate.jpamodelgen.xml.XmlMetaEntity;
|
||||
import org.hibernate.jpamodelgen.xml.jaxb.Entity;
|
||||
import org.hibernate.jpamodelgen.xml.jaxb.EntityMappings;
|
||||
import org.hibernate.jpamodelgen.xml.jaxb.ObjectFactory;
|
||||
import org.hibernate.jpamodelgen.xml.jaxb.Persistence;
|
||||
import org.hibernate.jpamodelgen.xml.jaxb.PersistenceUnitDefaults;
|
||||
import org.hibernate.jpamodelgen.xml.jaxb.PersistenceUnitMetadata;
|
||||
|
||||
/**
|
||||
* Main annotation processor.
|
||||
*
|
||||
* @author Max Andersen
|
||||
* @author Hardy Ferentschik
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
//@SupportedAnnotationTypes("javax.persistence.Entity")
|
||||
@SupportedAnnotationTypes("*")
|
||||
@SupportedSourceVersion(RELEASE_6)
|
||||
// TODO Extract all the XML parsing into a separate class
|
||||
public class JPAMetaModelEntityProcessor extends AbstractProcessor {
|
||||
|
||||
private static final String PATH_SEPARATOR = "/";
|
||||
private static final String PERSISTENCE_XML = "/META-INF/persistence.xml";
|
||||
private static final String ORM_XML = "/META-INF/orm.xml";
|
||||
private static final Boolean ALLOW_OTHER_PROCESSORS_TO_CLAIM_ANNOTATIONS = Boolean.FALSE;
|
||||
private static final String ENTITY_ANN = javax.persistence.Entity.class.getName();
|
||||
private static final String MAPPED_SUPERCLASS_ANN = MappedSuperclass.class.getName();
|
||||
private static final String EMBEDDABLE_ANN = Embeddable.class.getName();
|
||||
private static final AccessType DEFAULT_XML_ACCESS_TYPE = AccessType.PROPERTY;
|
||||
private static final String PERSISTENCE_XML_XSD = "persistence_2_0.xsd";
|
||||
private static final String ORM_XSD = "orm_2_0.xsd";
|
||||
|
||||
private boolean xmlProcessed = false;
|
||||
private Context context;
|
||||
|
||||
public void init(ProcessingEnvironment env) {
|
||||
super.init( env );
|
||||
context = new Context( env );
|
||||
processingEnv.getMessager().printMessage( Diagnostic.Kind.NOTE, "Init Processor " + this );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean process(final Set<? extends TypeElement> annotations,
|
||||
final RoundEnvironment roundEnvironment) {
|
||||
|
||||
if ( roundEnvironment.processingOver() ) {
|
||||
processingEnv.getMessager()
|
||||
.printMessage( Diagnostic.Kind.NOTE, "Last processing round." );
|
||||
|
||||
createMetaModelClasses();
|
||||
|
||||
processingEnv.getMessager()
|
||||
.printMessage( Diagnostic.Kind.NOTE, "Finished processing" );
|
||||
return ALLOW_OTHER_PROCESSORS_TO_CLAIM_ANNOTATIONS;
|
||||
}
|
||||
|
||||
if ( !xmlProcessed ) {
|
||||
parsePersistenceXml();
|
||||
}
|
||||
|
||||
if ( !hostJPAAnnotations( annotations ) ) {
|
||||
processingEnv.getMessager()
|
||||
.printMessage( Diagnostic.Kind.NOTE, "Current processing round does not contain entities" );
|
||||
return ALLOW_OTHER_PROCESSORS_TO_CLAIM_ANNOTATIONS;
|
||||
}
|
||||
|
||||
Set<? extends Element> elements = roundEnvironment.getRootElements();
|
||||
for ( Element element : elements ) {
|
||||
processingEnv.getMessager().printMessage( Diagnostic.Kind.NOTE, "Processing " + element.toString() );
|
||||
handleRootElementAnnotationMirrors( element );
|
||||
}
|
||||
|
||||
return ALLOW_OTHER_PROCESSORS_TO_CLAIM_ANNOTATIONS;
|
||||
}
|
||||
|
||||
private void createMetaModelClasses() {
|
||||
for ( IMetaEntity entity : context.getMetaEntitiesToProcess().values() ) {
|
||||
processingEnv.getMessager()
|
||||
.printMessage( Diagnostic.Kind.NOTE, "Writing meta model for " + entity );
|
||||
ClassWriter.writeFile( entity, processingEnv, context );
|
||||
}
|
||||
|
||||
//process left over, in most cases is empty
|
||||
for ( String className : context.getElementsAlreadyProcessed() ) {
|
||||
context.getMetaSuperclassAndEmbeddableToProcess().remove( className );
|
||||
}
|
||||
|
||||
for ( IMetaEntity entity : context.getMetaSuperclassAndEmbeddableToProcess().values() ) {
|
||||
processingEnv.getMessager()
|
||||
.printMessage( Diagnostic.Kind.NOTE, "Writing meta model for " + entity );
|
||||
ClassWriter.writeFile( entity, processingEnv, context );
|
||||
}
|
||||
}
|
||||
|
||||
private boolean hostJPAAnnotations(Set<? extends TypeElement> annotations) {
|
||||
for ( TypeElement type : annotations ) {
|
||||
final String typeName = type.getQualifiedName().toString();
|
||||
if ( typeName.equals( ENTITY_ANN ) ) {
|
||||
return true;
|
||||
}
|
||||
else if ( typeName.equals( EMBEDDABLE_ANN ) ) {
|
||||
return true;
|
||||
}
|
||||
else if ( typeName.equals( MAPPED_SUPERCLASS_ANN ) ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void parsePersistenceXml() {
|
||||
Persistence persistence = parseXml( PERSISTENCE_XML, Persistence.class, PERSISTENCE_XML_XSD );
|
||||
if ( persistence != null )
|
||||
{
|
||||
List<Persistence.PersistenceUnit> persistenceUnits = persistence.getPersistenceUnit();
|
||||
for ( Persistence.PersistenceUnit unit : persistenceUnits ) {
|
||||
List<String> mappingFiles = unit.getMappingFile();
|
||||
for ( String mappingFile : mappingFiles ) {
|
||||
parsingOrmXml( mappingFile );
|
||||
}
|
||||
}
|
||||
}
|
||||
parsingOrmXml( ORM_XML ); // /META-INF/orm.xml is implicit
|
||||
xmlProcessed = true;
|
||||
}
|
||||
|
||||
private void parsingOrmXml(String resource) {
|
||||
EntityMappings mappings = parseXml( resource, EntityMappings.class, ORM_XSD );
|
||||
if ( mappings == null ) {
|
||||
return;
|
||||
}
|
||||
|
||||
AccessType accessType = determineGlobalAccessType( mappings );
|
||||
|
||||
parseEntities( mappings, accessType );
|
||||
parseEmbeddable( mappings, accessType );
|
||||
parseMappedSuperClass( mappings, accessType );
|
||||
}
|
||||
|
||||
private AccessType determineGlobalAccessType(EntityMappings mappings) {
|
||||
AccessType accessType = DEFAULT_XML_ACCESS_TYPE;
|
||||
|
||||
if ( mappings.getAccess() != null ) {
|
||||
accessType = mapXmlAccessTypeToJpaAccessType( mappings.getAccess() );
|
||||
return accessType; // no need to check persistence unit default
|
||||
}
|
||||
|
||||
PersistenceUnitMetadata meta = mappings.getPersistenceUnitMetadata();
|
||||
if ( meta != null ) {
|
||||
PersistenceUnitDefaults persistenceUnitDefaults = meta.getPersistenceUnitDefaults();
|
||||
if ( persistenceUnitDefaults != null ) {
|
||||
org.hibernate.jpamodelgen.xml.jaxb.AccessType xmlAccessType = persistenceUnitDefaults.getAccess();
|
||||
if ( xmlAccessType != null ) {
|
||||
accessType = mapXmlAccessTypeToJpaAccessType( xmlAccessType );
|
||||
}
|
||||
}
|
||||
}
|
||||
return accessType;
|
||||
}
|
||||
|
||||
private AccessType mapXmlAccessTypeToJpaAccessType(org.hibernate.jpamodelgen.xml.jaxb.AccessType xmlAccessType) {
|
||||
switch ( xmlAccessType ) {
|
||||
case FIELD: {
|
||||
return AccessType.FIELD;
|
||||
}
|
||||
case PROPERTY: {
|
||||
return AccessType.PROPERTY;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void parseEntities(EntityMappings mappings, AccessType accessType) {
|
||||
String packageName = mappings.getPackage();
|
||||
Collection<Entity> entities = mappings.getEntity();
|
||||
for ( Entity entity : entities ) {
|
||||
String fullyQualifiedClassName = packageName + "." + entity.getClazz();
|
||||
|
||||
if ( !xmlMappedTypeExists( fullyQualifiedClassName ) ) {
|
||||
processingEnv.getMessager().printMessage(
|
||||
Diagnostic.Kind.WARNING,
|
||||
fullyQualifiedClassName + " is mapped in xml, but class does not exists. Skipping meta model generation."
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
XmlMetaEntity metaEntity = new XmlMetaEntity(
|
||||
entity, packageName, getXmlMappedType( fullyQualifiedClassName )
|
||||
);
|
||||
|
||||
if ( context.getMetaEntitiesToProcess().containsKey( fullyQualifiedClassName ) ) {
|
||||
processingEnv.getMessager().printMessage(
|
||||
Diagnostic.Kind.WARNING,
|
||||
fullyQualifiedClassName + " was already processed once. Skipping second occurance."
|
||||
);
|
||||
}
|
||||
context.getMetaEntitiesToProcess().put( fullyQualifiedClassName, metaEntity );
|
||||
}
|
||||
}
|
||||
|
||||
private boolean xmlMappedTypeExists(String fullyQualifiedClassName) {
|
||||
Elements utils = processingEnv.getElementUtils();
|
||||
return utils.getTypeElement( fullyQualifiedClassName ) != null;
|
||||
}
|
||||
|
||||
private TypeElement getXmlMappedType(String fullyQualifiedClassName) {
|
||||
Elements utils = processingEnv.getElementUtils();
|
||||
return utils.getTypeElement( fullyQualifiedClassName );
|
||||
}
|
||||
|
||||
private void parseEmbeddable(EntityMappings mappings, AccessType accessType) {
|
||||
String packageName = mappings.getPackage();
|
||||
Collection<org.hibernate.jpamodelgen.xml.jaxb.Embeddable> embeddables = mappings.getEmbeddable();
|
||||
for ( org.hibernate.jpamodelgen.xml.jaxb.Embeddable embeddable : embeddables ) {
|
||||
String fullyQualifiedClassName = packageName + "." + embeddable.getClazz();
|
||||
|
||||
if ( !xmlMappedTypeExists( fullyQualifiedClassName ) ) {
|
||||
processingEnv.getMessager().printMessage(
|
||||
Diagnostic.Kind.WARNING,
|
||||
fullyQualifiedClassName + " is mapped in xml, but class does not exists. Skipping meta model generation."
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
XmlMetaEntity metaEntity = new XmlMetaEntity(
|
||||
embeddable, packageName, getXmlMappedType( fullyQualifiedClassName )
|
||||
);
|
||||
|
||||
if ( context.getMetaSuperclassAndEmbeddableToProcess().containsKey( fullyQualifiedClassName ) ) {
|
||||
processingEnv.getMessager().printMessage(
|
||||
Diagnostic.Kind.WARNING,
|
||||
fullyQualifiedClassName + " was already processed once. Skipping second occurance."
|
||||
);
|
||||
}
|
||||
context.getMetaSuperclassAndEmbeddableToProcess().put( fullyQualifiedClassName, metaEntity );
|
||||
}
|
||||
}
|
||||
|
||||
private void parseMappedSuperClass(EntityMappings mappings, AccessType accessType) {
|
||||
String packageName = mappings.getPackage();
|
||||
Collection<org.hibernate.jpamodelgen.xml.jaxb.MappedSuperclass> mappedSuperClasses = mappings.getMappedSuperclass();
|
||||
for ( org.hibernate.jpamodelgen.xml.jaxb.MappedSuperclass mappedSuperClass : mappedSuperClasses ) {
|
||||
String fullyQualifiedClassName = packageName + "." + mappedSuperClass.getClazz();
|
||||
|
||||
if ( !xmlMappedTypeExists( fullyQualifiedClassName ) ) {
|
||||
processingEnv.getMessager().printMessage(
|
||||
Diagnostic.Kind.WARNING,
|
||||
fullyQualifiedClassName + " is mapped in xml, but class does not exists. Skipping meta model generation."
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
XmlMetaEntity metaEntity = new XmlMetaEntity(
|
||||
mappedSuperClass, packageName, getXmlMappedType( fullyQualifiedClassName )
|
||||
);
|
||||
|
||||
if ( context.getMetaSuperclassAndEmbeddableToProcess().containsKey( fullyQualifiedClassName ) ) {
|
||||
processingEnv.getMessager().printMessage(
|
||||
Diagnostic.Kind.WARNING,
|
||||
fullyQualifiedClassName + " was already processed once. Skipping second occurance."
|
||||
);
|
||||
}
|
||||
context.getMetaSuperclassAndEmbeddableToProcess().put( fullyQualifiedClassName, metaEntity );
|
||||
}
|
||||
}
|
||||
|
||||
private void handleRootElementAnnotationMirrors(final Element element) {
|
||||
|
||||
List<? extends AnnotationMirror> annotationMirrors = element
|
||||
.getAnnotationMirrors();
|
||||
|
||||
for ( AnnotationMirror mirror : annotationMirrors ) {
|
||||
final String annotationType = mirror.getAnnotationType().toString();
|
||||
|
||||
if ( element.getKind() == ElementKind.CLASS ) {
|
||||
if ( annotationType.equals( ENTITY_ANN ) ) {
|
||||
MetaEntity metaEntity = new MetaEntity( processingEnv, ( TypeElement ) element, context );
|
||||
// TODO instead of just adding the entity we have to do some merging.
|
||||
context.getMetaEntitiesToProcess().put( metaEntity.getQualifiedName(), metaEntity );
|
||||
}
|
||||
else if ( annotationType.equals( MAPPED_SUPERCLASS_ANN )
|
||||
|| annotationType.equals( EMBEDDABLE_ANN ) ) {
|
||||
MetaEntity metaEntity = new MetaEntity( processingEnv, ( TypeElement ) element, context );
|
||||
|
||||
// TODO instead of just adding the entity we have to do some merging.
|
||||
context.getMetaSuperclassAndEmbeddableToProcess().put( metaEntity.getQualifiedName(), metaEntity );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private InputStream getInputStreamForResource(String resource) {
|
||||
String pkg = getPackage( resource );
|
||||
String name = getRelativeName( resource );
|
||||
processingEnv.getMessager()
|
||||
.printMessage( Diagnostic.Kind.NOTE, "Reading resource " + resource );
|
||||
InputStream ormStream;
|
||||
try {
|
||||
FileObject fileObject = processingEnv.getFiler().getResource( StandardLocation.CLASS_OUTPUT, pkg, name );
|
||||
ormStream = fileObject.openInputStream();
|
||||
}
|
||||
catch ( IOException e1 ) {
|
||||
processingEnv.getMessager()
|
||||
.printMessage(
|
||||
Diagnostic.Kind.WARNING,
|
||||
"Could not load " + resource + " using processingEnv.getFiler().getResource(). Using classpath..."
|
||||
);
|
||||
|
||||
// TODO
|
||||
// unfortunately, the Filer.getResource API seems not to be able to load from /META-INF. One gets a
|
||||
// FilerException with the message with "Illegal name /META-INF". This means that we have to revert to
|
||||
// using the classpath. This might mean that we find a persistence.xml which is 'part of another jar.
|
||||
// Not sure what else we can do here
|
||||
ormStream = this.getClass().getResourceAsStream( resource );
|
||||
}
|
||||
return ormStream;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tries to open the specified xml file and return an instance of the specified class using JAXB.
|
||||
*
|
||||
* @param resource the xml file name
|
||||
* @param clazz The type of jaxb node to return
|
||||
* @param schemaName The schema to validate against (can be {@code null});
|
||||
*
|
||||
* @return The top level jaxb instance contained in the xml file or {@code null} in case the file could not be found.
|
||||
*/
|
||||
private <T> T parseXml(String resource, Class<T> clazz, String schemaName) {
|
||||
|
||||
InputStream stream = getInputStreamForResource( resource );
|
||||
|
||||
if ( stream == null ) {
|
||||
processingEnv.getMessager().printMessage( Diagnostic.Kind.NOTE, resource + " not found." );
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
JAXBContext jc = JAXBContext.newInstance( ObjectFactory.class );
|
||||
Unmarshaller unmarshaller = jc.createUnmarshaller();
|
||||
if ( schemaName != null ) {
|
||||
unmarshaller.setSchema( getSchema( schemaName ) );
|
||||
}
|
||||
return clazz.cast( unmarshaller.unmarshal( stream ) );
|
||||
}
|
||||
catch ( JAXBException e ) {
|
||||
String message = "Error unmarshalling " + resource + " with exception :\n " + e;
|
||||
processingEnv.getMessager().printMessage( Diagnostic.Kind.WARNING, message );
|
||||
return null;
|
||||
}
|
||||
catch ( Exception e ) {
|
||||
String message = "Error reading " + resource + " with exception :\n " + e;
|
||||
processingEnv.getMessager().printMessage( Diagnostic.Kind.WARNING, message );
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private String getPackage(String resourceName) {
|
||||
if ( !resourceName.contains( PATH_SEPARATOR ) ) {
|
||||
return "";
|
||||
}
|
||||
else {
|
||||
return resourceName.substring( 0, resourceName.lastIndexOf( PATH_SEPARATOR ) );
|
||||
}
|
||||
}
|
||||
|
||||
private String getRelativeName(String resourceName) {
|
||||
if ( !resourceName.contains( PATH_SEPARATOR ) ) {
|
||||
return resourceName;
|
||||
}
|
||||
else {
|
||||
return resourceName.substring( resourceName.lastIndexOf( PATH_SEPARATOR ) + 1 );
|
||||
}
|
||||
}
|
||||
|
||||
private Schema getSchema(String schemaName) {
|
||||
Schema schema = null;
|
||||
URL schemaUrl = this.getClass().getClassLoader().getResource( schemaName );
|
||||
if ( schemaUrl == null ) {
|
||||
return schema;
|
||||
}
|
||||
|
||||
SchemaFactory sf = SchemaFactory.newInstance( javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI );
|
||||
try {
|
||||
schema = sf.newSchema( schemaUrl );
|
||||
}
|
||||
catch ( SAXException e ) {
|
||||
processingEnv.getMessager().printMessage(
|
||||
Diagnostic.Kind.WARNING, "Unable to create schema for " + schemaName + ": " + e.getMessage()
|
||||
);
|
||||
}
|
||||
return schema;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,75 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.lang.model.type.TypeMirror;
|
||||
import javax.lang.model.type.TypeKind;
|
||||
import javax.lang.model.type.DeclaredType;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
import javax.lang.model.element.Element;
|
||||
|
||||
/**
|
||||
* Utility class.
|
||||
*
|
||||
* @author Max Andersen
|
||||
* @author Hardy Ferentschik
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
public class TypeUtils {
|
||||
|
||||
private static final Map<String, String> PRIMITIVES = new HashMap<String, String>();
|
||||
static {
|
||||
PRIMITIVES.put( "char", "Character" );
|
||||
|
||||
PRIMITIVES.put( "byte", "Byte" );
|
||||
PRIMITIVES.put( "short", "Short" );
|
||||
PRIMITIVES.put( "int", "Integer" );
|
||||
PRIMITIVES.put( "long", "Long" );
|
||||
|
||||
PRIMITIVES.put( "boolean", "Boolean" );
|
||||
|
||||
PRIMITIVES.put( "float", "Float" );
|
||||
PRIMITIVES.put( "double", "Double" );
|
||||
|
||||
}
|
||||
|
||||
static public String toTypeString(TypeMirror type) {
|
||||
if(type.getKind().isPrimitive()) {
|
||||
return PRIMITIVES.get(type.toString());
|
||||
}
|
||||
|
||||
return type.toString();
|
||||
}
|
||||
|
||||
static public TypeElement getSuperclass(TypeElement element) {
|
||||
final TypeMirror superClass = element.getSuperclass();
|
||||
//superclass of Object is of NoType which returns some other kind
|
||||
String superclassDeclaration = "";
|
||||
if (superClass.getKind() == TypeKind.DECLARED ) {
|
||||
//F..king Ch...t Have those people used their horrible APIs even once?
|
||||
final Element superClassElement = ( ( DeclaredType ) superClass ).asElement();
|
||||
return ( TypeElement ) superClassElement;
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen.annotation;
|
||||
|
||||
import org.hibernate.jpamodelgen.IMetaAttribute;
|
||||
|
||||
import java.beans.Introspector;
|
||||
|
||||
import javax.annotation.processing.ProcessingEnvironment;
|
||||
import javax.lang.model.element.Element;
|
||||
import javax.lang.model.element.ElementKind;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Max Andersen
|
||||
* @author Hardy Ferentschik
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
public abstract class MetaAttribute implements IMetaAttribute {
|
||||
|
||||
final protected Element element;
|
||||
final protected MetaEntity parent;
|
||||
final protected ProcessingEnvironment pe;
|
||||
private final String type;
|
||||
|
||||
public MetaAttribute(MetaEntity parent, Element element, String type) {
|
||||
this.element = element;
|
||||
this.parent = parent;
|
||||
this.type = type;
|
||||
this.pe = parent.pe;
|
||||
}
|
||||
|
||||
public String getDeclarationString() {
|
||||
return "public static volatile " + parent.importType(getMetaType()) + "<" + parent.importType(parent.getQualifiedName()) + ", " + parent.importType(getTypeDeclaration()) + "> " + getPropertyName() + ";";
|
||||
}
|
||||
|
||||
public String getPropertyName() {
|
||||
if(element.getKind()==ElementKind.FIELD) {
|
||||
return element.getSimpleName().toString();
|
||||
} else if (element.getKind()==ElementKind.METHOD) {
|
||||
|
||||
String name = element.getSimpleName().toString();
|
||||
if(name.startsWith("get")) {
|
||||
return pe.getElementUtils().getName(Introspector.decapitalize(name.substring("get".length()))).toString();
|
||||
} else if(name.startsWith("is")) {
|
||||
return (pe.getElementUtils().getName(Introspector.decapitalize(name.substring("is".length())))).toString();
|
||||
}
|
||||
return pe.getElementUtils().getName(Introspector.decapitalize(name)).toString();
|
||||
} else {
|
||||
return pe.getElementUtils().getName(element.getSimpleName() + "/* " + element.getKind() + " */").toString();
|
||||
}
|
||||
}
|
||||
|
||||
abstract public String getMetaType();
|
||||
|
||||
public String getTypeDeclaration() {
|
||||
return type;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen.annotation;
|
||||
|
||||
import org.hibernate.jpamodelgen.IMetaCollection;
|
||||
|
||||
import javax.lang.model.element.Element;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Max Andersen
|
||||
* @author Hardy Ferentschik
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
public class MetaCollection extends MetaAttribute implements IMetaCollection {
|
||||
|
||||
private String collectionType;
|
||||
|
||||
|
||||
public MetaCollection(MetaEntity parent, Element element, String collectionType, String elementType) {
|
||||
super(parent, element, elementType);
|
||||
this.collectionType = collectionType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMetaType() {
|
||||
return collectionType;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,433 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen.annotation;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import javax.annotation.processing.ProcessingEnvironment;
|
||||
import javax.lang.model.element.AnnotationMirror;
|
||||
import javax.lang.model.element.Element;
|
||||
import javax.lang.model.element.ElementKind;
|
||||
import javax.lang.model.element.Name;
|
||||
import javax.lang.model.element.PackageElement;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
import javax.lang.model.element.Modifier;
|
||||
import javax.lang.model.type.DeclaredType;
|
||||
import javax.lang.model.type.ExecutableType;
|
||||
import javax.lang.model.type.PrimitiveType;
|
||||
import javax.lang.model.type.TypeMirror;
|
||||
import javax.lang.model.util.ElementFilter;
|
||||
import javax.lang.model.util.SimpleTypeVisitor6;
|
||||
import javax.persistence.EmbeddedId;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.AccessType;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.MappedSuperclass;
|
||||
import javax.persistence.Transient;
|
||||
import javax.persistence.Embedded;
|
||||
import javax.persistence.Embeddable;
|
||||
import javax.persistence.Access;
|
||||
import javax.persistence.ElementCollection;
|
||||
import javax.tools.Diagnostic.Kind;
|
||||
import javax.tools.Diagnostic;
|
||||
|
||||
import org.hibernate.jpamodelgen.IMetaEntity;
|
||||
import org.hibernate.jpamodelgen.IMetaAttribute;
|
||||
import org.hibernate.jpamodelgen.ImportContext;
|
||||
import org.hibernate.jpamodelgen.ImportContextImpl;
|
||||
import org.hibernate.jpamodelgen.TypeUtils;
|
||||
import org.hibernate.jpamodelgen.Context;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Max Andersen
|
||||
* @author Hardy Ferentschik
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
public class MetaEntity implements IMetaEntity {
|
||||
|
||||
final TypeElement element;
|
||||
final protected ProcessingEnvironment pe;
|
||||
|
||||
final ImportContext importContext;
|
||||
private Context context;
|
||||
//used to propagate the access type of the root entity over to subclasses, superclasses and embeddable
|
||||
private AccessType defaultAccessTypeForHierarchy;
|
||||
private AccessType defaultAccessTypeForElement;
|
||||
|
||||
public MetaEntity(ProcessingEnvironment pe, TypeElement element, Context context) {
|
||||
this.element = element;
|
||||
this.pe = pe;
|
||||
importContext = new ImportContextImpl( getPackageName() );
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
public MetaEntity(ProcessingEnvironment pe, TypeElement element, Context context, AccessType accessType) {
|
||||
this(pe, element, context);
|
||||
this.defaultAccessTypeForHierarchy = accessType;
|
||||
}
|
||||
|
||||
public String getSimpleName() {
|
||||
return element.getSimpleName().toString();
|
||||
}
|
||||
|
||||
public Element getOriginalElement() {
|
||||
return element;
|
||||
}
|
||||
|
||||
public String getQualifiedName() {
|
||||
return element.getQualifiedName().toString();
|
||||
}
|
||||
|
||||
public String getPackageName() {
|
||||
PackageElement packageOf = pe.getElementUtils().getPackageOf( element );
|
||||
return pe.getElementUtils().getName( packageOf.getQualifiedName() ).toString();
|
||||
}
|
||||
|
||||
public List<IMetaAttribute> getMembers() {
|
||||
List<IMetaAttribute> membersFound = new ArrayList<IMetaAttribute>();
|
||||
final AccessType elementAccessType = getAccessTypeForElement();
|
||||
|
||||
List<? extends Element> fieldsOfClass = ElementFilter.fieldsIn( element.getEnclosedElements() );
|
||||
addPersistentMembers( membersFound, elementAccessType, fieldsOfClass, AccessType.FIELD );
|
||||
|
||||
List<? extends Element> methodsOfClass = ElementFilter.methodsIn( element.getEnclosedElements() );
|
||||
addPersistentMembers( membersFound, elementAccessType, methodsOfClass, AccessType.PROPERTY );
|
||||
|
||||
//process superclasses
|
||||
for(TypeElement superclass = TypeUtils.getSuperclass(element) ;
|
||||
superclass != null ;
|
||||
superclass = TypeUtils.getSuperclass( superclass ) ) {
|
||||
if ( superclass.getAnnotation( Entity.class ) != null ) {
|
||||
break; //will be handled or has been handled already
|
||||
}
|
||||
else if ( superclass.getAnnotation( MappedSuperclass.class ) != null ) {
|
||||
//FIXME use the class defalut access type
|
||||
context.processElement( superclass, defaultAccessTypeForHierarchy );
|
||||
}
|
||||
}
|
||||
|
||||
//this is valid to not have properties (ie subentities)
|
||||
// if ( membersFound.size() == 0 ) {
|
||||
// pe.getMessager().printMessage( Kind.WARNING, "No properties found on " + element, element );
|
||||
// }
|
||||
return membersFound;
|
||||
}
|
||||
|
||||
private void addPersistentMembers(
|
||||
List<IMetaAttribute> membersFound,
|
||||
AccessType elementAccessType,
|
||||
List<? extends Element> membersOfClass,
|
||||
AccessType membersKind) {
|
||||
pe.getMessager()
|
||||
.printMessage( Kind.NOTE, "Scanning " + membersOfClass.size() + " " + membersKind + " for " + element.toString() );
|
||||
AccessType explicitAccessType;
|
||||
if (elementAccessType == membersKind) {
|
||||
//all membersKind considered
|
||||
explicitAccessType = null;
|
||||
}
|
||||
else {
|
||||
//use membersKind only if marked with @Access(membersKind)
|
||||
explicitAccessType = membersKind;
|
||||
}
|
||||
for ( Element memberOfClass : membersOfClass ) {
|
||||
|
||||
MetaAttribute result = memberOfClass.asType().accept( new TypeVisitor( this, explicitAccessType ),
|
||||
memberOfClass
|
||||
);
|
||||
if ( result != null ) {
|
||||
membersFound.add( result );
|
||||
}
|
||||
//EBE not sure why?
|
||||
// else {
|
||||
// pe.getMessager().printMessage( Kind.WARNING, "Could not find valid info for JPA property", mymember );
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
private AccessType getAccessTypeForElement() {
|
||||
|
||||
//get local strategy
|
||||
AccessType accessType = getAccessTypeForClass(element);
|
||||
if (accessType == null) {
|
||||
accessType = this.defaultAccessTypeForHierarchy;
|
||||
}
|
||||
if (accessType == null) {
|
||||
//we dont' know
|
||||
//if an enity go up
|
||||
//
|
||||
//superclasses alre always treated after their entities
|
||||
//and their access type are discovered
|
||||
//FIXME is it really true if only the superclass is changed
|
||||
TypeElement superClass = element;
|
||||
do {
|
||||
superClass = TypeUtils.getSuperclass( superClass );
|
||||
if (superClass != null) {
|
||||
if ( superClass.getAnnotation( Entity.class ) != null
|
||||
|| superClass.getAnnotation( MappedSuperclass.class ) != null ) {
|
||||
//FIXME make it work for XML
|
||||
AccessType superClassAccessType = getAccessTypeForClass(superClass);
|
||||
//we've reach the root entity and resolved Ids
|
||||
if ( superClassAccessType != null && defaultAccessTypeForHierarchy != null) {
|
||||
break; //we've found it
|
||||
}
|
||||
}
|
||||
else {
|
||||
break; //neither @Entity nor @MappedSuperclass
|
||||
}
|
||||
}
|
||||
}
|
||||
while ( superClass != null );
|
||||
}
|
||||
|
||||
if ( accessType == null ) {
|
||||
accessType = AccessType.PROPERTY; //default to property
|
||||
this.defaultAccessTypeForElement = accessType;
|
||||
}
|
||||
//this is a subclass so caching is OK
|
||||
//this.defaultAccessTypeForHierarchy = accessType;
|
||||
context.addAccessType( this.element, accessType );
|
||||
this.defaultAccessTypeForElement = accessType;
|
||||
return accessType;
|
||||
}
|
||||
|
||||
private AccessType getAccessTypeForClass(TypeElement searchedElement) {
|
||||
pe.getMessager().printMessage( Diagnostic.Kind.NOTE, "check class" + searchedElement );
|
||||
AccessType accessType = context.getAccessType( searchedElement );
|
||||
|
||||
if (defaultAccessTypeForHierarchy == null) {
|
||||
this.defaultAccessTypeForHierarchy = context.getDefaultAccessTypeForHerarchy( searchedElement );
|
||||
}
|
||||
if ( accessType != null ) {
|
||||
pe.getMessager().printMessage( Diagnostic.Kind.NOTE, "Found in cache" + searchedElement + ":" + accessType );
|
||||
return accessType;
|
||||
}
|
||||
|
||||
/**
|
||||
* when forcing access type, we can only override the defaultAccessTypeForHierarchy
|
||||
* if we are the entity root (identified by having @Id or @EmbeddedId
|
||||
*/
|
||||
final Access accessAnn = searchedElement.getAnnotation( Access.class );
|
||||
AccessType forcedAccessType = accessAnn != null ? accessAnn.value() : null;
|
||||
if ( forcedAccessType != null) {
|
||||
pe.getMessager().printMessage( Diagnostic.Kind.NOTE, "access type " + searchedElement + ":" + forcedAccessType );
|
||||
context.addAccessType( searchedElement, forcedAccessType );
|
||||
}
|
||||
|
||||
//continue nevertheless to check if we are root and if defaultAccessTypeForHierarchy
|
||||
//should be overridden
|
||||
if ( forcedAccessType == null || defaultAccessTypeForHierarchy == null) {
|
||||
List<? extends Element> myMembers = searchedElement.getEnclosedElements();
|
||||
for ( Element subElement : myMembers ) {
|
||||
List<? extends AnnotationMirror> entityAnnotations =
|
||||
pe.getElementUtils().getAllAnnotationMirrors( subElement );
|
||||
|
||||
for ( Object entityAnnotation : entityAnnotations ) {
|
||||
AnnotationMirror annotationMirror = ( AnnotationMirror ) entityAnnotation;
|
||||
|
||||
final String annotationType = annotationMirror.getAnnotationType().toString();
|
||||
|
||||
//FIXME consider XML
|
||||
if ( annotationType.equals( Id.class.getName() )
|
||||
|| annotationType.equals( EmbeddedId.class.getName() ) ) {
|
||||
pe.getMessager().printMessage( Diagnostic.Kind.NOTE, "Found id on" + searchedElement );
|
||||
final ElementKind kind = subElement.getKind();
|
||||
if ( kind == ElementKind.FIELD || kind == ElementKind.METHOD ) {
|
||||
accessType = kind == ElementKind.FIELD ? AccessType.FIELD : AccessType.PROPERTY;
|
||||
//FIXME enlever in niveau
|
||||
if (defaultAccessTypeForHierarchy == null) {
|
||||
this.defaultAccessTypeForHierarchy = context.getDefaultAccessTypeForHerarchy( searchedElement );
|
||||
//we've discovered the class hierarchy, let's cache it
|
||||
if ( defaultAccessTypeForHierarchy == null ) {
|
||||
this.defaultAccessTypeForHierarchy = accessType;
|
||||
context.addAccessTypeForHierarchy( searchedElement, defaultAccessTypeForHierarchy );
|
||||
//FIXME should we add
|
||||
//context.addAccessTypeForHierarchy( element, defaultAccessTypeForHierarchy );
|
||||
}
|
||||
}
|
||||
if ( forcedAccessType == null) {
|
||||
context.addAccessType( searchedElement, accessType );
|
||||
pe.getMessager().printMessage( Diagnostic.Kind.NOTE, "access type " + searchedElement + ":" + accessType );
|
||||
return accessType;
|
||||
}
|
||||
else {
|
||||
return forcedAccessType;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return forcedAccessType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
sb.append( "MetaEntity" );
|
||||
sb.append( "{element=" ).append( element );
|
||||
sb.append( '}' );
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
static Map<String, String> COLLECTIONS = new HashMap<String, String>();
|
||||
|
||||
static {
|
||||
COLLECTIONS.put( "java.util.Collection", "javax.persistence.metamodel.CollectionAttribute" );
|
||||
COLLECTIONS.put( "java.util.Set", "javax.persistence.metamodel.SetAttribute" );
|
||||
COLLECTIONS.put( "java.util.List", "javax.persistence.metamodel.ListAttribute" );
|
||||
COLLECTIONS.put( "java.util.Map", "javax.persistence.metamodel.MapAttribute" );
|
||||
}
|
||||
|
||||
class TypeVisitor extends SimpleTypeVisitor6<MetaAttribute, Element> {
|
||||
|
||||
MetaEntity parent;
|
||||
//if null, process all members as implicit
|
||||
//if not null, only process members marked as @Access(explicitAccessType)
|
||||
private AccessType explicitAccessType;
|
||||
|
||||
TypeVisitor(MetaEntity parent, AccessType explicitAccessType) {
|
||||
this.parent = parent;
|
||||
this.explicitAccessType = explicitAccessType;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected MetaAttribute defaultAction(TypeMirror e, Element p) {
|
||||
return super.defaultAction( e, p );
|
||||
}
|
||||
|
||||
@Override
|
||||
public MetaAttribute visitPrimitive(PrimitiveType t, Element element) {
|
||||
if ( isPersistent( element ) ) {
|
||||
return new MetaSingleAttribute( parent, element, TypeUtils.toTypeString( t ) );
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isPersistent(Element element) {
|
||||
//FIXME consider XML
|
||||
boolean correctAccessType = false;
|
||||
if (this.explicitAccessType == null) {
|
||||
correctAccessType = true;
|
||||
}
|
||||
else {
|
||||
final Access accessAnn = element.getAnnotation( Access.class );
|
||||
if ( accessAnn != null && explicitAccessType.equals( accessAnn.value() ) ) {
|
||||
correctAccessType = true;
|
||||
}
|
||||
}
|
||||
return correctAccessType
|
||||
&& element.getAnnotation( Transient.class ) == null
|
||||
&& !element.getModifiers().contains( Modifier.TRANSIENT )
|
||||
&& !element.getModifiers().contains( Modifier.STATIC );
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public MetaAttribute visitDeclared(DeclaredType t, Element element) {
|
||||
//FIXME consider XML
|
||||
if ( isPersistent( element ) ) {
|
||||
TypeElement returnedElement = ( TypeElement ) pe.getTypeUtils().asElement( t );
|
||||
String collection = COLLECTIONS.get( returnedElement.getQualifiedName().toString() ); // WARNING: .toString() is necessary here since Name equals does not compare to String
|
||||
|
||||
if ( collection != null ) {
|
||||
//collection of element
|
||||
if ( element.getAnnotation( ElementCollection.class ) != null ) {
|
||||
final TypeMirror collectionType = t.getTypeArguments().get( 0 );
|
||||
final TypeElement collectionElement = ( TypeElement ) pe.getTypeUtils().asElement( collectionType );
|
||||
this.parent.context.processElement( collectionElement,
|
||||
this.parent.defaultAccessTypeForElement );
|
||||
}
|
||||
if ( collection.equals( "javax.persistence.metamodel.MapAttribute" ) ) {
|
||||
return new MetaMap( parent, element, collection, getKeyType( t ), getElementType( t ) );
|
||||
}
|
||||
else {
|
||||
return new MetaCollection( parent, element, collection, getElementType( t ) );
|
||||
}
|
||||
}
|
||||
else {
|
||||
//FIXME Consider XML
|
||||
if ( element.getAnnotation( Embedded.class ) != null
|
||||
|| returnedElement.getAnnotation( Embeddable.class ) != null ) {
|
||||
this.parent.context.processElement( returnedElement,
|
||||
this.parent.defaultAccessTypeForElement );
|
||||
}
|
||||
return new MetaSingleAttribute( parent, element, returnedElement.getQualifiedName().toString() );
|
||||
}
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public MetaAttribute visitExecutable(ExecutableType t, Element p) {
|
||||
String string = p.getSimpleName().toString();
|
||||
|
||||
// TODO: implement proper property get/is/boolean detection
|
||||
if ( string.startsWith( "get" ) || string.startsWith( "is" ) ) {
|
||||
TypeMirror returnType = t.getReturnType();
|
||||
|
||||
return returnType.accept( this, p );
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public String generateImports() {
|
||||
return importContext.generateImports();
|
||||
}
|
||||
|
||||
public String importType(String fqcn) {
|
||||
return importContext.importType( fqcn );
|
||||
}
|
||||
|
||||
public String staticImport(String fqcn, String member) {
|
||||
return importContext.staticImport( fqcn, member );
|
||||
}
|
||||
|
||||
public String importType(Name qualifiedName) {
|
||||
return importType( qualifiedName.toString() );
|
||||
}
|
||||
|
||||
public TypeElement getTypeElement() {
|
||||
return element;
|
||||
}
|
||||
|
||||
private String getKeyType(DeclaredType t) {
|
||||
return t.getTypeArguments().get( 0 ).toString();
|
||||
}
|
||||
|
||||
|
||||
private String getElementType(DeclaredType declaredType) {
|
||||
if ( declaredType.getTypeArguments().size() == 1 ) {
|
||||
return declaredType.getTypeArguments().get( 0 ).toString();
|
||||
}
|
||||
else {
|
||||
return declaredType.getTypeArguments().get( 1 ).toString();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen.annotation;
|
||||
|
||||
import javax.lang.model.element.Element;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Max Andersen
|
||||
* @author Hardy Ferentschik
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
public class MetaMap extends MetaCollection {
|
||||
|
||||
private final String keyType;
|
||||
|
||||
public MetaMap(MetaEntity parent, Element element, String collectionType,
|
||||
String keyType, String elementType) {
|
||||
super(parent, element, collectionType, elementType);
|
||||
this.keyType = keyType;
|
||||
}
|
||||
|
||||
public String getDeclarationString() {
|
||||
return "public static volatile " + parent.importType(getMetaType()) + "<" + parent.importType(parent.getQualifiedName()) + ", " + parent.importType(keyType) + ", " + parent.importType(getTypeDeclaration()) + "> " + getPropertyName() + ";";
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen.annotation;
|
||||
|
||||
import org.hibernate.jpamodelgen.IMetaSingleAttribute;
|
||||
|
||||
import javax.lang.model.element.Element;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Max Andersen
|
||||
* @author Hardy Ferentschik
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
public class MetaSingleAttribute extends MetaAttribute implements IMetaSingleAttribute {
|
||||
|
||||
public MetaSingleAttribute(MetaEntity parent, Element element, String type) {
|
||||
super(parent, element, type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMetaType() {
|
||||
return "javax.persistence.metamodel.SingularAttribute";
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.hibernate.jpamodelgen.xml;
|
||||
|
||||
import org.hibernate.jpamodelgen.IMetaAttribute;
|
||||
|
||||
/**
|
||||
* @author Hardy Ferentschik
|
||||
*/
|
||||
public abstract class XmlMetaAttribute implements IMetaAttribute {
|
||||
|
||||
private XmlMetaEntity parentEntity;
|
||||
|
||||
private String propertyName;
|
||||
|
||||
private String type;
|
||||
|
||||
XmlMetaAttribute(XmlMetaEntity parent, String propertyName, String type) {
|
||||
this.parentEntity = parent;
|
||||
this.propertyName = propertyName;
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getDeclarationString() {
|
||||
return "public static volatile " + parentEntity.importType(getMetaType()) + "<" + parentEntity.importType(parentEntity.getQualifiedName()) + ", " + parentEntity.importType(getTypeDeclaration()) + "> " + getPropertyName() + ";";
|
||||
}
|
||||
|
||||
public String getPropertyName() {
|
||||
return propertyName;
|
||||
}
|
||||
|
||||
public String getTypeDeclaration() {
|
||||
return type;
|
||||
}
|
||||
|
||||
@Override
|
||||
abstract public String getMetaType();
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen.xml;
|
||||
|
||||
import org.hibernate.jpamodelgen.IMetaCollection;
|
||||
|
||||
/**
|
||||
* @author Hardy Ferentschik
|
||||
*/
|
||||
public class XmlMetaCollection extends XmlMetaAttribute implements IMetaCollection {
|
||||
|
||||
String collectionType;
|
||||
|
||||
public XmlMetaCollection(XmlMetaEntity parent, String propertyName, String type, String collectionType) {
|
||||
super(parent, propertyName, type);
|
||||
this.collectionType = collectionType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMetaType() {
|
||||
return collectionType;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,255 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen.xml;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import javax.lang.model.element.Element;
|
||||
import javax.lang.model.element.Name;
|
||||
import javax.lang.model.element.TypeElement;
|
||||
import javax.lang.model.type.DeclaredType;
|
||||
|
||||
import org.hibernate.jpamodelgen.IMetaAttribute;
|
||||
import org.hibernate.jpamodelgen.ImportContextImpl;
|
||||
import org.hibernate.jpamodelgen.IMetaEntity;
|
||||
import org.hibernate.jpamodelgen.ImportContext;
|
||||
import org.hibernate.jpamodelgen.xml.jaxb.Attributes;
|
||||
import org.hibernate.jpamodelgen.xml.jaxb.Basic;
|
||||
import org.hibernate.jpamodelgen.xml.jaxb.ElementCollection;
|
||||
import org.hibernate.jpamodelgen.xml.jaxb.Embeddable;
|
||||
import org.hibernate.jpamodelgen.xml.jaxb.EmbeddableAttributes;
|
||||
import org.hibernate.jpamodelgen.xml.jaxb.Entity;
|
||||
import org.hibernate.jpamodelgen.xml.jaxb.Id;
|
||||
import org.hibernate.jpamodelgen.xml.jaxb.ManyToOne;
|
||||
import org.hibernate.jpamodelgen.xml.jaxb.MappedSuperclass;
|
||||
import org.hibernate.jpamodelgen.xml.jaxb.OneToMany;
|
||||
import org.hibernate.jpamodelgen.xml.jaxb.OneToOne;
|
||||
|
||||
/**
|
||||
* @author Hardy Ferentschik
|
||||
*/
|
||||
public class XmlMetaEntity implements IMetaEntity {
|
||||
|
||||
static Map<String, String> COLLECTIONS = new HashMap<String, String>();
|
||||
|
||||
static {
|
||||
COLLECTIONS.put( "java.util.Collection", "javax.persistence.metamodel.CollectionAttribute" );
|
||||
COLLECTIONS.put( "java.util.Set", "javax.persistence.metamodel.SetAttribute" );
|
||||
COLLECTIONS.put( "java.util.List", "javax.persistence.metamodel.ListAttribute" );
|
||||
COLLECTIONS.put( "java.util.Map", "javax.persistence.metamodel.MapAttribute" );
|
||||
}
|
||||
|
||||
final private String clazzName;
|
||||
|
||||
final private String packageName;
|
||||
|
||||
final private ImportContext importContext;
|
||||
|
||||
final private List<IMetaAttribute> members = new ArrayList<IMetaAttribute>();
|
||||
|
||||
private TypeElement element;
|
||||
|
||||
public XmlMetaEntity(Entity ormEntity, String packageName, TypeElement element) {
|
||||
this.clazzName = ormEntity.getClazz();
|
||||
this.packageName = packageName;
|
||||
importContext = new ImportContextImpl( getPackageName() );
|
||||
this.element = element;
|
||||
Attributes attributes = ormEntity.getAttributes();
|
||||
|
||||
parseAttributes( attributes );
|
||||
}
|
||||
|
||||
public XmlMetaEntity(MappedSuperclass mappedSuperclass, String packageName, TypeElement element) {
|
||||
this.clazzName = mappedSuperclass.getClazz();
|
||||
this.packageName = packageName;
|
||||
importContext = new ImportContextImpl( getPackageName() );
|
||||
this.element = element;
|
||||
Attributes attributes = mappedSuperclass.getAttributes();
|
||||
|
||||
parseAttributes( attributes );
|
||||
}
|
||||
|
||||
public XmlMetaEntity(Embeddable embeddable, String packageName, TypeElement element) {
|
||||
this.clazzName = embeddable.getClazz();
|
||||
this.packageName = packageName;
|
||||
importContext = new ImportContextImpl( getPackageName() );
|
||||
this.element = element;
|
||||
EmbeddableAttributes attributes = embeddable.getAttributes();
|
||||
|
||||
XmlMetaSingleAttribute attribute;
|
||||
for ( Basic basic : attributes.getBasic() ) {
|
||||
attribute = new XmlMetaSingleAttribute( this, basic.getName(), getType( basic.getName() ) );
|
||||
members.add( attribute );
|
||||
}
|
||||
|
||||
for ( ManyToOne manyToOne : attributes.getManyToOne() ) {
|
||||
attribute = new XmlMetaSingleAttribute( this, manyToOne.getName(), getType( manyToOne.getName() ) );
|
||||
members.add( attribute );
|
||||
}
|
||||
|
||||
for ( OneToOne oneToOne : attributes.getOneToOne() ) {
|
||||
attribute = new XmlMetaSingleAttribute( this, oneToOne.getName(), getType( oneToOne.getName() ) );
|
||||
members.add( attribute );
|
||||
}
|
||||
|
||||
XmlMetaCollection metaCollection;
|
||||
for ( OneToMany oneToMany : attributes.getOneToMany() ) {
|
||||
String[] types = getCollectionType( oneToMany.getName() );
|
||||
metaCollection = new XmlMetaCollection( this, oneToMany.getName(), types[0], types[1] );
|
||||
members.add( metaCollection );
|
||||
}
|
||||
|
||||
for ( ElementCollection collection : attributes.getElementCollection() ) {
|
||||
String[] types = getCollectionType( collection.getName() );
|
||||
metaCollection = new XmlMetaCollection( this, collection.getName(), types[0], types[1] );
|
||||
members.add( metaCollection );
|
||||
}
|
||||
}
|
||||
|
||||
public String getSimpleName() {
|
||||
return clazzName;
|
||||
}
|
||||
|
||||
public String getQualifiedName() {
|
||||
return packageName + "." + getSimpleName();
|
||||
}
|
||||
|
||||
public String getPackageName() {
|
||||
return packageName;
|
||||
}
|
||||
|
||||
public List<IMetaAttribute> getMembers() {
|
||||
return members;
|
||||
}
|
||||
|
||||
public String generateImports() {
|
||||
return importContext.generateImports();
|
||||
}
|
||||
|
||||
public String importType(String fqcn) {
|
||||
return importContext.importType( fqcn );
|
||||
}
|
||||
|
||||
public String staticImport(String fqcn, String member) {
|
||||
return importContext.staticImport( fqcn, member );
|
||||
}
|
||||
|
||||
public String importType(Name qualifiedName) {
|
||||
return importType( qualifiedName.toString() );
|
||||
}
|
||||
|
||||
public TypeElement getTypeElement() {
|
||||
return element;
|
||||
}
|
||||
|
||||
private String[] getCollectionType(String propertyName) {
|
||||
String types[] = new String[2];
|
||||
for ( Element elem : element.getEnclosedElements() ) {
|
||||
if ( elem.getSimpleName().toString().equals( propertyName ) ) {
|
||||
DeclaredType type = ( ( DeclaredType ) elem.asType() );
|
||||
types[0] = type.getTypeArguments().get( 0 ).toString();
|
||||
types[1] = COLLECTIONS.get( type.asElement().toString() );
|
||||
}
|
||||
}
|
||||
return types;
|
||||
}
|
||||
|
||||
private String getType(String propertyName) {
|
||||
String typeName = null;
|
||||
for ( Element elem : element.getEnclosedElements() ) {
|
||||
if ( elem.getSimpleName().toString().equals( propertyName ) ) {
|
||||
switch ( elem.asType().getKind() ) {
|
||||
case INT: {
|
||||
typeName = "java.lang.Integer";
|
||||
break;
|
||||
}
|
||||
case LONG: {
|
||||
typeName = "java.lang.Long";
|
||||
break;
|
||||
}
|
||||
case BOOLEAN: {
|
||||
typeName = "java.lang.Boolean";
|
||||
break;
|
||||
}
|
||||
case DECLARED: {
|
||||
typeName = elem.asType().toString();
|
||||
break;
|
||||
}
|
||||
case TYPEVAR: {
|
||||
typeName = elem.asType().toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return typeName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
sb.append( "XmlMetaEntity" );
|
||||
sb.append( "{type=" ).append( element );
|
||||
sb.append( '}' );
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private void parseAttributes(Attributes attributes) {
|
||||
XmlMetaSingleAttribute attribute;
|
||||
|
||||
if ( !attributes.getId().isEmpty() ) {
|
||||
// TODO what do we do if there are more than one id nodes?
|
||||
Id id = attributes.getId().get( 0 );
|
||||
attribute = new XmlMetaSingleAttribute(
|
||||
this, id.getName(), getType( id.getName() )
|
||||
);
|
||||
members.add( attribute );
|
||||
}
|
||||
|
||||
for ( Basic basic : attributes.getBasic() ) {
|
||||
attribute = new XmlMetaSingleAttribute( this, basic.getName(), getType( basic.getName() ) );
|
||||
members.add( attribute );
|
||||
}
|
||||
|
||||
for ( ManyToOne manyToOne : attributes.getManyToOne() ) {
|
||||
attribute = new XmlMetaSingleAttribute( this, manyToOne.getName(), getType( manyToOne.getName() ) );
|
||||
members.add( attribute );
|
||||
}
|
||||
|
||||
for ( OneToOne oneToOne : attributes.getOneToOne() ) {
|
||||
attribute = new XmlMetaSingleAttribute( this, oneToOne.getName(), getType( oneToOne.getName() ) );
|
||||
members.add( attribute );
|
||||
}
|
||||
|
||||
XmlMetaCollection metaCollection;
|
||||
for ( OneToMany oneToMany : attributes.getOneToMany() ) {
|
||||
String[] types = getCollectionType( oneToMany.getName() );
|
||||
metaCollection = new XmlMetaCollection( this, oneToMany.getName(), types[0], types[1] );
|
||||
members.add( metaCollection );
|
||||
}
|
||||
|
||||
for ( ElementCollection collection : attributes.getElementCollection() ) {
|
||||
String[] types = getCollectionType( collection.getName() );
|
||||
metaCollection = new XmlMetaCollection( this, collection.getName(), types[0], types[1] );
|
||||
members.add( metaCollection );
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.hibernate.jpamodelgen.xml;
|
||||
|
||||
import org.hibernate.jpamodelgen.IMetaSingleAttribute;
|
||||
|
||||
/**
|
||||
* @author Hardy Ferentschik
|
||||
*/
|
||||
public class XmlMetaSingleAttribute extends XmlMetaAttribute implements IMetaSingleAttribute {
|
||||
|
||||
public XmlMetaSingleAttribute(XmlMetaEntity parent, String propertyName, String type) {
|
||||
super(parent, propertyName, type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMetaType() {
|
||||
return "javax.persistence.metamodel.SingularAttribute";
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,247 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- persistence.xml schema -->
|
||||
<xsd:schema targetNamespace="http://java.sun.com/xml/ns/persistence"
|
||||
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:persistence="http://java.sun.com/xml/ns/persistence"
|
||||
elementFormDefault="qualified"
|
||||
attributeFormDefault="unqualified"
|
||||
version="2.0">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
@(#)persistence_2_0.xsd 1.0 August 27 2008
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:annotation>
|
||||
<xsd:documentation><![CDATA[
|
||||
This is the XML Schema for the persistence configuration file.
|
||||
The file must be named "META-INF/persistence.xml" in the
|
||||
persistence archive.
|
||||
Persistence configuration files must indicate
|
||||
the persistence schema by using the persistence namespace:
|
||||
http://java.sun.com/xml/ns/persistence
|
||||
and indicate the version of the schema by
|
||||
using the version element as shown below:
|
||||
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
|
||||
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
|
||||
version="2.0">
|
||||
...
|
||||
</persistence>
|
||||
]]></xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:simpleType name="versionType">
|
||||
<xsd:restriction base="xsd:token">
|
||||
<xsd:pattern value="[0-9]+(\.[0-9]+)*"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:element name="persistence">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:element name="persistence-unit"
|
||||
minOccurs="1" maxOccurs="unbounded">
|
||||
<xsd:complexType>
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>Configuration of a persistence unit.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:sequence>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:element name="description" type="xsd:string"
|
||||
minOccurs="0">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Description of this persistence unit.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:element name="provider" type="xsd:string"
|
||||
minOccurs="0">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Provider class that supplies EntityManagers for this
|
||||
persistence unit.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:element name="jta-data-source" type="xsd:string"
|
||||
minOccurs="0">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
The container-specific name of the JTA datasource to use.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:element name="non-jta-data-source" type="xsd:string"
|
||||
minOccurs="0">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
The container-specific name of a non-JTA datasource to use.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:element name="mapping-file" type="xsd:string"
|
||||
minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>File containing mapping information. Loaded as a resource
|
||||
by the persistence provider.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:element name="jar-file" type="xsd:string"
|
||||
minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Jar file that should be scanned for entities.
|
||||
Not applicable to Java SE persistence units.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:element name="class" type="xsd:string"
|
||||
minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Class to scan for annotations. It should be annotated
|
||||
with either @Entity, @Embeddable or @MappedSuperclass.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:element name="exclude-unlisted-classes" type="xsd:boolean"
|
||||
default="false" minOccurs="0">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
When set to true then only listed classes and jars will
|
||||
be scanned for persistent classes, otherwise the enclosing
|
||||
jar or directory will also be scanned. Not applicable to
|
||||
Java SE persistence units.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:element name="caching"
|
||||
type="persistence:persistence-unit-caching-type"
|
||||
minOccurs="0">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Defines whether caching is enabled for the
|
||||
persistence unit if caching is supported by the
|
||||
persistence provider. When set to ALL, all entities
|
||||
will be cached. When set to NONE, no entities will
|
||||
be cached. When set to ENABLE_SELECTIVE, only entities
|
||||
specified as cacheable will be cached. When set toDISABLE_SELECTIVE, entities specified as not cacheable
|
||||
will not be cached.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:element
|
||||
name="validation-mode"
|
||||
type="persistence:persistence-unit-validation-mode-type"
|
||||
minOccurs="0">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Specifies the validation mode to be used for the
|
||||
persistence unit.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:element name="properties" minOccurs="0">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
A list of vendor-specific properties.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="property"
|
||||
minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
A name-value pair.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="name" type="xsd:string"
|
||||
use="required"/>
|
||||
<xsd:attribute name="value" type="xsd:string"
|
||||
use="required"/>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:sequence>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:attribute name="name" type="xsd:string" use="required">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Name used in code to reference this persistence unit.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation></xsd:attribute>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:attribute name="transaction-type"
|
||||
type="persistence:persistence-unit-transaction-type">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
Type of transactions used by EntityManagers from this
|
||||
persistence unit.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:attribute>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="version" type="persistence:versionType"
|
||||
fixed="2.0" use="required"/>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:simpleType name="persistence-unit-transaction-type">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
public enum TransactionType { JTA, RESOURCE_LOCAL };
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:restriction base="xsd:token">
|
||||
<xsd:enumeration value="JTA"/>
|
||||
<xsd:enumeration value="RESOURCE_LOCAL"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:simpleType name="persistence-unit-caching-type">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
public enum CachingType { ALL, NONE, ENABLE_SELECTIVE,
|
||||
DISABLE_SELECTIVE};
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:restriction base="xsd:token">
|
||||
<xsd:enumeration value="ALL"/>
|
||||
<xsd:enumeration value="NONE"/>
|
||||
<xsd:enumeration value="ENABLE_SELECTIVE"/>
|
||||
<xsd:enumeration value="DISABLE_SELECTIVE"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
<!-- **************************************************** -->
|
||||
<xsd:simpleType name="persistence-unit-validation-mode-type">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>public enum ValidationMode { AUTO, CALLBACK, NONE};
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
<xsd:restriction base="xsd:token">
|
||||
<xsd:enumeration value="AUTO"/>
|
||||
<xsd:enumeration value="CALLBACK"/>
|
||||
<xsd:enumeration value="NONE"/>
|
||||
</xsd:restriction>
|
||||
</xsd:simpleType>
|
||||
</xsd:schema>
|
|
@ -0,0 +1,71 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import java.util.Set;
|
||||
import javax.persistence.Embeddable;
|
||||
import javax.persistence.Access;
|
||||
import javax.persistence.AccessType;
|
||||
import javax.persistence.ElementCollection;
|
||||
import javax.persistence.CollectionTable;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Embeddable
|
||||
@Access(javax.persistence.AccessType.PROPERTY)
|
||||
public class Address {
|
||||
private String street1;
|
||||
private String city;
|
||||
private Country country;
|
||||
private Set<Inhabitant> inhabitants;
|
||||
|
||||
public String getStreet1() {
|
||||
return street1;
|
||||
}
|
||||
|
||||
public void setStreet1(String street1) {
|
||||
this.street1 = street1;
|
||||
}
|
||||
|
||||
public String getCity() {
|
||||
return city;
|
||||
}
|
||||
|
||||
public void setCity(String city) {
|
||||
this.city = city;
|
||||
}
|
||||
|
||||
public Country getCountry() {
|
||||
return country;
|
||||
}
|
||||
|
||||
public void setCountry(Country country) {
|
||||
this.country = country;
|
||||
}
|
||||
|
||||
@ElementCollection
|
||||
@CollectionTable(name = "Add_Inh")
|
||||
public Set<Inhabitant> getInhabitants() {
|
||||
return inhabitants;
|
||||
}
|
||||
|
||||
public void setInhabitants(Set<Inhabitant> inhabitants) {
|
||||
this.inhabitants = inhabitants;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import javax.persistence.MappedSuperclass;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@MappedSuperclass
|
||||
public class Area {
|
||||
private int length;
|
||||
private int width;
|
||||
private int height;
|
||||
|
||||
//should not be persistent
|
||||
public int getVolume() {
|
||||
return length*width*height;
|
||||
}
|
||||
|
||||
public int getLength() {
|
||||
return length;
|
||||
}
|
||||
|
||||
public void setLength(int length) {
|
||||
this.length = length;
|
||||
}
|
||||
|
||||
public int getWidth() {
|
||||
return width;
|
||||
}
|
||||
|
||||
public void setWidth(int width) {
|
||||
this.width = width;
|
||||
}
|
||||
|
||||
public int getHeight() {
|
||||
return height;
|
||||
}
|
||||
|
||||
public void setHeight(int height) {
|
||||
this.height = height;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import javax.persistence.MappedSuperclass;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@MappedSuperclass
|
||||
public class Building extends Area {
|
||||
private Address address;
|
||||
|
||||
public Address getAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
public void setAddress(Address address) {
|
||||
this.address = address;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import javax.persistence.Embeddable;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Embeddable
|
||||
public class Country {
|
||||
String name;
|
||||
String iso2Code;
|
||||
String nonPersistent;
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getIso2Code() {
|
||||
return iso2Code;
|
||||
}
|
||||
|
||||
public void setIso2Code(String iso2Code) {
|
||||
this.iso2Code = iso2Code;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import java.util.Set;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.OneToMany;
|
||||
import javax.persistence.Access;
|
||||
import javax.persistence.AccessType;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Entity
|
||||
public class Customer extends User {
|
||||
private Set<Order> orders;
|
||||
private String nonPersistent;
|
||||
|
||||
@Access(AccessType.FIELD)
|
||||
boolean goodPayer;
|
||||
|
||||
public Set<Order> getOrders() {
|
||||
return orders;
|
||||
}
|
||||
|
||||
@OneToMany
|
||||
public void setOrders(Set<Order> orders) {
|
||||
this.orders = orders;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import javax.persistence.Embeddable;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Embeddable
|
||||
public class Detail {
|
||||
Integer length;
|
||||
Integer width;
|
||||
Integer height;
|
||||
Integer nonPersistent;
|
||||
|
||||
public Integer getLength() {
|
||||
return length;
|
||||
}
|
||||
|
||||
public void setLength(Integer length) {
|
||||
this.length = length;
|
||||
}
|
||||
|
||||
public Integer getWidth() {
|
||||
return width;
|
||||
}
|
||||
|
||||
public void setWidth(Integer width) {
|
||||
this.width = width;
|
||||
}
|
||||
|
||||
public Integer getHeight() {
|
||||
return height;
|
||||
}
|
||||
|
||||
public void setHeight(Integer height) {
|
||||
this.height = height;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Access;
|
||||
import javax.persistence.AccessType;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Entity
|
||||
@Access(javax.persistence.AccessType.FIELD)
|
||||
public class Hominidae extends Mammals {
|
||||
private int intelligence;
|
||||
|
||||
public int getIntelligence() {
|
||||
return intelligence;
|
||||
}
|
||||
|
||||
public void setIntelligence(int intelligence) {
|
||||
this.intelligence = intelligence;
|
||||
}
|
||||
|
||||
public int getNonPersistent() {
|
||||
return 0;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Entity;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Entity
|
||||
public class House extends Building {
|
||||
@Id
|
||||
private Long id;
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Entity
|
||||
public class Human extends Hominidae {
|
||||
private int nonPersistent;
|
||||
private String name;
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import java.util.Set;
|
||||
import javax.persistence.Embeddable;
|
||||
import javax.persistence.Access;
|
||||
import javax.persistence.AccessType;
|
||||
import javax.persistence.ElementCollection;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Embeddable
|
||||
@Access(javax.persistence.AccessType.FIELD)
|
||||
public class Inhabitant {
|
||||
private String name;
|
||||
@ElementCollection
|
||||
private Set<Pet> pets;
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,94 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.OneToMany;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Max Andersen
|
||||
* @author Hardy Ferentschik
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Entity
|
||||
public class Item {
|
||||
|
||||
long _id;
|
||||
|
||||
int _quantity;
|
||||
|
||||
Product _product;
|
||||
|
||||
Order _order;
|
||||
|
||||
Detail detail;
|
||||
|
||||
@Id
|
||||
public long getId() {
|
||||
return _id;
|
||||
}
|
||||
|
||||
public void setId(long id) {
|
||||
this._id = id;
|
||||
}
|
||||
|
||||
public int getQuantity() {
|
||||
return _quantity;
|
||||
}
|
||||
|
||||
public void setQuantity(int quantity) {
|
||||
this._quantity = quantity;
|
||||
}
|
||||
|
||||
@ManyToOne
|
||||
public Product getProduct() {
|
||||
return _product;
|
||||
}
|
||||
|
||||
public void setProduct(Product product) {
|
||||
this._product = product;
|
||||
}
|
||||
|
||||
@ManyToOne
|
||||
public Order getOrder() {
|
||||
return _order;
|
||||
}
|
||||
|
||||
public void setOrder(Order order) {
|
||||
this._order = order;
|
||||
}
|
||||
|
||||
@OneToMany
|
||||
public Map<String, Order> getNamedOrders() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Detail getDetail() {
|
||||
return detail;
|
||||
}
|
||||
|
||||
public void setDetail(Detail detail) {
|
||||
this.detail = detail;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import javax.persistence.MappedSuperclass;
|
||||
import javax.persistence.Access;
|
||||
import javax.persistence.AccessType;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@MappedSuperclass
|
||||
@Access(javax.persistence.AccessType.FIELD)
|
||||
public class LivingBeing {
|
||||
boolean isReallyAlive;
|
||||
|
||||
public boolean isReallyAlive() {
|
||||
return isReallyAlive;
|
||||
}
|
||||
|
||||
public void setReallyAlive(boolean reallyAlive) {
|
||||
isReallyAlive = reallyAlive;
|
||||
}
|
||||
|
||||
public int nonPersistent() {
|
||||
return 0;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Entity
|
||||
public class Mammals extends LivingBeing {
|
||||
private String id;
|
||||
private String nbrOfMammals;
|
||||
|
||||
@Id
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getNbrOfMammals() {
|
||||
return nbrOfMammals;
|
||||
}
|
||||
|
||||
public void setNbrOfMammals(String nbrOfMammals) {
|
||||
this.nbrOfMammals = nbrOfMammals;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Max Andersen
|
||||
* @author Hardy Ferentschik
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
//@Entity
|
||||
public class Order {
|
||||
|
||||
//@Id
|
||||
long id;
|
||||
|
||||
//@OneToMany
|
||||
Set<Item> items;
|
||||
|
||||
boolean filled;
|
||||
Date date;
|
||||
|
||||
//@OneToMany
|
||||
List<String> notes;
|
||||
|
||||
//@ManyToOne
|
||||
Shop shop;
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import javax.persistence.Embeddable;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Embeddable
|
||||
public class Pet {
|
||||
String name;
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getNonPersistent() {
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.OneToMany;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Max Andersen
|
||||
* @author Hardy Ferentschik
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Entity
|
||||
public class Product {
|
||||
|
||||
transient String nonPersistent;
|
||||
static String nonPersistent2;
|
||||
|
||||
@Id
|
||||
long id;
|
||||
|
||||
int test;
|
||||
|
||||
String description;
|
||||
BigDecimal price;
|
||||
|
||||
@ManyToOne
|
||||
Shop shop;
|
||||
|
||||
@OneToMany
|
||||
Set<Item> items;
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Max Andersen
|
||||
* @author Hardy Ferentschik
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Entity
|
||||
public class Shop {
|
||||
@Id
|
||||
long id;
|
||||
String name;
|
||||
}
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Transient;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Entity
|
||||
public class User {
|
||||
private Long id;
|
||||
private String nonPersistent;
|
||||
private String name;
|
||||
|
||||
@Id
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
@Transient
|
||||
public String getNonPersistent() {
|
||||
return nonPersistent;
|
||||
}
|
||||
|
||||
public void setNonPersistent(String nonPersistent) {
|
||||
this.nonPersistent = nonPersistent;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model.xmlmapped;
|
||||
|
||||
/**
|
||||
* @author Hardy Ferentschik
|
||||
*/
|
||||
public class Address {
|
||||
private String street1;
|
||||
private String city;
|
||||
private String country;
|
||||
|
||||
public String getStreet1() {
|
||||
return street1;
|
||||
}
|
||||
|
||||
public void setStreet1(String street1) {
|
||||
this.street1 = street1;
|
||||
}
|
||||
|
||||
public String getCity() {
|
||||
return city;
|
||||
}
|
||||
|
||||
public void setCity(String city) {
|
||||
this.city = city;
|
||||
}
|
||||
|
||||
public String getCountry() {
|
||||
return country;
|
||||
}
|
||||
|
||||
public void setCountry(String country) {
|
||||
this.country = country;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model.xmlmapped;
|
||||
|
||||
import model.Address;
|
||||
import model.Area;
|
||||
|
||||
/**
|
||||
* @author Hardy Ferentschik
|
||||
*/
|
||||
public class Building extends Area {
|
||||
private Address address;
|
||||
|
||||
public Address getAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
public void setAddress(Address address) {
|
||||
this.address = address;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model.xmlmapped;
|
||||
|
||||
/**
|
||||
* @author Hardy Ferentschik
|
||||
*/
|
||||
public class LivingBeing {
|
||||
boolean isReallyAlive;
|
||||
|
||||
public boolean isReallyAlive() {
|
||||
return isReallyAlive;
|
||||
}
|
||||
|
||||
public void setReallyAlive(boolean reallyAlive) {
|
||||
isReallyAlive = reallyAlive;
|
||||
}
|
||||
|
||||
public int nonPersistent() {
|
||||
return 0;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package model.xmlmapped;
|
||||
|
||||
/**
|
||||
* @author Hardy Ferentschik
|
||||
*/
|
||||
public class Mammal extends LivingBeing {
|
||||
private String id;
|
||||
private String subclass;
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getSubclass() {
|
||||
return subclass;
|
||||
}
|
||||
|
||||
public void setSubclass(String subclass) {
|
||||
this.subclass = subclass;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,94 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package test;
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
import org.testng.Assert;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Test
|
||||
public class AccessTypeTest {
|
||||
|
||||
@Test
|
||||
public void testExcludeTransientFieldAndStatic() throws Exception{
|
||||
absenceOfField( "model.Product_", "nonPersistent" );
|
||||
absenceOfField( "model.Product_", "nonPersistent2" );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDefaultAccessTypeOnEntity() throws Exception{
|
||||
absenceOfField( "model.User_", "nonPersistent" );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDefaultAccessTypeForSubclassOfEntity() throws Exception{
|
||||
absenceOfField( "model.Customer_", "nonPersistent" );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDefaultAccessTypeForEmbeddable() throws Exception{
|
||||
absenceOfField( "model.Detail_", "nonPersistent" );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testInheritedAccessTypeForEmbeddable() throws Exception{
|
||||
absenceOfField( "model.Country_", "nonPersistent" );
|
||||
absenceOfField( "model.Pet_", "nonPersistent", "Colleciton of membeddable not taken care of" );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDefaultAccessTypeForMappedSuperclass() throws Exception{
|
||||
absenceOfField( "model.Detail_", "volume" );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testExplicitAccessTypeAndDefaultFromRootEntity() throws Exception{
|
||||
absenceOfField( "model.LivingBeing_", "nonPersistent", "eplicit access type on mapped superclass" );
|
||||
absenceOfField( "model.Hominidae_", "nonPersistent", "eplicit access type on entity" );
|
||||
absenceOfField( "model.Human_", "nonPersistent", "proper inheritance from root entity access type" );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMemberAccessType() throws Exception{
|
||||
presenceOfField( "model.Customer_", "goodPayer", "access type overriding" );
|
||||
}
|
||||
|
||||
private void absenceOfField(String className, String fieldName) throws ClassNotFoundException {
|
||||
absenceOfField( className, fieldName, "field should not be persistent" );
|
||||
}
|
||||
private void absenceOfField(String className, String fieldName, String errorString) throws ClassNotFoundException {
|
||||
Assert.assertFalse( isFieldHere(className, fieldName), errorString );
|
||||
}
|
||||
|
||||
private void presenceOfField(String className, String fieldName, String errorString) throws ClassNotFoundException {
|
||||
Assert.assertTrue( isFieldHere(className, fieldName), errorString );
|
||||
}
|
||||
|
||||
private boolean isFieldHere(String className, String fieldName) throws ClassNotFoundException {
|
||||
Class<?> user_ = Class.forName( className );
|
||||
try {
|
||||
user_.getField( fieldName );
|
||||
return true;
|
||||
}
|
||||
catch (NoSuchFieldException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package test;
|
||||
|
||||
import org.testng.annotations.Test;
|
||||
import org.testng.Assert;
|
||||
import model.Customer_;
|
||||
import model.User_;
|
||||
import model.House_;
|
||||
import model.Building_;
|
||||
import model.Area_;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Test
|
||||
public class InheritanceTest {
|
||||
@Test
|
||||
public void testSuperEntity() throws Exception {
|
||||
Assert.assertEquals( Customer_.class.getSuperclass(), User_.class,
|
||||
"Entity with super entity should inherit at the metamodel level");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMappedSuperclass() throws Exception {
|
||||
Assert.assertEquals( House_.class.getSuperclass(), Building_.class,
|
||||
"Entity with mapped superclass should inherit at the metamodel level");
|
||||
Assert.assertEquals( Building_.class.getSuperclass(), Area_.class,
|
||||
"mapped superclass with mapped superclass should inherit at the metamodel level");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,166 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package test;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.Set;
|
||||
import javax.persistence.Tuple;
|
||||
import javax.persistence.criteria.CriteriaBuilder;
|
||||
import javax.persistence.criteria.CriteriaQuery;
|
||||
import javax.persistence.criteria.Expression;
|
||||
import javax.persistence.criteria.Join;
|
||||
import static javax.persistence.criteria.JoinType.INNER;
|
||||
import javax.persistence.criteria.ListJoin;
|
||||
import javax.persistence.criteria.Path;
|
||||
import javax.persistence.criteria.Root;
|
||||
|
||||
import model.Item;
|
||||
import model.Item_;
|
||||
import model.Order;
|
||||
import model.Order_;
|
||||
import model.Product;
|
||||
import model.Product_;
|
||||
import model.Shop_;
|
||||
|
||||
/**
|
||||
* Writing queries involves passing typesafe, statically cached, metamodel
|
||||
* objects to the query builder in order to create the various parts of
|
||||
* the query. The typesafe metamodel objects were validated at init time,
|
||||
* so it is impossible to build invalid queries in the application code.
|
||||
*
|
||||
* @author Max Andersen
|
||||
* @author Hardy Ferentschik
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
public class QueryTest {
|
||||
|
||||
CriteriaBuilder qb;
|
||||
|
||||
public void test() {
|
||||
CriteriaQuery<Tuple> q = qb.createTupleQuery();
|
||||
|
||||
Root<Order> order = q.from( Order.class );
|
||||
Join<Item, Product> product = order.join( Order_.items )
|
||||
.join( Item_.product );
|
||||
|
||||
Path<BigDecimal> price = product.get( Product_.price );
|
||||
Path<Boolean> filled = order.get( Order_.filled );
|
||||
Path<Date> date = order.get( Order_.date );
|
||||
|
||||
q.select( qb.tuple( order, product ) )
|
||||
.where( qb.and( qb.gt( price, 100.00 ), qb.not( filled ) ) )
|
||||
.orderBy( qb.asc( price ), qb.desc( date ) );
|
||||
}
|
||||
|
||||
public void testUntypesafe() {
|
||||
CriteriaQuery<Tuple> q = qb.createTupleQuery();
|
||||
|
||||
Root<Order> order = q.from( Order.class );
|
||||
Join<Item, Product> product = order.join( "items" )
|
||||
.join( "product" );
|
||||
|
||||
Path<BigDecimal> price = product.get( "price" );
|
||||
Path<Boolean> filled = order.get( "filled" );
|
||||
Path<Date> date = order.get( "date" );
|
||||
|
||||
q.select( qb.tuple( order, product ) )
|
||||
.where( qb.and( qb.gt( price, 100.00 ), qb.not( filled ) ) )
|
||||
.orderBy( qb.asc( price ), qb.desc( date ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Navigation by joining
|
||||
*/
|
||||
public void test2() {
|
||||
CriteriaQuery<Product> q = qb.createQuery( Product.class );
|
||||
|
||||
Root<Product> product = q.from( Product.class );
|
||||
Join<Item, Order> order = product.join( Product_.items )
|
||||
.join( Item_.order );
|
||||
|
||||
q.select( product )
|
||||
.where( qb.equal( order.get( Order_.id ), 12345l ) );
|
||||
}
|
||||
|
||||
public void testMap() {
|
||||
CriteriaQuery<Item> q = qb.createQuery( Item.class );
|
||||
|
||||
Root<Item> item = q.from( Item.class );
|
||||
item.join( Item_.namedOrders );
|
||||
}
|
||||
|
||||
/**
|
||||
* Navigation by compound Path
|
||||
*/
|
||||
public void test3() {
|
||||
CriteriaQuery<Item> q = qb.createQuery( Item.class );
|
||||
|
||||
Root<Item> item = q.from( Item.class );
|
||||
Path<String> shopName = item.get( Item_.order )
|
||||
.get( Order_.shop )
|
||||
.get( Shop_.name );
|
||||
q.select( item )
|
||||
.where( qb.equal( shopName, "amazon.com" ) );
|
||||
}
|
||||
|
||||
// public void test4() {
|
||||
// CriteriaQuery q = qb.create();
|
||||
//
|
||||
// Root<Order> order = q.from(Order.class);
|
||||
// ListJoin<Order, String> note = order.join(Order_.notes);
|
||||
// Expression<Set<Item>> items = order.get(Order_.items);
|
||||
// order.fetch(Order_.items, JoinType.INNER);
|
||||
//
|
||||
// q.select(note)
|
||||
// .where( qb.and( qb.lt(note.index(), 10), qb.isNotEmpty(items) ) );
|
||||
// }
|
||||
|
||||
public void test4Untypesafe() {
|
||||
CriteriaQuery<String> q = qb.createQuery( String.class );
|
||||
|
||||
Root<Order> order = q.from( Order.class );
|
||||
ListJoin<Order, String> note = order.joinList( "notes" );
|
||||
Expression<Set<Item>> items = order.get( "items" );
|
||||
order.fetch( "items", INNER );
|
||||
|
||||
q.select( note )
|
||||
.where( qb.and( qb.lt( note.index(), 10 ), qb.isNotEmpty( items ) ) );
|
||||
}
|
||||
|
||||
/*public void test5() {
|
||||
Expression<Long> l= null;
|
||||
Expression<Integer> i= null;
|
||||
Expression<Float> x= null;
|
||||
Expression<Float> y= null;
|
||||
|
||||
Expression<Number> n;
|
||||
Expression<Float> f;
|
||||
Expression<String> s = null;
|
||||
|
||||
n = qb.quot(l, i);
|
||||
|
||||
f = qb.sum(x, y);
|
||||
|
||||
n = qb.quot(x, y);
|
||||
|
||||
javax.jpamodelgen.criteria.Order o = qb.asc(n);
|
||||
javax.jpamodelgen.criteria.Order p = qb.ascending(s);
|
||||
}*/
|
||||
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
// $Id$
|
||||
/*
|
||||
* JBoss, Home of Professional Open Source
|
||||
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
|
||||
* by the @authors tag. See the copyright.txt in the distribution for a
|
||||
* full listing of individual contributors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package test;
|
||||
|
||||
import static org.testng.Assert.assertNotNull;
|
||||
import static org.testng.Assert.assertTrue;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
/**
|
||||
* @author Hardy Ferentschik
|
||||
*/
|
||||
public class XmlMappingTest {
|
||||
@Test
|
||||
public void testXmlConfiguredEmbeddedClassGenerated() throws Exception {
|
||||
assertNotNull( Class.forName( "model.xmlmapped.Address_" ) );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testXmlConfiguredMappedSuperclassGenerated() throws Exception {
|
||||
Class<?> building = Class.forName( "model.xmlmapped.Building_" );
|
||||
assertNotNull( building );
|
||||
assertNotNull( building.getField( "address" ) );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testClassHierarchy() throws Exception {
|
||||
Class<?> mammal = Class.forName( "model.xmlmapped.Mammal_" );
|
||||
assertNotNull( mammal );
|
||||
|
||||
Class<?> being = Class.forName( "model.xmlmapped.LivingBeing_" );
|
||||
assertNotNull( being );
|
||||
|
||||
assertTrue( mammal.getSuperclass().equals( being ) );
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = ClassNotFoundException.class)
|
||||
public void testNonExistentMappedClassesGetIgnored() throws Exception {
|
||||
Class.forName( "model.Dummy_" );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
|
||||
version="2.0"
|
||||
>
|
||||
<package>model</package>
|
||||
<entity class="Dummy" access="FIELD" metadata-complete="true"> <!-- Class does not exist -->
|
||||
<attributes>
|
||||
<id name="id"/>
|
||||
</attributes>
|
||||
</entity>
|
||||
</entity-mappings>
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
|
||||
version="1.0"
|
||||
>
|
||||
<package>model</package>
|
||||
<entity class="Airplane" metadata-complete="true" access="PROPERTY">
|
||||
<attributes>
|
||||
<id name="serialNumber"/>
|
||||
</attributes>
|
||||
</entity>
|
||||
</entity-mappings>
|
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
|
||||
version="2.0"
|
||||
>
|
||||
<package>model</package>
|
||||
<entity class="Dummy" access="FIELD" metadata-complete="true"> <!-- Class does not exist -->
|
||||
<attributes>
|
||||
<id name="id"/>
|
||||
</entity>
|
||||
</entity-mappings>
|
|
@ -0,0 +1,29 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
|
||||
version="2.0"
|
||||
>
|
||||
<package>model</package>
|
||||
<!-- default package -->
|
||||
<entity class="Order" access="FIELD" metadata-complete="true"> <!--means ignore annotations-->
|
||||
<attributes>
|
||||
<id name="id">
|
||||
<column name="fld_id"/>
|
||||
</id>
|
||||
<basic name="filled"/>
|
||||
<basic name="date"/>
|
||||
<many-to-one name="shop"/>
|
||||
<one-to-many name="items"
|
||||
target-entity="Item"
|
||||
fetch="EAGER"> <!-- target-entity optional guess the type from the geenric-->
|
||||
<cascade>
|
||||
<cascade-persist/>
|
||||
</cascade>
|
||||
</one-to-many>
|
||||
<element-collection name="notes"/>
|
||||
<!-- new in JPA 2 -->
|
||||
</attributes>
|
||||
</entity>
|
||||
</entity-mappings>
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence.xsd" version="2.0">
|
||||
<persistence-unit name="annotation-processor" transaction-type="JTA">
|
||||
<description>Test persistence unit</description>
|
||||
<mapping-file>/META-INF/dummy.xml</mapping-file>
|
||||
<mapping-file>/META-INF/malformed-mapping-xml.xml</mapping-file>
|
||||
<mapping-file>/META-INF/jpa1-orm.xml</mapping-file>
|
||||
<mapping-file>/model/xmlmapped/address.xml</mapping-file>
|
||||
<mapping-file>/model/xmlmapped/building.xml</mapping-file>
|
||||
<mapping-file>/model/xmlmapped/mammal.xml</mapping-file>
|
||||
</persistence-unit>
|
||||
</persistence>
|
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
|
||||
version="2.0"
|
||||
>
|
||||
<package>model.xmlmapped</package> <!-- default package -->
|
||||
<embeddable class="Address" access="FIELD" metadata-complete="true"> <!--means ignore annotations-->
|
||||
<attributes>
|
||||
<basic name="street1"/>
|
||||
<basic name="city"/>
|
||||
<basic name="country"/>
|
||||
</attributes>
|
||||
</embeddable>
|
||||
</entity-mappings>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
|
||||
version="2.0"
|
||||
>
|
||||
<package>model.xmlmapped</package>
|
||||
<mapped-superclass class="Building" access="FIELD" metadata-complete="true"> <!--means ignore annotations-->
|
||||
<attributes>
|
||||
<one-to-one name="address" fetch="LAZY"/>
|
||||
</attributes>
|
||||
</mapped-superclass>
|
||||
</entity-mappings>
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
|
||||
version="2.0"
|
||||
>
|
||||
<package>model.xmlmapped</package>
|
||||
<entity class="LivingBeing" access="FIELD" metadata-complete="true">
|
||||
<attributes>
|
||||
<basic name="isReallyAlive"/>
|
||||
</attributes>
|
||||
</entity>
|
||||
<entity class="Mammal" access="FIELD" metadata-complete="true">
|
||||
<attributes>
|
||||
<id name="id"/>
|
||||
<basic name="subclass"/>
|
||||
</attributes>
|
||||
</entity>
|
||||
</entity-mappings>
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
|
||||
|
||||
<suite name="Hibernate Model Generator Tests" verbose="1">
|
||||
<test name="Unit tests">
|
||||
<packages>
|
||||
<package name="test"/>
|
||||
</packages>
|
||||
</test>
|
||||
</suite>
|
Loading…
Reference in New Issue